在Spring Cloud Eureka学习文章中,服务消费者调用服务提供者时,用到了@LoadBalanced注解,这个就是Spring Cloud Ribbon提供的功能。
我们当时搭建了一个Eureka Server 和两个Eureka Client,微服务之前互相进行调用。但是,调用的过程中就会存在问题,如何能够把请求均匀的打到多个服务提供者实例上呢?这就需要用到负载均衡。
负载均衡:
负载均衡是指将负载分摊到多个服务实例上。常见的负载均衡有两种方式,一种是通过独立的进程单元,将请求转发到不同的实例上。还有一种是通过程序编码的方式,在客户端通过负载均衡算法,选择一个需要请求的实例。
Nginx就属于第一种,Ribbon属于第二种。
Spring Cloud Ribbon是什么?
Ribbon是Netflix公司开源的客户端负载均衡器,可以控制Http和Tcp客户端的负载均衡。
Ribbon默认提供了很多负载均衡算法,如:轮询、随机等,也可以实现自定义的负载均衡算法。
在Spring cloud中,当Ribbon与Eureka结合使用时,Ribbon可以自动的从Eureka Server获取服务列表,基于负载均衡算法,进行服务调用。
如何使用Spring Cloud Ribbon
在Spring Cloud构建的微服务系统中,Ribbon作为客户端负载均衡器,有两种使用方式,第一种是和RestTemplate相结合,第二种是和Feign相结合。Spring Cloud Feign作为声明式调用客户端,已经默认集成了Ribbon,这个在后续的文章中会进行说明。本次的例子是按照第一种方式,和RestTemplate相结合来实现负载均衡。
还是基于之前创建的服务消费者microservice-consumer进行学习,Ribbon是属于客户端负载均衡器,所以,在服务消费者调用服务提供者的时候,进行负载均衡。(之前的文章中,服务消费者调用服务提供者时,已经通过Ribbon来实现了负载均衡的调用,只不过没有进行说明,这篇文章主要是对这种调用方式进行说明)
在microservice-consumer服务的pom文件中,添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
接下来,为RestTemplate添加注解:@LoadBalanced
public class MicroServiceConsumeApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroServiceConsumeApplication.class, args);
}
}
Spring Cloud Ribbon使用方式比较简单,只需要在RestTemplate添加@LoadBalanced注解,就可以为RestTemplate整合Ribbon,接下来RestTemplate的调用就基于负载均衡了。
接下来再看下具体调用的代码:
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer", method = RequestMethod.GET)
public String consumer() {
return this.restTemplate.getForEntity("http://MICROSERVICE-PROVIDER/provider", String.class).getBody();
}
}
以前请求服务提供者的时候,地址为http://localhost:8000/provider,现在改成了http://MICROSERVICE-PROVIDER/provider,这个MICROSERVICE-PROVIDER就是服务提供者的虚拟主机名。Ribbon和Eureka结合使用时,Ribbon就可以自动的把这个虚拟主机名映射成微服务的网络地址。
到了这一步,微服务的改造就算是完成了,当服务提供者有多个实例时,服务消费者再请求服务提供者,就会通过负载均衡,均匀的转发到不同的实例上。
参考资料:
1.《Spring Cloud与Docker微服务架构实战》 周立 著
2.《Spring Cloud微服务实战》 翟永超 著
3.《深入理解Spring Cloud与微服务构建》 方志朋 著