Ribbon的基本使用
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
使用负载均衡策略可以把客户端的请求转发给不同的服务端来处理,避免了一个服务端处理大部分的请求导致的服务卡顿等问题,具体如图:
Ribbon的负载均衡和Rest调用:
1.导入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.配置RestTemplate并添加@LoadBalanced注解,这样就可以使用负载均衡策略了
@Configuration
public class ApplicationContextConfig {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
RestTemplate restTemplate=new RestTemplate();
return restTemplate;
}
}
3.使用负载均衡策略:
在RestTemplate中,对GET请求可以通过如下两个方法进行调用实现。
getForEntity方法的返回值是一个ResponseEntity<T>
,ResponseEntity<T>
是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。例@GetMapping("consumer/payment/getForEntity/{id}"public CommonResult<Payment> getPaymentById2(@PathVariable long id) {
ResponseEntity responseEntity=restTemplate.getForEntity(PAYMENT_URI+"/payment/get/"+id,CommonResult.class);
if(responseEntity.getStatusCode().is2xxSuccessful()){
return (CommonResult<Payment>) responseEntity.getBody();
}
else{
return new CommonResult<>(444,"失败");
}
}
getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject。
Post请求则与Get请求类似。
替换默认的负载规则,有时候默认的负载规则并不令人满意,我们希望对默认的负载规则进行更换。Ribbon已经提供了多种不同的负载均衡策略,他们都实现了IRule接口
例:将默认负载规则替换为随机
@Configuration
public class MySelfRule{
@Bean
public IRule myRule(){
return new RandomRule();//随机
}
}