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 毫秒。
等等
替换规则

官方指出,自定义的规则不能是被@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
参考
未完待续


浙公网安备 33010602011771号