Ribbon简介
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载算法,自动地帮助服务消费者去请求。Ribbon默认的负载算法有很多,比如轮询,随机等。当然也可以自定义负载均衡算法。
在SpringCloud中,当Ribbon与Eureka配合使用时,Ribbon可以自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
启动两个到三个之前写好的服务提供者。
编写服务的消费者microservice-provider-movie
pom.xml添加如下依赖,因为spring-cloud-starter-netflix-eureka-client包含spring-cloud-starter-netflix-ribbon,无须再次引入。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
修改启动类,注入RestTemplate,添加@LoadBalanced注解
@SpringBootApplication
public class MicroserviceSimpleConsumerMovieApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class, args);
}
}
编写Controller,添加两个接口findById调用服务提供者,logUserInstance打印服务提供者的信息
@RestController
public class MovieController {
private final Logger logger = LogManager.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://microservice-provider-user/" + id, User.class);
}
@GetMapping("/log-user-instance")
public void logUserInstance() {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user");
logger.info("{},{},{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort());
}
}
启动microservice-provider-movie,调用findById输出microservice-provider-user服务提供者返回的信息。多次调用log-user-instance,我们可以看到打印的服务提供者的信息,如下图:
可以看出Ribbon已经将请求负载到三个服务提供者上。