01 Spring Cloud Ribbon

Wu Jun 2019-12-25 15:59:03
10 微服务 > 1 服务调用

Spring Cloud Ribbon封装了Netflix Ribbon,是基于HTTP和TCP的客户端负载均衡器。 它主要包括六个组件:

Ribbon工作时会做四件事情:

  1. 优先选择在同一个Zone且负载较少的Eureka Server;
  2. 定期从Eureka更新并过滤服务实例列表;
  3. 根据用户指定的策略,在从Server取到的服务注册列表中选择一个实例的地址;
  4. 通过RestClient进行服务调用。

服务消费

  1. pom依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
  1. application.properties配置
spring.application.name=ribbon-consumer
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
  1. 注解@EnableDiscoveryClient开启eureka-client
  2. 注解@LoadBalanced开启客户端负载均衡;直接通过RestTemplate发起请求。
@RestController
public class DcController {

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

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/consumer")
    public String dc() {
        return restTemplate.getForObject("http://eureka-client/dc", String.class);
    }
}

host是服务名。Ribbon的拦截器,能在调用时,根据服务名自动选取服务实例,以实际请求的IP地址和端口替换,从而完成服务接口的调用。 5. 主要参数配置

# 负载均衡类,默认为om.netflix.loadbalancer.ZoneAwareLoadBalance
<clientName>.<nameSpace>.NFLoadBalancerClassName=xx
# 负载均衡规则类,默认为com.netflix.loadbalancer.AvailabilityFilteringRule
<clientName>.<nameSpace>.NFLoadBalancerRuleClassName=xx
# 心跳检测类,默认为com.netflix.loadbalancer.DummyPing
<clientName>.<nameSpace>.NFLoadBalancerPingClassName=xx
# 服务列表类,默认为com.netflix.loadbalancer.ConfigurationBasedServerList,结合eureka使用时默认为com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
<clientName>.<nameSpace>.NIWSServerListClassName=xx
# 服务过滤类,默认为com.netflix.loadbalancer.ZoneAffinityServerListFilter。结合spring cloud eureka使用时默认为org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter
<clientName>.<nameSpace>.NIWSServerListFilterClassName=xx

参考: Spring Cloud技术分析(1)——服务治理