通过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调用故障实例时出错,可设置当前实例重试次数、更换实例重试次数