springCloud入门学习(六):使用Ribbon实现负载均衡

在之前,我使用ip+端口来访问服务提供者。但一般来说,在生产环境中,通常一个服务会有多个实例。那么服务消费者应该如何将请求分摊到多个服务提供者呢?

一、Ribbon

Ribbon是Netflix发布的负载均衡其。当我们为Ribbon配置服务提供者的地址列表后,Ribbon就可基于某种负载均衡的算法,自动帮助服务消费者请求。

二、Ribbon与Eureka配合使用

Riboon会自动从Eureka获取服务提供者的服务列表,然后通过负载均衡算法请求其中的一个实例。

三、整合Riboon

1、修改movie项目,由于已经介入了spring-cloud-starter-eureka包,不必再次引入Ribbon的包,Ribbon单独依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

2、修改启动类,为RestTemplate添加注解

 @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

3、修改controller,之前我们是使用ip+端口的方式进行访问的,这里将  ip+端口 改为我们要调动的微服务的serviceId,即服务提供者的spring.application.name字段,这样,Eureka会自动将虚拟主机名英社称微服务的网络地址。如果我们依然通过 ip+端口号 的方式进行访问,实际上我们只能访问其中的一个实例,并没有做到真正的负载均衡。

@RequestMapping(value = "/movie/findById", method = RequestMethod.GET)
public Map findById(Integer userId) {
    log.info("/movie/findById被访问,参数:userId=" + userId);
    /*ResponseEntity<HashMap> forEntity =
            this.restTemplate.getForEntity(findByUserIdUrl + userId, HashMap.class);*/
    return this.restTemplate.getForObject("http://user/user/getUserInfo?userId=" + userId, HashMap.class);

}

此时启动movie和eureka项目,同时启动多个user项目

image.png

注册中心这里引入了两个user实例

此时访问 http://localhost:8020/movie/findById?userId=1,并且多次访问

image.png

获取到结果,说明访问成功。

再来看user的控制台:

image.png

另一台端口号为8011的服务也出现了同样的打印信息,说明Ribbon均匀的将请求分配到两个实例中,实现了负载均衡



猜你喜欢

转载自blog.51cto.com/13593129/2398217