前言:消费者获取出多个服务提供者的地址后,按一定的规则请求这多个相同服务中的一个,实现负载均衡。Ribbon的这种负载均衡可理解为针对消费者请求时做的。
1、Ribbon简介
SpringCloud中,当Ribbon和Eureka配合使用,Ribbon可自动从Eureka Server中获取供给方地址列表,基于负载均衡算法(也可以自定义算法)请求其中一个服务提供者实例。如图:
2、为服务消费者整合Ribbon
2.1、pom文件
(注意:spring-cloud-starter-eureka中是包含有ribbon依赖的,所以有前者就不需要导后者了)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.2、为RestTemplate对象添加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@LoadBalanced注解可以为RestTemplate整合Ribbon,使其具备负载均衡能力。
2.3、具体负载均衡代码
@Autowired
private LoadBalancerClient loadBalancerClient;
public void logUserInstance(){
ServiceInstance serviceInstance = loadBalancerClient.choose("microservice-provider- user");
sytem.out.println(serviceInstance.getServiceId());
sytem.out.println(serviceInstance.getHost());
sytem.out.println(serviceInstance.getPort());
}
microservice-provider-user 是用户微服务的虚拟主机名。当Ribbon和Eureka配合使用时,会自动将虚拟主机名映射成微服务的网络地址。
- 默认情况下,虚拟主机名和服务名称是一致的。当然,也可以使用配置属性eureka.instance.virtual-host-name指定虚拟主机名,虚拟主机名不能包含“_”之类的字符,否则会异常。
- 不能将restTemplate.getForObject(...) 和 loadBalancerClient.choose(...) 写在同一方法里,两者之间会有冲突——因为此时代码中的restTemplate实际上是一个Ribbon客户端,本身已经包含了“choose”的行为。
3、自定义Ribbon配置
很多场景下,都要根据需求自定义Ribbon配置。比如修改负载均衡规则等。Spring Cloud Camden允许使用Java代码或属性自定义Ribbon的配置。两种方式等价。
3.1、Java代码自定义Ribbon的配置
3.2、使用属性自定义Ribbon的配置
4、脱离Eureka使用Ribbon
没有Eureka,所有不能从第三方获取服务提供者的地址等信息。这时候就把地址配置在消费者项目里,给Ribbon随机就可以了。
4.1、pom配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
4.2、启动类上去掉@EnableDiscoveryClient注解
该注解是属于Eureka的
4.3、yml配置文件
microservice-provider-user:
ribbon:
listOfServers: localhost:8000,localhost:8001