@Resource
private LoadBalancerClient loadBalancerClient;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/msg")
public String getProviderMessage() {
//loadBalancerClient.choose()方法会从 Nacos 获取 provider-service 所有可用实例,
//并按负载均衡策略从中选择一个可用实例,封装为 ServiceInstance(服务实例)对象
//结合现有环境既是从192.168.31.111:80、192.168.31.112:80、192.168.31.113:80三个实例中选择一个包装为ServiceInstance
ServiceInstance serviceInstance = loadBalancerClient.choose("provider-service");
//获取服务实例的 IP 地址
String host = serviceInstance.getHost();
//获取服务实例的端口
int port = serviceInstance.getPort();
String result = restTemplate.getForObject("http://" + host + ":" + port + "/provider/msg", String.class);
//输出响应内容
logger.info("provider-service 响应数据:" + result);
return "consumer-service 响应数据:" + result;
}
Ribbon组件
- 微服务调用组件Ribbon底层调用流程分析_我神级欧文的博客-CSDN博客_ribbon调用流程
Ribbon自定义rule
两种方式:
- 默认ZoneAvoidanceRule
Ribbon配置要注意包的位置
如果放在原包内,则变为全局配置。
【灰度发布】Ribbon灰度发布
smurf/GrayRule.java at master · uhasoft/smurf
9-灰度路由分析_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
【权重】让Ribbon支持nacos权重
基于nacos内置的权重算法。
扩展Ribbon支持Nacos权重的三种方式_慕课手记
//nacos自带的负载均衡算法,传入name,返回一个server
Instance instance = discoveryProperties.namingServiceInstance()
.selectOneHealthyInstance(name);
【同机房调用】Ribbon支持nacos同机房调用
区别于nacos discovery namespace 完全隔离。
nacos内部的负载均衡算法,传入一个list,返回一个实例。
spring.cloud.nacos.discovery.cluster-name 默认default 利用cluster-name来指定机房 spring.cloud.nacos.discovery.cluster-name: beijing
【服务版本管理】Ribbon支持nacos服务版本管理【基于元数据】
基于nacos元数据
扩展Ribbon支持基于元数据的版本管理_慕课手记
【坑】Ribbon自动重试
- MaxAutoRetries
- MaxAutoRetriesNextServer
OkToRetryOnAllOperations: true # 对所有的操作请求都进行重试,如果是get则可以,如果是post,put等操作没有实现幂等的情况下是很危险的
关于Ribbon重试机制的坑 - SegmentFault 思否
《Java 业务开发常见错误 100 例》-极客时间
Ribbon饥饿加载
ribbon.eager-load.enabled : 开启Ribbon的饥饿加载模式
ribbon.eager-load.clients: 指定需要饥饿加载的服务名
Ribbon的饥饿加载(eager-load)模式_Daniel的博客-CSDN博客