Spring Cloud Ribbon 配置及详解

  • Ribbon 介绍

Ribbon 是一个客户端的负载均衡解决方案实现。它提供了咱们不少已经实现好的负载方案,咱们能够直接拿来用,或者自定义本身的负载均衡规则。Ribbon客户端在启动的时候会从Eureka Server端获取它须要调用服务的列表,而且作缓存,因此在Ribbon客户端启动之后,即便Eureka服务出现问题或者停掉,只要调用的服务没有问题,仍是能够保证客户端的正常调用,这样作主要是为了保证CAP中的Availability。spring

  • Ribbon 配置

这里咱们为了演示轮询的负载均衡方案,咱们须要启动两个服务的provider,设置不一样的端口,下面咱们经过 Active profiles 来启动服务,配置以下:缓存

application-7011.yml服务器

spring:
  application:
    name: provider-service

server:
  port: 7011

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

application-7012.yml并发

spring:
  application:
    name: provider-service

server:
  port: 7012

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

在启动Application类中添加注解 @EnableDiscoveryClient,而后咱们添加一个测试的Controllers类,代码以下:app

@RestController
public class RibbonTest {

    @Autowired
    ApplicationContext applicationContext;

    @RequestMapping(value = "/provider/ribbon/printLog", method = RequestMethod.GET)
    public String printLog() throws UnknownHostException {
        String IPAddress = InetAddress.getLocalHost().getHostAddress();
        String port = applicationContext.getEnvironment().getProperty("local.server.port");
        return "Hello Provider ".concat(IPAddress).concat(":").concat(port);
    }

}

至此,咱们的provider service配置好了,接下来咱们来配置 consumer service,首先咱们须要在 pom.xml 添加 ribbon 依赖:负载均衡

pom.xmldom

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

application.ymlide

spring:
  application:
    name: consumer-service

server:
  port: 7021

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

添加 Ribbon 的配置类:性能

@Configuration
// 若是多个服务能够选择不一样的策略
/*@RibbonClients({
        @RibbonClient(name = "other",configuration = OtherConfig.class),
        @RibbonClient(name = "provider",configuration = ProviderConfig.class)
})*/
@RibbonClient(name = "provider-service")
public class RibbonConfig {

    //定义负载均衡规则
    @Bean
    public IRule ribbonRule(){
        return new RoundRobinRule();
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

这里咱们主要介绍一下 Irule:测试

RoundRobinRule:轮询规则
RandomRule:随机规则
WeightedResponseTimeRule:使用响应时间的平均或者百分比为每一个服务分配权重的规则,若是无法收集响应时间信息,会默认使用轮询规则
BestAvailableRule:会先根据断路器过滤掉处于故障的服务,而后选择并发量最小的服务
ZoneAvoidanceRule:根据server所在Zone和其性能,选择服务器,默认规则
AvailabilityFilteringRule:先根据断路器规则过滤掉有问题的服务,而后对剩余的服务按照轮询的策略进行访问
RetryRule:先按照RoundRobinRule规则进行服务获取,若是调用服务失败会在指定时间内进行重试,直到获取到可用的服务。

Consumer service的Controller演示类:

@RestController
public class RibbonTest {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/ribbon/printLog")
    public String printProviderLog(){
        String result = restTemplate.getForObject("http://provider-service/provider/ribbon/printLog", String.class);
        return result;
    }

}
  • 演示Ribbon的轮询负载均衡

此时咱们首先启动的的Eureka服务,而后经过Active Profiles启动两个不一样端口的provider service,最后启动咱们的consumer service,而后访问 http://localhost:7021/consumer/ribbon/printLog ,而后不断刷新,咱们会看到端口7011和7012的不断变化。

相关文章
相关标签/搜索