springcloud相关笔记整理
Ribbon
restTemplate
getForObject:相当于json格式数据
getForEntity:在数据加上返回的强求头等信息
ribbon=负载均衡+resttemplate的组合
换一种轮询算法怎样换?怎样自己实现一个轮询算法?实现Irule接口
如何替换?
自定义的轮询方法类不能放在@commentScsn能扫描到的地方
然后在主启动类中配置即可
轮询算法原理:
分布式唯一ID生成方法
OpenFeign: 集成了ribbon
使用方法:
1.在主启动类中增加注解@EnableFeignClients
2.直接在接口上定义即可
openfign超时设置:
配置feign日志:
Hystrix
网关
选gateway,丢弃zuul:因为zuul缺少维护,zuul2一直跳票,所有使用springcloud gateway
SpringCloud GateWay使用Webflux中的reactor-netty响应式编程组件,底层使用了netty
路由配置:
通过bean的方式配置:
配置生效时间:
自定义网关过滤器
SpringCloud Config
配置中心的配置:
配置动态刷新:
1.增加监控依赖
2.修改yml,暴露监控端口
3.@RefreshScore注解
4.运维发送请求刷新配置:
此时如果修改了github的配置文件,调用刷新url后本地的项目也会更新配置,如果没有调用refresh接口,则本地项目不会被更新
如果想使用广播的方法,或者指定项目的更新,需要bus的配合
SpringCloudBus
能管理和传播分布式系统间消息,用于广播状态修改,事件推送
使用轻量级的消息代理来构建一个共用的消息主题,并让所有的微服务连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以称为消息总线
ConfigClient实例都监听MQ中同一个topic,当一个服务刷新数据时,将这个消息放入到Topic中,这样其他监听同一topic的服务就能得到通知,就去更新自身的配置
比较合理的是触发服务端的configserver而不是触发其中一个服务
添加方法:
1.增加依赖:增加rabbitmq支持
2.增加rabbitmq的相关配置
3.暴露配置端点
4.所有的客户端需要增加amqp依赖和配置文件
5.对配置服务器调用刷新操作,所有的微服务都会更新配置
动态服务定点通知
Stream:通过中间层Binder屏蔽消息中间件之间的差异
生产者
消费者
消息重复消费: 使用分组
持久化: 如果没有设置分组,则消费者停止的期间会发生消息丢失,如果配置了分组,则消费者重启后会继续消费消息,不会丢失
Sleuth
一整套完成服务跟踪的解决方案,zipkin:页面展示
配置:需要加监控的加上这些配置
Bootstrap.yml,从外部加载配置,是系统级配置,而application.yml是用户级配置,优先级高于application.yml
SpirngcloudAlibaba
Nacos=Eureka+Config+Bus
nacos支持CP和AP模式的切换,如果需要保存服务的一些信息,则需要使用CP模式,否则就是AP模式
Sentinel实现熔断和限流
配置Sentinel
限流注解
如果超过设置的阈值,则会走到配置的熔断方法,如果没有配置熔断方法,则达到阈值后直接抛异常
例外项:
系统规则:从整个系统出发
自定义限流处理逻辑
忽略属性,指定的异常不处理
规则持久化: 因为每次重启应用,sentinel中的规则都会消失,所有需要持久化
持久化到nacos:
增加到nacos的依赖
配置yml
将限流配置到nacos的配置文件中
分布式事务Seata
一次业务操作需要跨多个数据源或需要多个系统进行远程调用,就会产生分布式事务
seata是阿里开源的分布式事务框架,
由一+三的套件组成
全局唯一事务Id
TC-事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚
TM-事务管理器
定义全局事务的范围,开始全局事务,提交或回滚全局事务
RM-资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务的提交或回滚
seata原理
第一阶段
第二阶段
分布式唯一id生成方法
1.使用uuid 缺点: 无序,占用空间大,而且用到数据库做主键的话索引太大,频繁更新的话效率太低
2.使用数据库自增主键 使用replace into,首先尝试插入数据列表,如果列表中已经有数据,则删除后再插入,满足不了高可用,所以不是很合适
3.使用redis生成全局id
redis天生保证原子性,可以使用原子操作INCR和INCRBY
4.使用雪花算法
引入hutool工具包,直接使用,依赖机器时钟,初始值可以传入ip地址