| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring Cloud之Ribbon -> 正文阅读 |
|
[Java知识库]Spring Cloud之Ribbon |
Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单来说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助我们基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们很容易使用Ribbon实现自定义的负载均衡算法 下图是Eureka使用Ribbon时的大致架构 Nginx和Ribbon区别负载均衡分为集中式和进程内集中式负载均衡:即在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如FS,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发到提供方 进程内负载均衡:将负载均衡逻辑集成到消费方,消费方从服务注册中心获知哪些地址可用,然后自己再从这些地址中选择一个合适的服务器,Ribbon就属于进程内负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址 Nginx是服务器负载均衡,客户端所有的请求都会交给Nginx,然后由Nginx实现转发请求,即负载均衡是由服务端实现的,因此Nginx是集中式 Ribbon是本地负载均衡,再调用微服务接口时,会在注册中心上拉取注册信息服务列表之后缓存到本地,从而在本地实现远程服务调用技术,因此Ribbon是进程内 应用场景的区别Nginx适合服务端实现负载均衡,比如Tomcat,而Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,如SpringCloud和Dubbo都是采用本地负载均衡。 Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例 使用案例①引入依赖 在我们的pom文件中,并没有引入我们的Ribbon的依赖,但是我们引入了eureka的客户端依赖,里面就已经跟Ribbon整合了(因此不用引用Ribbon的依赖,但是引入也不错) ②Ribbon通常和RestTemplate一起使用 Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心ip地址和端口号 主启动类 微服务(服务提供者)集群搭建: ?可以看出来,我们的服务提供者都是cloud-payment-service,只是端口号不一样,此时启动我们的服务,进入Eureka页面 但是我们发起的请求(http://cloud-payment-service/XXX)我们的浏览器是不能解析的,不是真实可用的地址,需要通过Ribbon来拦截我们的请求,然后Ribbon发送给Eureka服务端拉cloud-payment-service,然后Eureka服务端返回服务列表给Ribbon,然后Ribbon通过负载均衡来轮询到指定的服务 我们主程序中的配置类上面的@LoadBalanced注解,标记我们RestTemplate发起的请求需要被Ribbon进行拦截 我们进行源码分析: 我们找到LoadBalancerInterceptor这个类,点进去ClientHttpRequestInterceptor 我们发现有一个intercept接口方法,这个方法就会拦截我们的http请求,而我们的RestTemplate正是发送http请求的 我们来到LoadBalancerInterceptor类实现intercept方法 其中request.getURI()就获取了我们发起请求的地址 http://cloud-payment-service/XXX; 然后通过originalUri.getHost()获取了主机名称:cloud-payment-service 然后return语句中的loadBalancer就是RibbonLoadBalancerClient的对象(此时就见到了Ribbon),然后执行execute方法执行 我们找到LoadBanlanceClient的实现类RibbonLoadBalancerClient 这就是我们Ribbon拉取Eureka服务端的请求地址 接下来我们进行轮询,选择一个服务 接下来的getServer方法就是负载均衡,一直往下走,就会有一个rule.choose(),这个rule是接口IRule接口的实现类,然后我们查看IRule的实现类,发现有 其中RoundRibinRule就是轮询的意思,轮询负载均衡,执行完getServer方法之后,就会拿到8081这个端口,因此就可以用真实的ip代替我们RestTemplate发起的不能解析的请求,实现正常的请求访问 总结一下: ?????? 请求会被一个叫LoadBalancerInterceptor(负载均衡拦截器)的拦截器拦截,拦下来以后得到请求中的服务名称交给RibbonLoadBalancerClient,然后RibbonLoadBalancerClient就会把服务名称交给DynamicServerListLoadBalancer,DynamicServerListLoadBalancer就会去eureka中拉取服务列表,然后DynamicServerListLoadBalancer就会找一个IRule,IRule就会根据拉取来的服务列表基于规则轮询,选择某个服务,然后返回给我们的RibbonLoadBalancerClient,然后RibbonLoadBalancerClient就会用ip和端口替换服务名称,得到真实的地址 IRule策略其中IRule接口决定了负载均衡的策略 默认的是zoneAvoidanceRule,它的父类的父类后面是RoundRobinRule结尾的,因此zoneAvoidanceRule也有轮询的功能 RetryRule是先按照RoundRobinRule的策略获取服务,如果获取失败的话则在指定时间内会进行重试,获取可用的服务 WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择 BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个 AvailablityFilteringRule:先过滤掉故障实例,再选择并发较小的实例 ZoneAvoidanceRule:默认规则,符合判断server所在区域的性能和server的可用性选择服务器 此时我们的服务器集群总数量,是我们去访问的服务的集群总数量,并不是所有微服务的总集群数量!!! 我们研究一下我们的默认的RoundRobinRule的源码 我们的IRule里面的choose就是我们选择的规则 找到我们的RoundRobinRule,其中实现了我们的choose方法 这就是我们的Ribbon的负载均衡!!! ? ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:05:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |