2. SpringCloud基础系列——负载均衡 Ribbon

222 阅读2分钟

1. Ribbon简介

1.1 Ribbon负载均衡

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:

  • 简单轮询负载均衡
  • 加权响应时间负载均衡
  • 区域感知轮询负载均衡
  • 随机负载均衡

1.2 Ribbon中还包括以下功能:

  • 易于与服务发现组件(比如Netflix的Eureka)集成
  • 使用Archaius完成运行时配置
  • 使用JMX暴露运维指标,使用Servo发布
  • 多种可插拔的序列化选择

1.3 Ribbon运行时的两个步骤

  • 先选择在同一个区域负载较少的 EurekaServer;
  • 再根据用户指定的策略,在从 EurekaServer 中获取注册列表中的服务信息进行调用

2. 实战

代码接上篇,只需修改几个地方即可

pom.xml

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

config

@Configuration
public class RestConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    /**
     * 负载均衡策略——随机(默认为轮询)
     * 
     * @return
     */
    @Bean
    public IRule randomRule() {
        return new RandomRule();
    }
}

UserController

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/getName/{name}")
    public String getName(@PathVariable("name") String name) {
        // 使用Ribbon,uri直接填写服务名称即可
        return restTemplate.getForObject("http://DEMO-PROVIDER/user/getName/" + name, String.class);
    }
}

3. 负载均衡策略

  • RoundRobinRule:轮询,默认使用的规则;
  • RandomRule:随机;
  • AvailabilityFilteringRule:先过滤由于多次访问故障而处于断路器跳闸状态以及并发连接数量超过阀值得服务,然后从剩余服务列表中按照轮询策略进行访问;
  • WeightedResponseTimeRule:根据平均响应时间计算所有的权重,响应时间越快服务权重越有可能被选中;
  • RetryRule:先按照 RoundRobinRule 策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务;
  • BestAvailableRule:先过滤由于多次访问故障而处于断路器跳闸状态的服务,然后选择并发量最小的服务;
  • ZoneAvoidanceRule:判断 server 所在区域的性能和 server 的可用性来选择服务器。