基于Ribbon实现服务消费者客户端负载均衡

拼搏现实的明天。 2022-05-18 11:15 240阅读 0赞

基于Ribbon实现服务消费者客户端负载均衡

springcloud-service-consumer 工程概述

这个工程是是一个微服务消费者工程,负责消费服务提供者(springcloud-service-provider-high-available)提供的服务,该工程提供的服务与服务提供者提供的服务一一对应。
同时,该工程基于Ribbon实现了客户端负载均衡。

实现步骤分析

引入相关依赖依赖

  1. <dependencies>
  2. <!-- SpringBoot依赖 -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-web</artifactId>
  6. </dependency>
  7. <!-- Eureka Client依赖 -->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  11. </dependency>
  12. <!-- ribbon客户端负载均衡依赖 -->
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-ribbon</artifactId>
  16. </dependency>
  17. </dependencies>

创建application.yml文件

  1. server:
  2. port: 9000
  3. eureka:
  4. client:
  5. register-with-eureka: false
  6. service-url:
  7. # eureka Server端地址
  8. defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

创建springcloud-service-consumer启动类

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  4. @SpringBootApplication
  5. @EnableEurekaClient // 表示该工程是一个Eureka客户端
  6. public class Application {
  7. public static void main(String[] args) throws Exception {
  8. SpringApplication.run(Application.class, args);
  9. }
  10. }

服务消费示例代码

  1. import javax.servlet.http.HttpServletRequest;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import org.springframework.web.client.RestTemplate;
  6. @RestController // @RestController <==> @Controller + @ResponseBody
  7. public class ServiceProviderConsumerController {
  8. @Autowired
  9. private RestTemplate restTemplate;
  10. /* * 这个前缀是服务提供者(springcloud-service-provider)注册到EurkaServer中的服务名称 */
  11. private static final String REST_URL_PREFIX = "http://MICROSERVICE-SERVICE-PROVIDER";
  12. @RequestMapping("/consumer/service1")
  13. public String service1() {
  14. /* * 通过restful实现对服务提供者所提供方法的调用 */
  15. String url = REST_URL_PREFIX + "/provider/service1";
  16. return restTemplate.postForObject(url, null, String.class);
  17. }
  18. @RequestMapping("/consumer/service/discovery")
  19. public Object discovery() {
  20. String url = REST_URL_PREFIX + "/service/discovery";
  21. return restTemplate.postForObject(url, null, Object.class);
  22. }
  23. // 获取请求URL
  24. @RequestMapping("/consumer/request/info")
  25. public String requestInfo(HttpServletRequest request) {
  26. String url = REST_URL_PREFIX + "/provider/request/info";
  27. return restTemplate.postForObject(url, null, String.class);
  28. }
  29. }

服务消费端提供的方法与服务提供者springcloud-service-provider-high-available暴露的方法一致。
服务消费端通过 restfull直接请求服务生产端所提供的方法,

编写配置类

  1. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. @Configuration // 用于标记这个类属于配置类
  6. public class BeanConfig {
  7. @Bean // @Bean相当于配置文件中<bean id = "restTemplate" class="org.springframework.web.client.RestTemplate" />
  8. @LoadBalanced // 实现基于客户端的负载均衡
  9. public RestTemplate getRestTemplate() {
  10. return new RestTemplate();
  11. }
  12. }

通过@Bean注解注入RestTemplate对象,同时使用@LoadBalanced实现客户端负载均衡。

测试

启动本项目后,通过浏览器内反复访问http://localhost:9000/consumer/request/info,该请求返回的是http请求相关的信息,对应着服务端的相应方法。
请求结果如下图:
第一次请求:
这里写图片描述
第二次请求:
这里写图片描述

观察请求结果中的端口号变化

注意事项:

  • 启动本示例之前,需要提前启动Eureka Server高可用工程(springcloud-eureka-server-peer)和服务提供者高可用工程(springcloud-service-provider-high-available
  • Ribbon默认的负载均衡策略是轮询。

源代码链接:
https://github.com/myNameIssls/springcloud-study/tree/master/springcloud-service-consumer

参考链接:
https://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#spring-cloud-ribbon

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读