- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringCloud Netflix Ribbon源码解析(推荐)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
首先会介绍ribbon 相关的配置和实例的初始化过程,然后讲解ribbon 是如何与openfeign 集成的,接着讲解负载均衡器loadbalancercli ent , 最后依次讲解iloadb alancer的实现和负载均衡策略rule 的实现.
@ribbonclient 注解可以声明ribbon 客户端,设置ribbon 客户端的名称和配置类,configuration 属性可以指定@configuration 的配置类,进行ribbon 相关的配置。@ribbonclient还会导入( import ) ribbonclientconfigurationregistrar 类来动态注册ribbon 相关的beandefinition。 ribbonclientconfigurationregistrar 是importbeandefinitionregistrar 的实现类,importbeandefinitionregistrar 是spring 动态注册beandefinition 的接口, 可以用来注册ribbon 所需的beand的iition , 比如说ribbon客户端实例( ribbon client ) lmportbeandefinitionregistrar的registerbeandefinitions 方法可以注册ribbon 客户端的配置类, 也就是@ribbonclient 的configuration 属性值 。
feigncjientfactorybean 是创造feignclient 的工厂 类,在其getobject 方法中有一个分支判断,当请求url 不为空时, 就会生成一个具有负载均衡的feignclient 。在这个过程中, openfeign 就默认引入了ribbon 的负载均衡实现. 。
loadbalancerfeignclient#execute 方法会将普通的request 对象转化为ribbonrequest , 并使用feignloadbalancer 实例来发送ribbonrequest。execute 方法会首先将request 的url转化为对应的服务名称,然后构造出ribbonrequest 对象,接着调用lbclient 方法来生成feignloadbalancer 实例,最后调用feignloadbalancer 实例的executewithloadbalancer 方法来处理网络请求.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//loadbalancerfeignclient java
public
response execute(reqest reqi且est, request .options options)
throws
工oexception {
try
{
// :负载均衡时, host 就是需要调用的服务的名称
uri asurn= uri . create(request.url()) ;
string clientname = asur. gethost();
uri ur 工withouthost = cleanurl(reqi且est . url(), cl 工entname) ;
//构造ribbonrequest,delegate 一般就是真正发送网络请求的客户端,比如说okhttpclient
和apacheclient
fe 工gnloadbalancer . r 工bbonrequest ribbonrequest =
new
feignloadbalancer .
ribbonrequest(
this
. delegate , re 守uest , ur 工withouthost) ;
iclientconfig requestconfig = getclientconfig(options, clientname) ;
//executewithloadbalancer是进行负载均衡的关键
return
lbclient(clientname) . executewithloadbalancer(ribbonrequest ,
requestconfig) . toresponse () ;
catch
(clientexception e) {
ioexception io = findioexception(e) ;
if
( io ! =
null
) {
throw
io;
throw
new
runtimeexception(e) ;
private
feignloadbalancer lbcl 工ent(str 工ng cl 工entname) {
//调用cachingspringloadbalancerfactory 类的create方法。
return
this
. lbclientfactory . create(clientname) ;
|
lbclientfactory 的参数是cachingspringloadbalancerfactory 的实例, 它是带有缓存机制的feignloadbalancer 的工厂类.
create 方法的clientname 参数是指http 请求对应的服务端名称, 它会首先使用这个名称去缓存中查找是否已经存在对应的实例。如果没有, 再根据系统是否支持请求重试来创建出不同的f eignloadbalancer 实例, 最后将该实例存储到缓存中. 。
feignloadbalancer 是openfeign 在不需要重试机制的情况下默认的负载均衡实现。它的execute 方法的实现很简单,使用ribbonrequest 对象的客户端来发送网络请求,然后 将response 包装成ribbonresponse 进行返回。ribbonrequest 的request 方法返回的对象就是构造ribbonrequest 对象时传入的delegate 参数。该参数是client 接口的实例, client接口是openfeign 真正发送网络请求的客户端, 比如说okhttpclient 和apacheclient 。feignloadbalancer 的execute 方法如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//fe i gnloadbalancer. ] ava
public
ribbonresponse execute(ribbonrequest request , iclientconfig configoverride)
throws
ioexception {
request.options options ;
if
(configoverride ! =
null
) {
ribbonpropert 工es override = ribbonpropertes . from(configoverride);
options =
new
request.options(
else
{
override . connecttimeout(th 工s . connect timeout),
override . readtimeout(
this
. readt 工meout));
options =
new
request . options(th 工s.connecttimeout,
this
readtimeout);
response response = request . client() . execute(request . toreqest(), options) ;
return
new
ribbonresponse(request . geturi() , response) ;
|
feignloadbalancer 是abstractloadbalancerawarec!ient 的子类,其executewithloadbalance方法会首先创建一个loadbalancercommand 实例,然后在该实例的submit 方法的回调中调用子类的execute方法 。
其中, buildloadb a lan cercommand 方法使用了loadbalancercommand.builder 来创建loadbalancercornmand 实例,并将abstractloadbalancerawarec!ient 作loadbalancercontext接口的实例设置给loadbalancercommand 实例 。
loadbalancercontext 的getserverfromloadbalancer 方法调用了iloadbalancer 的chooseserver方法,从而完成了负载均衡中服务器的选择.
loadbalancerclient是ribbon 项目的核心类之一,可以在resttemplate 发送网络请求时替代resttemplate 进行网络调用 。
loadbalancerclient 接口继承了servicelnstancechooser 接口,其choose 方法可以从服务器列表中依据负载均衡策略选出一个服务器实例 。
ribbonloadbalancerclient 是loadbalancerclient 的实现类之一, 它的execute 方法会首先使用iloadba lancer 来选择服务器实例( server ),然后将该服务器实例封装成ribbonserver 对象, 最后再调用loadbalancerrequest 的apply 方法进行网络请求的处理.
iloadbalancer 是ribbon 的关键类之二, 它是定义负载均衡操作过程的接口。ribbon通过springclientfactory 工厂类的getloadbalancer 方法可以获取iloadbalancer 实例。根据ribbon 的组件实例化机制, iloadbalnacer 实例是在ribbonautoconfiguration 中被创建生成的.
springclientfactory 中的实例都是ribbonclientconfiguration 或者自定义c onfiguration配置类创建的bean 实例。ribbonclientconfiguration 还创建了rule 、iping 和s e rver list 等相关组件的实例。使用者可以通过自定义配置类给出上述几个组件的不同实例.
lrule 是定义ribbon 负载均衡策略的接口,你可以通过实现该接口来自定义自己的负载均衡策略, ribbon clientconfiguration 配置类则会给出!rule 的默认实例,rule 接口的choose 方法就是从一堆服务器中根据一定规则选出一个服务器。rule 有很多默认的实现类,这些实现类根据不同的算法和逻辑来进行负载均衡.
在大多数情况下, 这些默认的实现类是可以满足需求的,如果有特殊需求,可以自己实现。ribbon 内置的rule 子类如下所示.
到此这篇关于springcloud netflix ribbon源码解析(推荐)的文章就介绍到这了,更多相关springcloud netflix ribbon源码内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_44302240/article/details/112213459 。
最后此篇关于SpringCloud Netflix Ribbon源码解析(推荐)的文章就讲到这里了,如果你想了解更多关于SpringCloud Netflix Ribbon源码解析(推荐)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前置内容 (1)、微服务理论入门和手把手带你进行微服务环境搭建及支付、订单业务编写 (2)、SpringCloud之Eureka服务注册与发现 (3)、SpringCloud之Zookeeper进行服
SpringCloud-实用篇 API:RestTemplate 跨服务调用的api 创建一个bean @Bean @LoadBalanced //负载均衡 public RestTemplate
微服务学习计划——SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服
目录 SpringCloud @FeignClient 参数详解 @FeignClient 注解常用参数 SpringCloud @FeignClient
Config 介绍 Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件
gateway跨域配置 gateway允许跨域的配置和zuul的不一样,记录一下。 版本 ?
SpringCloud 提取公共配置 在开发微服务项目时,通常会有很多服务,此时会用配置中心来管理这些服务的配置,但有些服务可能会有相同的配置,比如数据源配置,eureka server注册中心地
1、场景简述 笔者最近用到SpringCloud 服务网关的时候,进行服务网关的路由测试,发现无法路由自己设置的规则,测试的时候如下 通过错误排查发现,原来是路由规则写错了! 路由规则如
现在基于SpringCloud的微服务开发日益流行,网上各种开源项目层出不穷。我们在实际工作中可以参考开源项目实现很多开箱即用的功能,但是必须要遵守一定的约定和规范。 本文结合我们实际的开发中遇到
Feign传参注意 最近在用SpringCloud尝试重构以前的项目,使用Feign客户端组件来调用微服务,经常出现参数传不过去变成null的问题,网上查了一下发现feign在参数上的使用还是有一
SpringCloud 服务注册IP错误 1、错误原因 在服务注册的时候,是使用 spring.cloud.client.ipAddress 这个变量,如果本机有多个网卡,那么可能会把不是本机以
简介: gateway主要是做路由 负载,过滤 主要是替代zuul 1.x 性能比zuul好 zuul是基于 Servlet ,gateway是基于spring-webflux 用的netty+
1、场景 笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖 springboot版本:1.5.9.RELEASE springcloud版本:Da
版本说明 开源软件 版本 springboot 2.1.6.RELEASE jdk
今天做项目的时候,遇到一个问题,如果我调用某个服务的接口,但是这个服务挂了,同时业务要求这个接口的结果是必须的,那我该怎么办呢,答案是通过hystrix,但是又有一点,服务不是平白无故挂的(排除服务
前言 eureka是一种基于rest(具像状态传输)的服务,主要用于aws云中定位服务,以实现中间层服务器的负载平衡和故障转移。本文记录一个简单的服务注册与发现实例。 github地址:http
前言 zuul 是在spring cloud netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 netfl
简介 Zuul是Spring Cloud全家桶中的微服务API网关。 所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序 Zuul 主要提供路由(请求转发)和
简介 在分布式系统中,服务与服务之间依赖错综复杂,一种不可避免的情况就是某些服务将会出现失败。Hystrix是一个库,它提供了服务与服务之间的容错功能,主要体现在延迟容错和容错,从
简介 feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,
我是一名优秀的程序员,十分优秀!