Ribbon负载均衡
Ribbon 是基于 Netflix Ribbon 实现的一套 客户端 负载均衡的工具
Ribbon(负载均衡+RestTemplate调用)
Ribbon是客户端(消费者)负载均衡的工具。
依赖
新版的eureka依赖以及集成了Ribbon依赖,所以可以不引用。
也可以加上
<!--Ribbon的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
RestTemplate
@LoadBalanced注解给RestTemplate开启负载均衡的能力。
getForObject/getForEntity方法
测试getForEntity方法
在消费者cloud-consumer-order80的OrderController方法中添加:
@GetMapping("/consumer/payment/getEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){
// return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
//getStatusCode获取状态码,is2xxSuccessful如果是状态码是2xx
if(entity.getStatusCode().is2xxSuccessful()){
//返回body
return entity.getBody();
}else{
return new CommonResult<>(444, "操作失败");
}
}
Ribbon核心组件IRUle
IRUle接口的实现类:
默认为RoundRobinRule轮询。
Ribbon的自定义配置类不可以放在@ComponentScan所扫描的当前包下以及子包下,否则这个自定义配置类就会被所有的Ribbon客户端共享,达不到为指定的Ribbon定制配置,而@SpringBootApplication注解里就有@ComponentScan注解,所以不可以放在主启动类所在的包下。(因为Ribbon是客户端(消费者)这边的,所以Ribbon的自定义配置类是在客户端(消费者)添加,不需要在提供者或注册中心添加)
- 所以Ribbon的自定义配置类不能放在springcloud包下不能和主启动类放在同一层,和springcloud包在同一层
- 在此包下新建MySelfRule自定义配置类
@Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule(); //负载均衡机制改为随机
}
}
- n在主启动类上添加@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
name为指定的服务名(服务名必须与注册中心显示的服务名大小写一致)
configuration为指定服务使用自定义配置(自定义负载均衡机制)