序言
在微服务项目中,我们肯定会部署服务集群以防故障发生,那么,如何保证请求的每台服务器受到的压力都差不多呢?
答案是通过负载均衡进行实现。
Ribbon:客户端负载均衡
快速入门
下面只介绍如何在 Spring Cloud 中实现负载均衡,步骤如下
① 添加依赖
首先考虑一个问题,在哪里实现负载均衡?
我们要保障访问的服务器(服务提供者)受到的压力差不多,肯定是在要请求该服务的模块(服务消费者)实现负载均衡,告诉他:皇上,佳丽三千,您要雨露均沾呀!
因此我们应在consumer服务调用模块上实现负载均衡,在其pom.xml文件添加Ribbon的依赖:1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
② 添加注解
在启动类的RestTemplate此Bean上添加@LoadBalanced注解,毕竟RestTemplate相当于 HTTP 客户端:1
2
3
4
5
public RestTemplate restTemplate() {
return new RestTemplate();
}
在RestTemplate那个Bean上加上@LoadBalanced注解,该服务模块就实现了负载均衡,我们不需要知道具体的服务实例,其内部将自动选择一个实例,因此只告诉其请求的服务名即可:1
2
3
4
5
6
7
8
9
10
11
12
13
("consumer")
public class ConsumerController {
private RestTemplate restTemplate;
("{id}")
public User queryById(@PathVariable("id") Integer id) {
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, User.class);
}
}
当我们启动多个user-service(集群)后,通过这种方式对服务就能达到雨露均沾的效果。
③ 修改配置文件
当然,我们可以修改application.yml以配置 Ribbon 相关参数:1
2
3
4
5ribbon:
CoonectionTimeout: 500 # 链接超时时长
ReadTimeout: 2000 # 读取超时时长
MaxAutoRetries: 0 # 当前服务重试次数
MaxAutoRetriesNextServer: 0 # 切换服务重试次数
参考
- Spring Cloud 官方文档
- 翟永超. Spring Cloud 微服务实战 [M]. 电子工业出版社,2017