欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud(五)Ribbon

程序员文章站 2022-06-23 20:48:12
...

Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

Eureka整合Ribbon

1:新建Spring Boot项目EurekaServer,添加依赖Eureka Server
2:启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3:配置文件application.yml

server:
  port: 8761                  
eureka:
  client:
    registerWithEureka: false    #是否将自己注册到Eureka Server,默认为True。由于当前应用就是Eureka Server,故false
    fetchRegistry: false         #是否从Eureka Server获取注册信息,默认True。因为这是一个单节点的Eureka Server,不需要同步其他的Eureka Server节点,故false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

4:新建Spring Boot项目EurekaClient,添加依赖Eureka Client
5:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

6:配置文件application.yml

server:
  port: 8003
spring:
  application:
    name: EurekaClinet
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true 

7:新建Spring Boot项目EurekaRibbon,添加依赖Eureka(已经包含了Ribbon)、Web (Eureka Client包含了Web,Eureka Server没有包含)
Spring Cloud(五)Ribbon
Spring Cloud(五)Ribbon
8:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaRibbonApplication.class, args);
    }
}

9:配置文件application.yml

server:
  port: 8010
spring:
  application:
    name: EurekaRabbon
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

10:MyController

@RestController
public class MyController {
      private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);
      @Autowired
      private LoadBalancerClient loadBalancerClient;
      @GetMapping("/log-user-instance")
      public void logUserInstance() {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("EurekaClinet");
        // 打印当前选择的是哪个节点
        MyController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
      }
}

11:运行测试
启动项目EurekaServer
启动项目EurekaClient(以8003端口启动)
启动项目EurekaClient(以8004端口启动)
启动项目EurekaRibbon
Spring Cloud(五)Ribbon
访问:http://localhost:8010/log-user-instance
控制台会打印:
Spring Cloud(五)Ribbon
可以看到请求是均匀分布到两个用户微服务节点上的,说明已经实现了负载均衡!

使用Java代码自定义Ribbon配置

Spring Cloud Camden允许使用Java代码或属性自定义Ribbon的配置,两种方式是等价的。
1:EurekaRibbon项目添加Ribbon配置类:RibbonConfiguration.java

@Configuration
public class RibbonConfiguration {
  @Bean
  public IRule ribbonRule() {
    // 负载均衡规则,改为随机
    return new RandomRule();
  }
}

2:EurekaRibbon项目空类TestConfiguration.java

@Configuration
@RibbonClient(name = "EurekaClinet", configuration = RibbonConfiguration.class)
public class TestConfiguration {
//@RibbonClient的configuration属性指定自定义Ribbon配置
}

3:结构目录:
Spring Cloud(五)Ribbon
4:运行测试
Spring Cloud(五)Ribbon
此时请求会随机分布到两个用户微服务节点上,说明已经实现了Ribbon的自定义配置。

使用属性自定义Ribbon配置

从Spring Cloud Netflix1.2.0开始(Spring Cloud Camden SR4使用版本为1.2.4),Ribbon支持使用属性自定义Ribbon客户端,配置的前缀是< clientName >.ribbon。
Spring Cloud(五)Ribbon
application.yml添加:

EurekaClinet:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

运行测试:
Spring Cloud(五)Ribbon
此时请求依然会随机分布到两个用户微服务节点上!

脱离Eureka使用Ribbon

1:新建Spring Boot项目RibbonWithOutEureka,添加依赖Ribbon、Web
2:启动类

@SpringBootApplication
public class RibbonWithOutEurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonWithOutEurekaApplication.class, args);
    }
}

3:MyController

@RestController
public class MyController {
      private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);
      @Autowired
      private LoadBalancerClient loadBalancerClient;
      @GetMapping("/log-user-instance")
      public void logUserInstance() {
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("EurekaClinet");
        // 打印当前选择的是哪个节点
        MyController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
      }
}

4:application.yml

server:
  port: 8010
spring:
  application:
    name: RibbonWithOutEureka
EurekaClinet:
  ribbon:
    listOfServers: localhost:8000,localhost:8001

5:运行测试
启动项目RibbonWithOutEureka
访问:http://localhost:8010/log-user-instance
Spring Cloud(五)Ribbon
尽管此时没有注册到Eureka上,Ribbon仍可正常工作,请求依旧会分摊到两个微服务节点上。

以上代码可能贴得比较多,但都比较简单且重复了,只是想更加详细一点!!
参考书籍:Spring Cloud与Docker微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!

相关标签: Spring Cloud Ribbon