在以前,我使用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
注册中心这里引入了两个user实例
此时访问 http://localhost:8020/movie/findById?userId=1,而且屡次访问
获取到结果,说明访问成功。
再来看user的控制台:
另外一台端口号为8011的服务也出现了一样的打印信息,说明Ribbon均匀的将请求分配到两个实例中,实现了负载均衡