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

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

1、Ribbon算法

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

2、Ribbon与Eureka配合使用网络

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

3、整合Riboon负载均衡

一、修改movie项目,因为已经介入了spring-cloud-starter-eureka包,没必要再次引入Ribbon的包,Ribbon单独依赖:ide

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

二、修改启动类,为RestTemplate添加注解微服务

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

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

@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项目rest

image.png

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

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

image.png

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

再来看user的控制台:

image.png

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

相关文章
相关标签/搜索