Ribbon简介
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。
为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自
动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载聚恒算法,例如
轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server
获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
为服务消费者整合Ribbon
1.复制项目microservice-consumer-movie,将ArtifactId修改为microservice-consumer-movie-ribbon。
2.为项目添加Ribbon依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
3.为RestTemplate添加@LoadBalanced注解
两者对比可以发现,只须添加注解@LoadBalanced,就可以为RestTemplate
整合Ribbon,使其具备负载均衡的能力。
4.修改Conroller
@RestController
public class MovieController {
private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://users/" + id, User.class);
}
@GetMapping("/log-instance")
public void logUserInstance(){
ServiceInstance serviceInstance = this.loadBalancerClient.choose(
"users");
//打印当前选择的是哪个节点
MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort() );
}
}
5.测试
1.启动microservice-discovery-eureka。
2.启动 2个或者多个 microservice-provider-user实例。
3.启动microservice-consumer-movie-ribbon。
4.访问http://localhost:8761,如图
5.多次访问http:localhost:8010/user/1,返回结果如下:
同时,控制台会打印查询如下日志:
6.多次访问http://localhost:8010/log-instance,控制台就会打印如下的日志
注意点:
1.虚拟主机名和虚拟IP非常相似,如果大家接触过 HAProxy或Heartbeat,理解虚拟主机名就非常容易了。
如果无法理解虚拟主机名,可将其简单理解成为提供者的服务名称,因为在默认情况下,虚拟主机名和服务
名称是一致的。当然,也可以使用配置属性eureka.instance.virtual-host-name或eureka.instance.secure-
virtual-host-name指定虚拟主机名。
2.不能将restTemplate.getForObject(...)与loadBalancerClient.choose(...)写在同一个方法中,
两者之间会有冲突—因为此时代码中的 rest-Template 实际上是一个Ribbon客户端,本身已经包含“choose”的行为。
3.虚拟主机名不能包含“_”之类的字符,否则Ribbon在调用时会报异常。
本文大部分内容转载自周立的《Spring Cloud与Docker微服务架构实战》