app开发定制Spring Cloud之Ribbon

Ribbon是什么

是Netflixapp开发定制发布的开源项目,app开发定制主要功能是提供客户端app开发定制的软件负载均衡算法和服务调用。Ribbonapp开发定制客户端组件提供一系列app开发定制完善的配置项,app开发定制如连接超时,重试等。简单来说,app开发定制就是在配置文件中列出Load Balancerapp开发定制后面所有的机器,Ribbonapp开发定制会自动的帮助我们基于某种规则(app开发定制如简单轮询,app开发定制随机连接等)去连接这些机器,我们很容易使用Ribbon实现自定义的负载均衡算法

下图是使用Ribbon时的大致架构

Nginx和Ribbon区别

负载均衡分为集中式和进程内

集中式负载均衡:

即在服务的消费方和提供方之间使用独立的设施(可以是硬件,如FS,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发到提供方

进程内负载均衡:

将负载均衡逻辑集成到消费方,消费方从服务注册中心获知哪些地址可用,然后自己再从这些地址中选择一个合适的服务器,Ribbon就属于进程内负载均衡,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

是服务器负载均衡,客户端所有的请求都会交给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()就获取了我们发起请求的地址

;

然后通过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的负载均衡!!!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发