1. @Resource
  2. private LoadBalancerClient loadBalancerClient;
  3. @Resource
  4. private RestTemplate restTemplate;
  5. @GetMapping("/consumer/msg")
  6. public String getProviderMessage() {
  7. //loadBalancerClient.choose()方法会从 Nacos 获取 provider-service 所有可用实例,
  8. //并按负载均衡策略从中选择一个可用实例,封装为 ServiceInstance(服务实例)对象
  9. //结合现有环境既是从192.168.31.111:80、192.168.31.112:80、192.168.31.113:80三个实例中选择一个包装为ServiceInstance
  10. ServiceInstance serviceInstance = loadBalancerClient.choose("provider-service");
  11. //获取服务实例的 IP 地址
  12. String host = serviceInstance.getHost();
  13. //获取服务实例的端口
  14. int port = serviceInstance.getPort();
  15. String result = restTemplate.getForObject("http://" + host + ":" + port + "/provider/msg", String.class);
  16. //输出响应内容
  17. logger.info("provider-service 响应数据:" + result);
  18. return "consumer-service 响应数据:" + result;
  19. }

Ribbon组件

image.png
Ribbon - 图2

  1. image.png
  2. image.png

    【rule】Ribbon负载均衡规则

    image.png
  • 默认ZoneAvoidanceRule

Ribbon配置要注意包的位置
image.png
如果放在原包内,则变为全局配置。

【灰度发布】Ribbon灰度发布

image.png
smurf/GrayRule.java at master · uhasoft/smurf
9-灰度路由分析_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

【权重】让Ribbon支持nacos权重

基于nacos内置的权重算法。
扩展Ribbon支持Nacos权重的三种方式_慕课手记

  1. //nacos自带的负载均衡算法,传入name,返回一个server
  2. Instance instance = discoveryProperties.namingServiceInstance()
  3. .selectOneHealthyInstance(name);

【同机房调用】Ribbon支持nacos同机房调用

区别于nacos discovery namespace 完全隔离。
image.png
nacos内部的负载均衡算法,传入一个list,返回一个实例。

spring.cloud.nacos.discovery.cluster-name 默认default 利用cluster-name来指定机房 spring.cloud.nacos.discovery.cluster-name: beijing

【服务版本管理】Ribbon支持nacos服务版本管理【基于元数据】

基于nacos元数据
image.png
扩展Ribbon支持基于元数据的版本管理_慕课手记

【坑】Ribbon自动重试

  • MaxAutoRetries
  • MaxAutoRetriesNextServer

image.png
OkToRetryOnAllOperations: true # 对所有的操作请求都进行重试,如果是get则可以,如果是post,put等操作没有实现幂等的情况下是很危险的
关于Ribbon重试机制的坑 - SegmentFault 思否
《Java 业务开发常见错误 100 例》-极客时间

Ribbon饥饿加载

ribbon.eager-load.enabled : 开启Ribbon的饥饿加载模式
ribbon.eager-load.clients: 指定需要饥饿加载的服务名
Ribbon的饥饿加载(eager-load)模式_Daniel的博客-CSDN博客