Ribbon

通过RestTemplate发送请求-》

被负载均衡拦截器拦截-》

通过RibbonClientAutoConfiguration自动装配的ILoadBalancer的实现类ZoneAwareLoadBalancer(负载均衡器)实现的选择策略选择服务实例-》

向此实例发送请求

----------------------------

负载均衡器:

BaseLoadBalancer:轮询-线性负载均衡,缺陷:没有区域Zone的概念,所有的实例同出一个defaultZone,在多区域部署的环境下会产生跨区域访问的问题。跨区域访问应该作为本区域相关实例出现故障时的备用选项,而不应该在平时就放任跨区域访问带来的延迟

ZoneAwareLoadBalancer:每个区域都有各自的负载均衡器,它负责维护各自区域的实例清单。实现区域亲和策略,将处于不同机房的实例配置成不同区域值,实现跨区域容错机制:eureka.instance.metadataMap.zone=shanghai

当请求调用某服务时,ZoneAwareLoadBalancer会根据区域无效策略过滤掉不符合的Zone(故障率[断路器断开次数]、平均负载 等),然后使用轮询策略选择一个Zone,采用此Zone的负载均衡器执行选择服务实例的策略

----------------------------

负载均衡策略:

随机策略、轮询策略

权重策略:对轮询策略的扩展,根据实例运行状况(平均响应时间)计算权重,根据权重挑选实例,平均响应时间越小的实例被选中的几率越大

区域无效策略:过滤掉不符合的Zone(故障率[断路器断开次数]、平均负载 等)

权重策略实现大转盘算法实例

管理端配置

实例 A B C D
平均响应时间 10 40 80 100

落盘算法逻辑:

总平均响应时间:10+40+80+100=230

A落盘区间:[0,230-10) -> [0,220)

B落盘区间:[220,220+(230-40)) -> [220,410)

C落盘区间:[410,410+(230-80)) -> [410,560)

D落盘区间:[560,560+(230-100)] -> [560,690]

-------------------------------------

Ribbon调用失败重试

eureka不会立即剔除故障实例,导致ribbon调用故障实例时出错,可设置当前实例重试次数、更换实例重试次数

原文地址:https://www.cnblogs.com/yfzhou528/p/13514258.html