Ribbon简介
分布式系统中,各个微服务会部署多个实例,如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器
Ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询、随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发
为服务消费者整合Ribbon
添加 Ribbon 依赖库
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-ribbobn</artifactId> </dependency>
给 RestTemplate 添加 @LoadBalaced 注解,就可整合 RestTemplate 和 Ribbon
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
修改Controller,请求地址修改为 http://flim-user/user/ ,当 Ribbon 和 Eureka 配合使用时,会自动将虚拟主机名映射成微服务的网络地址,并注入了 LoadBalancerClient 输出当前选择的微服务节点
@RestController public class MovieController { private final Logger log = LoggerFactory.getLogger(MovieController.class); @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/user/{id}") public User findById(@PathVariable int id){ return this.restTemplate.getForObject("http://flim-user/"+id,User.class); } @GetMapping("/log-instance") public void logInstance(){ ServiceInstance serviceInstance = this.loadBalancerClient.choose("flim-user"); log.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort()); } }
运行测试程序
{"id":1,"username":"account1","name":"张三","age":20,"balance":100.00}
多次访问 http://localhost:8010/log-instance 控制台会输出以下信息
可以看到请求会均匀的分布到两个用户微服务上
2017-12-17 20:47:53.975 INFO 12313 --- [nio-8010-exec-2] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.215 INFO 12313 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.445 INFO 12313 --- [nio-8010-exec-3] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 20:47:54.690 INFO 12313 --- [nio-8010-exec-4] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 20:47:54.935 INFO 12313 --- [nio-8010-exec-5] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
注意 :不能将 restTemplate.getForObject(...) 与 loadBalancerClient.choose(...) 写在同一方法中,因为 rest-Template 实际上就是一个 Ribbon 客户端,本身已经包含“choose”行为
代码方式配置 Ribbon
可以使用Java代码或属性自定义 Ribbon 的配置,Ribbon 默认配置类是 RibbonClientConfiguration,也可以使用一个 POJO 自定义 Ribbon 配置,这种 配置是细粒度的,不同的 Ribbon 客户端可以使用不同的配置
创建 Ribbon 配置类
/** * 该类为配置类 * 不应该被ComponentScan扫描 */ @Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule(){ //配置负载均衡的规则,更改为随机 return new RandomRule(); } }
使用 @RibbonClient 或 @RibbonClients 注解为服务提供者指定配置类
@SpringBootApplication @EnableDiscoveryClient @RibbonClient(name = "flim-user",configuration = RibbonConfiguration.class) public class FlimConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(FlimConsumerApplication.class, args); } }
访问测试地址 http://localhost:8010/log-instance 可看见请求会随机分布到两微服务上
2017-12-17 21:08:52.769 INFO 12524 --- [nio-8010-exec-7] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:52.946 INFO 12524 --- [nio-8010-exec-8] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.138 INFO 12524 --- [nio-8010-exec-9] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
2017-12-17 21:08:53.319 INFO 12524 --- [io-8010-exec-10] com.linyuan.controller.MovieController : flim-user:linyuandembp:8764
2017-12-17 21:08:53.511 INFO 12524 --- [nio-8010-exec-1] com.linyuan.controller.MovieController : flim-user:linyuandembp:8763
注意 :RibbonConfiguration 类不能被 @ComponentScan 扫描到,否则配置信息就会被所有 @RibbonClient 共享,因此如果只想自定义某个 Ribbon 客户端的配置,必须防止被 @ComponentScan 扫描
配置文件方式配置 Ribbon
通过配置文件方式自定义 Ribbon 属性更加方便,配置的前缀是 <clientName>.ribbon.
通过配置文件定义Ribbon配置
flim-user: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
常用的 Ribbon 全局配置
ribbon: ConnectionTimeout: #连接超时时间 ReadTimeout: #读取超时时间 OkToRetryOnAllOperatotions: #对所有操作请求都进行重试 MaxAutoRetriesNextServer: #切换服务器实例的重试次数 MaxAutoRetries: #对当前实例的重试次数 ServerListRefreshInterval: #刷新服务列表源的间隔时间
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
点击下方链接观看: https://www.bilibili.com/video/BV1Ji4y1g7pD/
本文向大家介绍Spring Cloud Ribbon负载均衡器处理方法,包括了Spring Cloud Ribbon负载均衡器处理方法的使用技巧和注意事项,需要的朋友参考一下 接下来撸一撸负载均衡器的内部,看看是如何获取服务实例,获取以后做了哪些处理,处理后又是如何选取服务实例的。 分成三个部分来撸: 配置 获取服务 选择服务 配置 在上一篇《撸一撸Spring Cloud Ribbon的原理》的
本文向大家介绍SpringCloud与Consul集成实现负载均衡功能,包括了SpringCloud与Consul集成实现负载均衡功能的使用技巧和注意事项,需要的朋友参考一下 负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡基本概念有:实服务
本文向大家介绍详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑,包括了详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑的使用技巧和注意事项,需要的朋友参考一下 一,问题 采取eureka集群、客户端通过Ribbon调用服务,Ribbon端报下列异常 Spring Cloud版本比较乱,版本关联引用更是乱,最终我切换到 <spring-clou
负载均衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡服务通常是由专用软体和硬件来完成。 负载均衡最重要的一个应用是利用多台服务器提供单一服务,这种方案有
负载均衡包括负载均衡实例、访问控制及证书。 实例 负载均衡实例是一个运行的负载均衡服务,通过设置的虚拟IP接收流量并将其转发分配给后端服务器。 访问控制 访问控制用于设置访问负载均衡的IP白名单或IP黑名单。 证书 当在负载均衡实例上配置HTTPS监听转发来自HTTPS协议的请求时,需要配置证书。