SpringCloud
2024-02-01 20:25:35 3 举报
AI智能生成
SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。SpringCloud包含了多个子项目,如:服务注册与发现(Eureka),配置中心(Config),全链路监控(Actuator)等。这些子项目可以独立使用,也可以组合使用,以构建出符合实际业务需求的微服务架构系统。SpringCloud通过提供一套完整的微服务解决方案,使得开发者可以更加专注于业务逻辑的开发,而无需过多关注底层的技术细节。
作者其他创作
大纲/内容
Nacos
客户端
通过springBoot自动装配,引入NacosDiscoveryAutoConfiguration
注册NacosAutoServiceRegistration
实现了ApplicationListener,在spring加载完成后,触发onApplicationEvent事件
实现了ApplicationListener,在spring加载完成后,触发onApplicationEvent事件
//进行绑定
public void onApplicationEvent(WebServerInitializedEvent event) {
bind(event);
}
public void onApplicationEvent(WebServerInitializedEvent event) {
bind(event);
}
//定时任务,发送到客户端,心跳机制
beatReactor.addBeatInfo(groupedServiceName, beatInfo);
beatReactor.addBeatInfo(groupedServiceName, beatInfo);
//执行注册
register();
register();
//发送Post请求进行注册
reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);
reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);
包含namespace、groupId、ip、port、临时持久、健康、服务名
//获取服务
ServiceInfo serviceObj = getServiceInfo0(serviceName, clusters);
ServiceInfo serviceObj = getServiceInfo0(serviceName, clusters);
//如果为空,就去更新服务列表
updateServiceNow(serviceName, clusters);
updateServiceNow(serviceName, clusters);
reqApi(UtilAndComs.nacosUrlBase + "/instance/list", params, HttpMethod.GET);
//注册定时任务,获取最新服务列表
scheduleUpdateIfAbsent(serviceName, clusters);
scheduleUpdateIfAbsent(serviceName, clusters);
服务端
//执行注册接口,收到数据
InstanceController.register()
InstanceController.register()
createEmptyService(namespaceId, serviceName, instance.isEphemeral());
int()
//定时任务,每五秒检查一下心跳
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
addInstance(namespaceId, serviceName, instance.isEphemeral(), instance);
//将数据放到队列里面
notifier.addTask(key, DataOperation.CHANGE);
notifier.addTask(key, DataOperation.CHANGE);
定时任务从队列里面获取,然后进行注册
写副本(copyOnWrite),对一致性感知性妥协
写副本(copyOnWrite),对一致性感知性妥协
//获取服务接口
InstanceController.list()
InstanceController.list()
doSrvIpxt(namespaceId, serviceName, agent, clusters, clientIP, udpPort, env, isCheck, app, tenant,
healthyOnly)
healthyOnly)
配置中心
ConfigService.class
Sentinel
Spring自动配置从spring.factory里面加载自动装配,
注册SentinelResourceAspect
注册SentinelResourceAspect
请求发送过来,进行切面处理
entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs());
entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs());
lookProcessChain(resourceWrapper);
寻找在处理链
寻找在处理链
为空就进行构建
SlotChainProvider.newSlotChain();
SlotChainProvider.newSlotChain();
通过SPI加载文件
SpiLoader.loadPrototypeInstanceListSorted(ProcessorSlot.class);
SpiLoader.loadPrototypeInstanceListSorted(ProcessorSlot.class);
chain.entry(context, resourceWrapper, null, count, prioritized, args);
链路调用
链路调用
Feign
远程调用通过添加注解
负载均衡@LoadBalanced(拦截器)
负载均衡@LoadBalanced(拦截器)
通过spi获取自动装配
LoadBalancerAutoConfiguration
LoadBalancerAutoConfiguration
遍历所有的restTemplate,设置拦截器
通过Irule接口进行选择实例
@Bean
public IRule ribbonRule() {
// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
return new NacosRule();
}
有需要自己写一个Rule
public IRule ribbonRule() {
// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
return new NacosRule();
}
有需要自己写一个Rule
ribbon默认是懒加载,第一次调用时候才会初始化实例,
开启饥饿加载
开启饥饿加载
1.调用 通过JDK生成代理对象
2.做一些整合,原生feign不支持MVC注解
3.封装requestTemplate
4.拦截器(校验、参数、日志)
5.基于负载均衡器等发起HTTP协议
2.做一些整合,原生feign不支持MVC注解
3.封装requestTemplate
4.拦截器(校验、参数、日志)
5.基于负载均衡器等发起HTTP协议
优化:HttpClient5
GZIP压缩
GZIP压缩
seata
通过spi引入全局GlobalTransactionScanner
1.,通过代理然后创建拦截器
2.代理方法执行transactionalTemplate.execute
3.开启全局事务beginTransaction(txInfo, tx);
判断你是不是开启者
是的话就通过netty去跟seata沟通,去获取全局xid
三张表 全局事务表,分支事务表
4.成功进行Commit
seata删除session
seata删除全局锁
对RM发起提交请求,删除udlog,RM加入队列,进行删除UNDOLOg
异步提交(在启动初始化时候进行创建多种线程池) 进行删除分支信息,全局Global
seata删除全局锁
对RM发起提交请求,删除udlog,RM加入队列,进行删除UNDOLOg
异步提交(在启动初始化时候进行创建多种线程池) 进行删除分支信息,全局Global
5.失败进行rollback
遍历分支,判断是否是失败,如果失败就删除
其余发起请求进行回滚,RM判断当前与后置镜像是否相同,如果不同判断与前置镜像是否相等,如果有后置相等进行回滚,与前置相等 不管
其余发起请求进行回滚,RM判断当前与后置镜像是否相同,如果不同判断与前置镜像是否相等,如果有后置相等进行回滚,与前置相等 不管
ribbon:
eager‐load:
enabled: true
clients: mall‐order
eager‐load:
enabled: true
clients: mall‐order
底层基于Netty实现的,通讯执行入栈规则,去判断提交还是回滚
0 条评论
下一页