ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## **1. 客户端负载均衡 与 服务端负载均衡** **1. 在客户端负载均衡中,每个客户端服务 都有一份自己要访问的服务端清单,这些清单统统都是从Eureka服务注册中心获取的.** **2. 而在服务端负载均衡中,只要负载均衡器维护一份服务端列表 。** * **Spring Cloud Ribbon 是基于 Netflix 公司发布的开源项目 Ribbon 进行封装的一套客户端负载均衡器** * 所以说,服务提供端只要负责将服务注册到Eureka集群就行,具体调用还主要在服务调用端配置 ![](https://img.kancloud.cn/d5/da/d5dafcb41b16e2787b5d4b652e4c39f8_1020x514.png) ## **2. Ribbon 服务调用配置** ### **2.1 应用消费端配置** **1. 修改pom文件加入 Eureka client启动器, eureka会自动引入Ribbon** ~~~ <!-- Ribbon 相关依赖,eureka会自动引入Ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 引入公共接口部分 --> <dependency> <groupId>com.tuna.springcloud</groupId> <artifactId>microservice-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> ~~~ 由于依赖了spring-cloud-starter-netflix-eureka-client,会自动添加spring-cloud-starter-netflix-ribbon依赖 **2. 修改yml,配置Eureka服务发现** ``` eureka: client: registerWithEureka: false # 服务注册,false表示不将本消费者注册到 Eureka 服务器 fetchRegistry: true # 服务发现,true从 Eureka 服务器中获取注册信息 serviceUrl: defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/ ``` **3. 添加配置类,配置负载均衡** > **@LoadBalanced表示这个RestTemplate开启负载均衡,在调用服务提供者的接口时,可使用 服务名称 替代真实IP地址。服务名称 就是服务提供者在application.yml中配置的spring.application.name属性的值** ![](https://img.kancloud.cn/ec/dd/ecddba786e7f6ad9419b31aabe716693_402x183.png) ~~~ @Configuration //标识配置类 public class ConfigBean { @LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } } ~~~ **4. 修改调用地址为 服务名称,不必在写ip地址,这样的好处是 无论是有几个服务提供者,消费端只需指定服务名称去调用即可,不用担心ip和端口** ``` //private static final String REST_URL_PREFIX = "http://localhost:8001"; //修改为商品提供者向Eureka服务器中注册的地址 private static final String REST_URL_PREFIX = "http://microservice-product"; ``` 完整消费端代码 ``` @RestController public class ProductController_Consumer { //private static final String REST_URL_PREFIX = "http://localhost:8001"; //修改为商品提供者向Eureka服务器中注册的地址 private static final String REST_URL_PREFIX = "http://microservice-product"; @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/consumer/product/add") public boolean add(Product product) { return restTemplate.postForObject(REST_URL_PREFIX + "/product/add", product, Boolean.class); } @RequestMapping(value = "/consumer/product/get/{id}") public Product get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX + "/product/get/" + id, Product.class); } @RequestMapping(value = "/consumer/product/list") public List<Product> list() { return restTemplate.getForObject(REST_URL_PREFIX + "/product/list", List.class); } } ``` 5. 测试 启动Eureka 服务提供端和消费端 ![](https://img.kancloud.cn/07/1b/071b4ae0124e4bed0cd4d437360dac7b_718x125.png) 访问正常,负载均衡有待测试 ## **3. Ribbon负载均衡测试** **Ribbon 在工作时分成两步:** **第1步**先选择 Eureka Server ,它优先选择在同一个区域内负载较少的server **第2步**再根据用户指定的策略,在从 Eureka Server 获取的服务注册列表中选择一个地址。 其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权等 ![](https://img.kancloud.cn/88/c4/88c473824e4f71417b6874650ae5fe80_795x448.png) ### 3.1 新建一个服务提供者 负载均衡测试一定要有两个以上,才可以测试 在新见一个模块,然后将原来的服务提供者工程代码赋值一份,改下端口配置即可 ![](https://img.kancloud.cn/67/c2/67c2237e40ed1189fb0c498c9b8ead71_720x531.png) ![](https://img.kancloud.cn/3b/98/3b98bb1781cbc4087c788fee7b7f5ada_734x552.png) 得到一个新的服务端工程 ![](https://img.kancloud.cn/96/a7/96a7c0f6d44e9d3b55812f4d43c158ac_362x299.png) ### 3.2 新建一个数据库 用新数据库,得到不同的数据模拟负载到不同的服务提供者 ![](https://img.kancloud.cn/4e/63/4e63fd93c2aea0b823dffa4d1f10adaa_966x313.png) ### 3.3 启动新的服务提供者测试 第一次请求 ![](https://img.kancloud.cn/62/07/620754c12aaf8340eaa02a1ec9b03155_529x151.png) 第二次请求 ![](https://img.kancloud.cn/3c/70/3c704952c98538a2edfa372787633f90_491x124.png) 证明负载已经生效