Spring Cloud Ribbon是基于 Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,比如超时,重试等。通过 Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机等)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。关于Ribbon负载均衡的介绍查看之前的文章:
Ribbon负载均衡和RestTemplate使用:https://blog.csdn.net/qq_42402854/article/details/111088360
一、Nacos使用Ribbon
1、引入依赖
由于 nacos-discovery依赖了 Ribbon,所以我们不需要再引入 Ribbon依赖。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、开启负载均衡
开启 @LoadBalanced 与 Ribbon 的集成。
RestTemplate 添加 @LoadBalanced注解 ,让RestTemplate在请求时拥有客户端负载均衡的能力。使用 RestTemplate进行服务调用。
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}
3、使用 RestTemplate进行服务调用
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
log.info("根据userId=" + id + "查询订单信息");
String url = "http://app-order/order/findOrderByUserId/" + id;
R result = restTemplate.getForObject(url, R.class);
return result;
}
浏览器访问测试ok:http://localhost:18081/app-user/user/findOrderByUserId/1,返回数据:
二、Ribbon负载均衡策略
1、修改默认负载均衡策略
修改application.yml。指定微服务调用时,使用对应的负载均衡算法。比如指定 Nacos提供的负载均衡策略。
app-order:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
2、自定义负载均衡策略
通过实现 IRule 接口或者继承 AbstractLoadBalancerRule类 可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。
2.1 创建自定义负载策略类
@Slf4j
public class MyCustomRandomRule extends AbstractLoadBalancerRule {
@Override
public Server choose(Object key) {
ILoadBalancer loadBalancer = this.getLoadBalancer();
List<Server> reachableServers = loadBalancer.getReachableServers();
int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
Server server = reachableServers.get(random);
log.info("随机获取服务实例:server.port={}", server.getPort());
return server;
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
2.2 配置自定义的策略
修改application.yml。
app-order:
ribbon:
NFLoadBalancerRuleClassName: com.charge.xxx.MyCustomRandomRule
3、开启饥饿加载
Ribbon默认懒加载,表示只有在发起服务调用时才会加载客户端。如果网络情况不好,在第一次进行服务调用会超时。
我们可以开启 Ribbon饥饿加载,即服务启动时就加载客户端,解决第一次调用慢的问题。
ribbon:
eager-load:
enabled: true
clients: app-order
– 求知若饥,虚心若愚。
|