版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012437781/article/details/82989019
前言
本节我们将了解下在使用了Eureka作为服务的注册与发现组件时是如何使用Ribbon来实现客户端均衡负载的。
在前面的章节中我们了解到了服务注册与发现组件的机制中都基本 实现了均衡负载。
-
服务注册与发现组件
服务注册与发现组机制主要有两种一种是基于服务端服务注册与发现组机制,该类型的均衡负载的实现则是基于服务端的负载均衡,典型的如Consul+Nginx。另外一种是基于客户端服务注册与发现机制,该类型的均衡负载实现则是基于客户端负载的负载均衡,典型的如Eureka+Netflix Ribbon。本节我们将学习一下在使用了Eureka作为服务注册与发现机制的为服务中,是如何使用Netflix Ribbon实现客户端均衡负载的。 -
Ribbon
- Ribbon是Netflix开发的云中间层服务开源项目,其主要功能是提供客户端均衡负载算法。Ribbon提供了一系列的完善的配置比如链接超时、重试等。简单来说Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出我们的Load Balance后面的所有机器,Ribbon会通过某种规则(如轮询、随即链接等)自动地去链接这些服务,同时我们也可以使用Ribbon定义的接口来实现自自定义负载均衡算法以满足特定的业务需求。
- Ribbon负载均衡实现机制
Ribbon首先从Eureka Server的服务注册表中获取已注册服务的信息,然后通过Ribbon中的负载均衡算法算出被命中的实例,然后将负载均衡请求只想该节点即实际的请求将会只想该服务的指定实例。
- Ribbon工作机制
- 第一步选择Eureka Server,默认地它将选择一个Zone且负载较少的Server;
- 第二步根据用户指定的策略在Eureka Server上获取服务注册表中选择一个地址,其中Ribbon提供了多种策略,例如轮询roud robin。随机Random、根据响应时间加权等等。
案例
-
Eureka Server端编写:请参考SpringCloud微服务 之 Eureka(二)
-
Eureka Client端服务提供方编写(参考前例)
- 核心代码与步骤
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-deal-broker-cloud-ribbon</artifactId> <packaging>jar</packaging> <name>microservice-deal-broker-cloud-ribbon</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.example</groupId> <artifactId>microservice-deal-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- Eureka CLient核心组件 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Ribbon核心组件 可声明此依赖也可以不生命,因为Eureka Client已依赖了Ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies>
-
Core Code
@SpringBootApplication @EnableDiscoveryClient public class MicroserviceDealBrokerRibbonApplication { @Bean @LoadBalanced /** * 添加 @LoadBalanced 使该RestTemplate具备Ribbon均衡负载算法功能 * @return */ public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerRibbonApplication.class, args); } }
@RestController public class BrokerController { @Autowired private RestTemplate restTemplate; @GetMapping("/deal/{id}") public Deal findById(@PathVariable Long id) { return this.restTemplate.getForObject("http://microservice-deal-cloud/" + id, Deal.class); } }
-
- 核心代码与步骤
-
Eureka Client端服务提消费编写(多实例) 在多个端口启动多个实例 (参考前例)
-
CoreCode
@RestController public class DealController { @Value("${server.port}") private String port; // 为验证多端口启动的实例 8081/8083 @GetMapping("/{id}") public Deal findById(@PathVariable Integer id) { Deal deal = new Deal(id, "Dustyone", "Heyt", 22, 18,port); return deal; } }
-
-
Eureka Dashboard
- 持续访问:http://localhost:8082/deal/1
我们会发现请求到达microservice-deal-broker-cloud-ribbon后Ribbon实现了均衡负载(默认为轮询)-以最终呈现的port为区分标志。
小结
- Eureka 的依赖中依赖了Ribbon因而我们可以在引入了Eureka依赖之后不需要特地地添加Ribbon依赖。
- 服务消费端的RestTempalate需要添加@LoadBalanced注解是的该RESTTamplate具有Ribbon的均衡负载功能,Ribbon均衡负载算法的默认策略是轮询。
- 为直观地展示Ribbon的均衡负载算法实现,需要在服务提供开启多个实例验证均衡负载的实现。本例子开启了两个实例分别在8081和8083端口中。
- 本节学习源代码在这里。使用到的案例:microservice-deal-eureka、microservice-deal-broker-cloud-ribbon(服务消费者)、microservice-deal-cloud(8081-8083)(服务提供者)