Ribbon原理:
最核心的是 LoadBalancerlnterceptor.intercept 这个拦截器
拦截请求的url进行解析。
请求注册中心,例如:nacos,根据服务名称,会将ip、端口、等信息拿到本地来(注册表),然后去本地查询对应的服务信息,再去调用对应的服务,(ribbon调用服务 默认是轮训调用)
减少库存、加积分等服务启动的时候会往nacos注册中心注册自己的服务信息,例如ip、端口等。
如果添加新的服务,也不需要重启整个系统,新服务启动后会往注册中心nacos中,nacos的动态感知的,ribbon是通过定时任务(心跳的原理),每隔一段时间(不会很久)就去nacos注册中心拉取一次然后覆盖本地。
如果某个服务挂了,每个服务引入nacos包,会定时给注册中心发送心跳,如果服务挂了,就不会给注册中心发心跳了, 注册中心如果 太久没收到发送的心跳,就认为这个服务挂了,就会从注册中心移除这个服务,当ribbon再去nacos注册中心拉取的时候覆盖本地,本地就没有这个服务了,
在某服务挂了期间但是在ribbon还没获取到注册中心最新数据之前,还是有可能会获取并请求这个挂的服务,这种情况会报错,但是报错后ribbon会重试再调用其他服务(集群)。
Ribbon负载均衡策略
IRule
这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。
AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。
RandomRule
看名字就知道,这种负载均衡策略就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象,然后在它重写的choose方法又调用了choose(ILoadBalancer lb, Object key)这个重载的choose方法,在这个重载的choose方法中,每次利用random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。
RoundRobinRule
RoundRobinRule这种负载均衡策略叫做线性轮询负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)函数整体逻辑是这样的:开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX。
RetryRule (在轮询的基础上进行重试)
看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。
WeightedResponseTimeRule( 权重 —nacos的NacosRule ,Nacos还扩展了一个自己的基于配置的权重扩展 )
WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展,WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫DynamicServerWeightTask的定时任务,默认情况下每隔30秒会计算一次各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。
ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule,choose方法还是采用了RoundRobinRule的choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。
BestAvailableRule
BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。
ZoneAvoidanceRule ( 默认规则,复合判断server所在区域的性能和server的可用性选择服务器。 )
ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以AvailabilityPredicate 为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询( RoundRobinRule )的方式从过滤结果中选择一个出来。AvailabilityFilteringRule(先过滤掉故障实例,再选择并发较小的实例)过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
openFeign原理:
最核心的是代理;
当调用某个接口的时候,底层代理对象会将@FeignClient(value ="stock-service") 的value值和接口的@GetMapping("/stock/deduct/{productId}/{stockCount}")值拼接一个可以直接访问的url地址 :http://stock-service/stock/deduct/{productId}/{stockCount}
底层借住ribbon实现服务发现,实现负载均衡去远端调用。
服务限流sentinel
降级后可以将这次信息记录到日志或者数据库单独一个表,通过定时任务去处理这个降级问题
降级操作
sentinel会拦截或者过滤所有的请求,会获取到所有的http请求,对这个这些请求进行处理,放行或者流控
Nacos服务
Nacos服务注册表结构:Map<namespace,Map<group:serviceName, Service>>
通过namespace来区分是开发环境dev还是测试环境test还是生产环境product,通过两个嵌套的map来实现的,外map的key存放环境名称,内map的key是对应的服务名称(分组了)
nacos中服务启动停止的执行流程
nacos是基于spring boot写的一个web项目,其实就是通过暴露一些接口,供其他服务通过http的方式去调用。
关于 Nacos Starter 更多的配置项信息地址:
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
配置项 | Key | 默认值 | 说明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Seata 服务端
分布式事务协调者,通过@GlobalTransactional开启全局事务,产生一个XID,向TC开启一个全局事务,其他子服务使用@Transactional使用本地事务,