格物致知,格ribbon实现的客户端负载均衡。
控制HTTP和TCP客户端的行为,根据服务提供者地址列表,ribbon可以自动的帮助服务消费者取请求。ribbon默认提供了很多的负载均衡算法,例如轮询,随机等。我们也可以为Ribbon实现自定义的负载均衡算法。
Spring Cloud中,Ribbon自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
整合Ribbon
spring-cloud-starter-eureka中已经包含了 spring-cloud-starter-ribbon
为服务消费者的restTemplate加上注解即可:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
获取当前的选择是哪个节点:
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/log-instance")
public void logUserInstance() {
ServiceInstance instance = this.loadBalancerClient.choose("user-service");
log.info("{}:{}:{}", instance.getServiceId(), instance.getHost(), instance.getPort());
}
更改ribbon配置
- 使用java代码方式更改。比如负载均衡算法:
以下RibbonConfiguration类不能包含在@ComponentScan中,也就是不能包含在main方法类的同级或者子目录中,应该新建一个包隔开,否则这个类中的所有配置信息就会被所有的@RibbonClient共享。
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
@Configuration
@RibbonClient(name="user-service", configuration = RibbonConfiguration.class)
public class TestConfiguration {
// 为特定服务user-service的Ribonn Client自定义配置。创建一个空类即可。
}
- 使用配置的方式,从Spring Cloud Netflix 1.2.0开始支持(Camden SR4使用的版本是1.2.4),实现效果和java方式一样。
user-service:
ribbon:
NFLoadBalanceRuleClassName: com.netflix.loadbalancer.RandomRule
Ribbon均衡负载单独使用
spring-cloud-starter-ribbon替代spring-cloud-starter–eureka,
使其脱离eureka-server(不注册到Eureka Server上)去掉类上的@EnableDiscoveryClient注解
- 将application.yml改成如下
server:
port: 8010
spring:
application:
name: movie-service
user-service:
ribbon:
listOfServers: localhost:8000,localhost:8001