一、前言
本篇文章将介绍如何使用 Ribbon 完成发现服务的调用以及其负载均衡的规则的使用。
二、简单介绍
Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端负载均衡工具,其主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。
其运行原理如下图:
Ribbon 运行时分成 2 个步骤:
先选择在同一个区域负载较少的 EurekaServer;
再根据用户指定的策略,在从 EurekaServer 中获取注册列表中的服务信息进行调用。
其中,Ribbon 提供多种负载均衡策略:如轮询、随机、响应时间加权等。
三、实战演练
我们在 user-web 项目的基础上进行修改。不清楚的读者请先转移至 Sprng Cloud入门之Eureka(一)进行浏览。
此外,额外的创建 2 个 user-provider (原user-api)项目,即现在有 3 个 user-provider 项目给 user-consumer (原user-web)进行消费。
以下为user-consumer (原user-web):
3.1添加依赖
<!--ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.1.0.RELEASE</version> </dependency>
3.2修改请求类
@Configuration public class RestConfiguration { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } // @Bean // public IRule testRule() { // return new RandomRule(); // } }
Ribbon 是客户端负载均衡工具,所以在 getRestTemplate 方法上添加 @LoadBalanced 注解实现负载均衡。
3.2修改请求地址
@RestController @RequestMapping("/user") public class UserController { @Autowired private RestTemplate restTemplate; // @RequestMapping("get/{id}") // public User get(@PathVariable("id") Integer id) throws Exception { // // 没有使用 Eureka 时,uri 为消息提供者的地址,需要指定 ip 和 端口 // return restTemplate.getForObject(new URI("http://localhost:8081/provider/user/get/" + id), User.class); // } // @Autowired // private DiscoveryClient client; // // @RequestMapping("get/{id}") // public User get(@PathVariable("id") Integer id) throws Exception { // // List<ServiceInstance> list = this.client.getInstances("USER-API"); // String uri = ""; // for (ServiceInstance instance : list) { // if (instance.getUri() != null && !"".equals(instance.getUri().toString())) { // uri = instance.getUri().toString(); // break; // } // } // return restTemplate.getForObject(uri + "/provider/user/get/" + id, User.class); // } @RequestMapping("get/{id}") public User get(@PathVariable("id") Integer id) throws Exception { // 使用 Eureka + Ribbon 后,uri 填写服务名称即可 return restTemplate.getForObject("http://USER-API/provider/user/get/" + id, User.class); } }
修改 DiscoveryClient 相关代码,使用 USER-API 服务名称作为请求 URL。
3.3在启动类上将 @EnableDiscoveryClient 替换成 @EnableEurekaClient 注解。
4.测试
依次启动 eureka-server 、 user-provider、 user-provider-8082 、 user-provider-8083 、user-consumer
项目源码:https://github.com/Uncle-LiuY/ribbon-test
以上是参考其他文章而写的,不足之处请指出,谢谢。
评论 (0)