博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud 之Ribbon客户端负载均衡
阅读量:2456 次
发布时间:2019-05-10

本文共 4975 字,大约阅读时间需要 16 分钟。

文章目录

Ribbon简介

官网地址:

Ribbon进入维护状态了。 所以不建议使用了,替代方案是:Spring Cloud loadBalancer
在这里插入图片描述
在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于Http Restful的。SpringCloud有两种服务调用方式,一种是Ribbon+RestTemplate,另一种是Feign

Ribbon 是一个负载均衡客户端,可以很好的控制HTTP和TCP的一些行为。

Feign 默认集成了Ribbon。
Eureka Client 默认也集成了 Ribbon。
在这里插入图片描述
架构:
在这里插入图片描述
在这里插入图片描述
总结: Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中一个实例。

负载均衡

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

快速入门

创建一个model工程作为服务消费者,即eureka-ribbon-client

导入依赖

org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-ribbon

向程序的IOC注入一个Bean:RestTemplate;并通过@LoadBalanced注解表明这个RestTemplate开启负载均衡的功能。

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.context.annotation.Bean;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@SpringBootApplication@EnableEurekaClientpublic class EurekaRibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaRibbonClientApplication.class, args); } @Bean // 开启负载均衡功能 @LoadBalanced public RestTemplate restTemplate(){
return new RestTemplate(); }}

配置文件appication.yml

server:  port: 8082spring:  application:    name: eureka-ribbon-clienteureka:  client:    serviceUrl:      defaultZone: http://localhost:8100/eureka/

编写控制器,通过之前注入到IOC容器的RestTemplate来消费服务注册中心的服务,在这里直接用服务名替代了具体的URL地址,在Ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的URL替换掉服务名。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;@RestControllerpublic class DemoController {
@Autowired RestTemplate restTemplate; @GetMapping("/ribbon") public String demo() {
return restTemplate.getForObject("http://eureka-client/hello", String.class); }}

启动测试

将同一个将要被消费的服务注册多个实例到注册中心。
分别启动注册中心,被消费的服务和当前的Ribbon服务。
在浏览器上多次访问http://127.0.0.1:8082/ribbon,浏览器交替显示:

hello port:8091

hello port:8081

Ribbon源码分析

Ribbon 的 负载均衡主要是通过 LoadBalancerClient 来实现的。

根据IRule 的实现类策略进行负载均衡,默认是:RoundRobinRule即轮询。
在这里插入图片描述
设置访问某个服务的具体策略:

serviceId.ribbon.NFLoadBalancerRuleClassName=自定义的负载均衡策略类
# eureka-client是服务IDeureka-client:  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

负载均衡策略:

接口:com.netflix.loadbalancer.IRule,其实现类:
在这里插入图片描述
RoundRobinRule:轮询
RandomRule:随机

在 RestTemplate 加上@LoadBalance 注解后,RestTemplate 对象添加了拦

截器org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor。在拦截器的方法中 ,将远程调度方法交给了 Ribbon 的 负载均衡器org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient去处理,然后通过serverId查找服务地址,通过一定的负载均衡策略去做真正的请求,从而达到了负载均衡的目的。

拦截器断点:

在这里插入图片描述
Ribbon负载均衡客户端断点:
在这里插入图片描述

LoadBalancerClient 实现负载均衡的简单原理

LoadBalancerClientSpringCloud提供的负载均衡器客户端抽象接口

LoadBalancerClient先从提供的服务中获取某一个实例(默认策略为轮询),比如订单服务需要访问商品服务,商品服务有3个节点,LoadBalancerClient会通过choose(),方法获取到3个节点中的一个服务,拿到服务的信息之后取出服务ip信息,就可以得到完成的想要访问的ip地址和接口,最后通过RestTempate访问商品服务。

SpringCloud提供的组件Ribbon,内部实现了LoadBalancerClient接口,实现类RibbonLoadBalancerClient,通过@LoadBalance注解开启负载均衡器。

Spring Cloud loadBalancer内部的实现类是:BlockingLoadBalancerClient

解析LoadBalancerClient接口源码:

在这里插入图片描述
LoadBalancerClient接口继承了ServiceInstanceChooser接口,主要的方法为2个execute方法,均是用来执行请求的,还有个reconstructURI()是用来重构URL的。

进入ServiceInstanceChooser接口中,可以看到主要的方法为choose(),用来根据服务的名称,获取来选择其中一个服务实例,也就是根据seriverId获取ServiceInstance

在这里插入图片描述

解析LoadBalancerClient接口实现类RibbonLoadBalancerClient:

RibbonLoadBalancerClient实现了服务的负载和选择,以及负载策略的配置,整个的负载均衡都由它实现。

  • choose(),用来选择具体的服务实例。
  • getServer(),获取实例。
  • 最终通过ILoadBalancer去做服务选择实例。
    在这里插入图片描述
    进入 ILoadBalancer 实现类BaseLoadBalancer看下:
    在这里插入图片描述
    从上面我们看到ILoadBalancer中的chooseServer方法里面默认值为:default
    在这里插入图片描述
    可以看到这个ruleIRule接口声明出来的,且默认定义的实现类是RoundRobinRule,也就是轮询策略。

IRule接口定义了3个方法,choose是用来选择实例的,setLoadBalancer和getLoadBalance用来设置和获取ILoadBalancer的。

在这里插入图片描述
下面是IRule接口的所有实现类:
在这里插入图片描述
通过IRule接口实现来设置负载策略:
在这里插入图片描述
总结:
1、LoadBalancerClient——>RibbonLoadBalancerClient中的choose()
首先需要传一个serverId,也就是服务id,通过LoadBalancerClient接口调用实现类RibbonLoadBalancerClient中的 choose(serverid) 方法。
在这里插入图片描述
2、choose()---->getServer(ILoadBalancer loadbalance)----->chooseServer()
choose(serverid)内部调用getServer(ILoadBalancer loadBalancer, Object hint),getServer方法通过ILoadBalancer类进行了负载策均衡之旅。
在这里插入图片描述
3、实现chooseServer()方法
接着通过实现ILoaddBalancer接口的chooseServer(Object key)方法,实现类为BaseLoadBalancer
在这里插入图片描述
4、过IRule接口,自定义负载策略。
其实LoadBalancerClient 还有个核心类IPing,这里就不多解析了,向EurekaClient获取注册列表信息,默认每10秒向EurekaClient发送一次ping,进而检查是否需要更新服务的注册列表信息。
负载均衡的实现LoadBalancerClient具体交给了ILoadBalancer来处理,ILoadBalancer通过配置IRule、IPing等,向EurekaClient获取注册列表信息,默认每10秒向EurekaClient发送一次ping,进而检查是否需要更新服务的注册列表信息。最后,在得到服务注册列表信息后,ILoadBalancer根据IRule的策略进行负载均衡。
在这里插入图片描述

转载地址:http://ngdhb.baihongyu.com/

你可能感兴趣的文章
lynda ux_UX编排原理
查看>>
创建微信机器人和女朋友聊天_创建聊天机器人
查看>>
scrum master_从Scrum Master到工程副总裁:职称为何重要
查看>>
sdlc 瀑布式 生命周期_SDLC指南–软件开发生命周期的阶段和方法
查看>>
大omega记号_什么是大欧米茄符号?
查看>>
react 使用 mobx_如何使用React和MobX状态树构建基于状态的路由器
查看>>
移动认证_如何在移动设备上实施安全的生物特征认证
查看>>
敏捷开发创始人_开发人员和技术创始人如何将他们的想法转化为UI设计
查看>>
node aws 内存溢出_在AWS Elastic Beanstalk上运行生产Node应用程序的现实
查看>>
我如何在昌迪加尔大学中心组织Google Hash Code 2019
查看>>
子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...
查看>>
aws中部署防火墙_如何在AWS中设置自动部署
查看>>
typescript_如何掌握高级TypeScript模式
查看>>
golang底层深入_带有Golang的GraphQL:从基础到高级的深入研究
查看>>
如何选择正确的容器编排以及如何进行部署
查看>>
出现字迹模糊迹象_改变迹象:如何使用动态编程解决竞争性编程问题
查看>>
angular 渐进_如何创建具有Angular和无头CMS的渐进式Web应用程序
查看>>
Dash的快速入门将使您在5分钟内进入“ Hello World”
查看>>
cake php_如何(以及为什么)在Swinject中使用Cake Pattern
查看>>
用户体验改善案例_用户体验案例研究:建立更好的体验(重新设计“和平航空”网站)...
查看>>