如何使用Ribbon的方法实现负载均衡
下文给大家带来如何使用Ribbon的方法实现负载均衡,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验来做一个解答。
在之前,我使用ip+端口来访问服务提供者。但一般来说,在生产环境中,通常一个服务会有多个实例。那么服务消费者应该如何将请求分摊到多个服务提供者呢?
一、Ribbon
Ribbon是Netflix发布的负载均衡其。当我们为Ribbon配置服务提供者的地址列表后,Ribbon就可基于某种负载均衡的算法,自动帮助服务消费者请求。
二、Ribbon与Eureka配合使用
Riboon会自动从Eureka获取服务提供者的服务列表,然后通过负载均衡算法请求其中的一个实例。
三、整合Riboon
1、修改movie项目,由于已经介入了spring-cloud-starter-eureka包,不必再次引入Ribbon的包,Ribbon单独依赖:
org.springframework.cloud spring-cloud-starter-ribbon
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); /*ResponseEntityforEntity = this.restTemplate.getForEntity(findByUserIdUrl + userId, HashMap.class);*/ return this.restTemplate.getForObject("http://user/user/getUserInfo?userId=" + userId, HashMap.class);}
此时启动movie和eureka项目,同时启动多个user项目
注册中心这里引入了两个user实例
此时访问 http://localhost:8020/movie/findById?userId=1,并且多次访问
获取到结果,说明访问成功。
再来看user的控制台:
另一台端口号为8011的服务也出现了同样的打印信息,说明Ribbon均匀的将请求分配到两个实例中,实现了负载均衡
看了以上关于如何使用Ribbon的方法实现负载均衡,如果大家还有什么地方需要了解的可以在行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,技术工程师在行业内拥有十几年的经验了。