SpringCloud-Ribbon

客户端负载均衡工具,需要搭配RestTemplate使用

对于 Hoxton.SR12 版本,spring-cloud-starter-netflix-eureka-client包中已经包含了spring-cloud-starter-netflix-ribbon

对于 Hoxton.M2 版本开始,Spring Cloud 已经不再默认使用Ribbon来做负载均衡了,而是使用 spring-cloud-starter-loadbalancer替代

使用案例

@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

@LoadBalanced用来保证请求的时候负载均衡

@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping(("/consumer/user"))
public class UserController {
    private final static String PROVIDER_URL = "http://PAYMENT-SERVICE";
    private final RestTemplate restTemplate;

    @GetMapping("/{id}")
    public CommonResult<User> findById(@PathVariable("id") Long id) {
        String url = PROVIDER_URL + "/provider/user/findById/" + id;
        log.info("url:{}", url);

        return restTemplate.getForObject(url, CommonResult.class);
    }
}

默认负载均衡策略使用的是 com.netflix.loadbalancer.RoundRobinRule
它实现了 AbstractLoadBalancerRule 接口,根据接口实现可以找到更多的负载均衡策略

包括

  • RoundRobinRule:轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。
  • RandomRule: 随机策略,从所有可用的 provider 中随机选择一个。
  • RetryRule: 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。

等等

替换规则

PixPin_2025-08-05_22-26-19

官方指出,自定义的规则不能是被@ComponentScan扫描到

但是一般SpringBoot启动类的 @SpringBootApplication注解就会扫描启动类以及启动类子包,所以自定义规则最好在另一个包

增加一个配置类,跟启动类的包区分开,比如启动类在me.yangjun.study.springcloud下,MyRibbonRuleConfig可以放在me.yangjun.test.ribbon.rule下

@Configuration
public class MyRibbonRuleConfig {
    @Bean
    public IRule myRule() {
        return new RandomRule();
    }
}

修改启动类

@SpringBootApplication
@RibbonClient(name = "PAYMENT-SERVICE", configuration = MyRibbonRuleConfig.class)
public class Application80 {
    public static void main(String[] args) {
        SpringApplication.run(Application80.class, args);
    }
}

@RibbonClient(name = "PAYMENT-SERVICE", configuration = MyRibbonRuleConfig.class)中

name指定的是针对要请求的服务

configuration指定轮询策略

这样在请求PAYMENT-SERVICE服务的时候,就会使用MyRibbonRuleConfig中配置的规则

如果要配置多个,可以使用@RibbonClients指定默认和每一个服务的配置

@RibbonClients(
    defaultConfiguration = MyRibbonRuleConfig.class,
    value = {
        @RibbonClient(name = "PAYMENT-SERVICE", configuration = MyRibbonRuleConfig.class)
    }
)

部分配置参数

ribbon:
  #连接超时时间,默认2000毫秒
  ConnectTimeout: 1000
  #逻辑处理超时时间,默认5000毫秒
  ReadTimeout: 10000
  #对当前实例的重试次数,默认0
  MaxAutoRetries: 1
  #对切换实例的重试次数,默认1
  MaxAutoRetriesNextServer: 0
  #是否所有操作都重试, false只重试get请求,true所有都重试,
  OkToRetryOnAllOperations: false

参考

【SpringCloud】Ribbon如何自定义客户端配置和全局配置

未完待续
未完待续

posted @ 2025-08-05 21:58  一只盐桔鸡  阅读(21)  评论(0)    收藏  举报