Spring Cloud负载均衡——Spring Cloud Ribbon

痛定思痛。 2022-05-13 18:27 289阅读 0赞

Spring Cloud Ribbon基于Netflix Ribbon实现,属于客户端(服务消费者)的负载均衡。client从服务注册中心Eureka获取到服务列表,然后通过轮询的方式从获取到的服务中选取一个发出请求。

Spring Cloud Ribbon使用很简单,最常用的使用方法如下:

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

在RestTemplate上加上注解@LoadBalanced即可开启负载均衡,这样使用RestTemplate调用服务时会轮询服务来达到负载均衡的目的。

测试:

1.建立注册Eureka注册中心

  1. server:
  2. port: 11500
  3. spring:
  4. application:
  5. name: eurka-server
  6. #eureka注册中心配置
  7. eureka:
  8. instance:
  9. hostname: localhost
  10. client:
  11. registerWithEureka: false
  12. fetchRegistry: false
  13. serviceUrl:
  14. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2.建一个服务提供者service-user

  1. server:
  2. port: 0
  3. spring:
  4. application:
  5. name: service-user
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://localhost:11500/eureka/
  10. #指定不同的实例名称,加一个随机数来区分(非端口号)
  11. instance:
  12. instance-id: ${spring.application.name}-${random.int[100,999]}

暴露对外调用接口(Controller):

  1. @RequestMapping("/test")
  2. public Object test(){
  3. return "SERVICE-ID: "+serviceInstance.getServiceId()+" , PORT: "+serviceInstance.getPort();
  4. }

以service-id+port的形式返回以区别不同实例

注意这里的server.port,采用随机端口的形式来启动多个实例。

随机端口有两种写法:

  • 一种是用Spring提供的${random.int[num1,num2]}来指定范围内的端口;
  • 另一种是直接用0,将会分配一个未被使用的随机端口。

使用第一种会造成实例端口与注册中心注册的端口不一致,因为实例启动时时,从配置文件获取了一次随机端口,而注册到配置中心时,又从配置文件获取了一次随机端口,前后两次获取到的随机值不同,导致无吴无法调用。

因此使用第二种方式,但是需要指定不同的实例名称,不然依旧是同一个实例。

3.新建一个服务消费者client-web

  1. server:
  2. port: 11503
  3. spring:
  4. application:
  5. name: client-web
  6. eureka:
  7. client:
  8. serviceUrl:
  9. defaultZone: http://localhost:11500/eureka/

暴露对外访问接口(Controller):

  1. private final RestTemplate restTemplate;
  2. @Autowired
  3. public TestController(RestTemplate restTemplate) {
  4. this.restTemplate = restTemplate;
  5. }
  6. @RequestMapping("test")
  7. public String test(){
  8. String res = restTemplate.getForObject("http://service-user/test",String.class);
  9. return res;
  10. }

先启动注册中心,在启动其他两个。

可以看到两个service-user实例已经注册到了注册中心。

YEJvVr9.png

然后访问http://localhost:11503两次,得到的返回结果如下:

  1. //第一次
  2. SERVICE-ID: service-user , PORT: 59430
  3. //第二次
  4. SERVICE-ID: service-user , PORT: 59420

说明请求已被分发到两个实例上,实现了负载均衡。

发表评论

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

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

相关阅读