Spring Cloud生态中,通过Eureka可以实现微服务的注册发现,但是生产环境想要实现高可用,就要部署集群,这种情况下,微服务的负载均衡就非常有必要了。
在SpringCloud生态中,Ribbon是专门提供客户端,也就是服务调用方的负载均衡。
原理
- 为Ribbon配置服务提供者的地址列表,与Eureka结合可自动实现
- Ribbon基于负载均衡算法,可以控制HTTP、TCP客户端行为
Ribbon提供了轮询、随机等算法,我们也可以自己实现负载均衡算法。
步骤
- 添加依赖,当引入了spring-cloud-starter-eureka,以下依赖可省略
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
- 创建RestTemplate对象
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
此处添加了@LoadBalanced就可为RestTemplate整合Ribbon,使其具备负载均衡能力
- Controller中编写实现接口方法
@GetMapping("/ribbon/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://microservice-provider/" + id, User.class);
}
此处使用微服务id作为接口地址,是因为使用了负载均衡,microservice-provider指的是微服务的虚拟主机名,当Ribbon和Eureka配合时,会将主机名换成网络地址然后发起网络请求。
当启动了多个provider实例后,调用客户端http接口,发现两个服务端接替提供服务,是因为Ribbon默认使用轮询方式的负载均衡方法。
网友评论