Spring Cloud 客户端负载均衡 Ribbon

序言

  在微服务项目中,我们肯定会部署服务集群以防故障发生,那么,如何保证请求的每台服务器受到的压力都差不多呢?

  答案是通过负载均衡进行实现。

  Ribbon 就是实现负载均衡的工具之一。

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>

② 添加注解

  在启动类的RestTemplateBean上添加@LoadBalanced注解,毕竟RestTemplate相当于 HTTP 客户端:

1
2
3
4
5
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}

  在RestTemplate那个Bean上加上@LoadBalanced注解,该服务模块就实现了负载均衡,我们不需要知道具体的服务实例,其内部将自动选择一个实例,因此只告诉其请求的服务名即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("consumer")
public class ConsumerController {

@Autowired
private RestTemplate restTemplate;

@GetMapping("{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
5
ribbon:
CoonectionTimeout: 500 # 链接超时时长
ReadTimeout: 2000 # 读取超时时长
MaxAutoRetries: 0 # 当前服务重试次数
MaxAutoRetriesNextServer: 0 # 切换服务重试次数

参考

0%