Spring Cloud Ribbon封装了Netflix Ribbon,是基于HTTP和TCP的客户端负载均衡器。 它主要包括六个组件:
- ServerList:负载均衡使用的服务器列表。
- ServerListFilter:服务器列表过滤器。
- IPing:探测服务实例是否存活的策略。
- IRule:负载均衡策略,轮询、随机、根据响应时间加权等。
- ILoadBalancer:负载均衡器。
- RestClient:服务调用器。
Ribbon工作时会做四件事情:
- 优先选择在同一个Zone且负载较少的Eureka Server;
- 定期从Eureka更新并过滤服务实例列表;
- 根据用户指定的策略,在从Server取到的服务注册列表中选择一个实例的地址;
- 通过RestClient进行服务调用。
服务消费
- 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>
- application.properties配置
spring.application.name=ribbon-consumer
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
- 注解@EnableDiscoveryClient开启eureka-client
- 注解@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