亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

一:Ribbon簡(jiǎn)介

Ribbon是Netflix公司開(kāi)源的一個(gè)負(fù)載均衡的項(xiàng)目,是一個(gè)客戶(hù)端負(fù)載均衡器,運(yùn)行在客戶(hù)端上。它是一個(gè)經(jīng)過(guò)了云端測(cè)試的IPC庫(kù),可以很好地控制HTTP和TCP客戶(hù)端的一些行為。Feign已經(jīng)默認(rèn)使用了Ribbon。

二:Ribbon的工作流程

微服務(wù)核心技術(shù)——負(fù)載均衡

 

1:user微服務(wù)1、user微服務(wù)2、user微服務(wù)3是一個(gè)服務(wù)集群,它們都會(huì)向注冊(cè)中心注冊(cè)服務(wù)(它們的應(yīng)用名都是USER-SERVICE)

2:注冊(cè)中心記錄集群元數(shù)據(jù)信息,即USER-SERVICE下有3個(gè)服務(wù)節(jié)點(diǎn)

3:Ribbon攔截所有的請(qǐng)求,從請(qǐng)求信息中獲取應(yīng)用名

4:ribbon根據(jù)應(yīng)用名從eureka注冊(cè)中心獲取服務(wù)列表

5:ribbon從服務(wù)列表中通過(guò)相關(guān)均衡策略獲取具體某個(gè)服務(wù)

6:請(qǐng)求遠(yuǎn)程服務(wù)

三:Ribbon源碼解析

第一步:Ribbon攔截請(qǐng)求,獲取應(yīng)用名LoadBalancerAutoConfiguration是Ribbon的自動(dòng)配置類(lèi),在這個(gè)配置類(lèi)里面配置了一個(gè)攔截器,該攔截器會(huì)攔截所有請(qǐng)求,這就是Ribbon的入口

微服務(wù)核心技術(shù)——負(fù)載均衡

 

LoadBalancerInterceptor的intercept方法(當(dāng)遠(yuǎn)程調(diào)用的時(shí)候都會(huì)被攔截器攔截)

@Overridepublic ClientHttpResponse intercept(final HttpRequest request, final byte[] body,      final ClientHttpRequestExecution execution) throws IOException {   final URI originalUri = request.getURI();   String serviceName = originalUri.getHost();//這里就是獲取應(yīng)用名可以打斷點(diǎn)測(cè)試   Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);   return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));}

第二步:通過(guò)應(yīng)用名獲取服務(wù)列表負(fù)載均衡器ZoneAwareLoadBalancer是獲取服務(wù)列表的重要組件

@Overridepublic <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {   ILoadBalancer loadBalancer = getLoadBalancer(serviceId);//獲取負(fù)載均衡器   Server server = getServer(loadBalancer);   if (server == null) {      throw new IllegalStateException("No instances available for " + serviceId);   }   RibbonServer ribbonServer = new RibbonServer(serviceId, server, isSecure(server,         serviceId), serverIntrospector(serviceId).getMetadata(server));   return execute(serviceId, ribbonServer, request);}

ILoadBalancer是一個(gè)接口,具體的實(shí)現(xiàn)類(lèi)是ZoneAwareLoadBalancer

// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.netflix.loadbalancer;import JAVA.util.List;public interface ILoadBalancer {    void addServers(List<Server> var1);    //從列表中獲取具體某個(gè)服務(wù)    Server chooseServer(Object var1);    void markServerDown(Server var1);    /** @deprecated */    @Deprecated    List<Server> getServerList(boolean var1);    List<Server> getReachableServers();    //獲取服務(wù)列表    List<Server> getAllServers();}

ZoneAwareLoadBalancer負(fù)載均衡器是在RibbonClientConfiguration中提前定義的

@Bean@ConditionalOnMissingBeanpublic ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList<Server> serverList, ServerListFilter<Server> serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) {    return (ILoadBalancer)(this.propertiesFactory.isSet(ILoadBalancer.class, this.name) ?     (ILoadBalancer)this.propertiesFactory.get(ILoadBalancer.class, config, this.name) :     new ZoneAwareLoadBalancer(config, rule, ping, serverList, serverListFilter, serverListUpdater));}

ZoneAwareLoadBalancer的繼承關(guān)系圖如下:

微服務(wù)核心技術(shù)——負(fù)載均衡

 

getAllServers獲取服務(wù)列表,ZoneAwareLoadBalancer沒(méi)有定義getAllServers方法,但是父類(lèi)BaseLoadBalancer定義了該方法

第三步:從列表中獲取具體服務(wù)ZoneAwareLoadBalancer定義了獲取服務(wù)的方法,但是該方法最終調(diào)用的是父類(lèi)BaseLoadBalancer chooseServer方法

public Server chooseServer(Object key) {    if (counter == null) {        counter = createCounter();    }    counter.increment();    if (rule == null) {        return null;    } else {        try {            return rule.choose(key);        } catch (Exception e) {            logger.warn("LoadBalancer [{}]:  Error choosing server for key {}", name, key, e);            return null;        }    }}

默認(rèn)均衡策略ZoneAvoidanceRule,在RibbonClientConfiguration配置類(lèi)中配置了IRule bean

微服務(wù)核心技術(shù)——負(fù)載均衡

 

均衡策略的接口是IRule,具體實(shí)現(xiàn)類(lèi)有10個(gè):

微服務(wù)核心技術(shù)——負(fù)載均衡

 

IRule

這是所有負(fù)載均衡策略的父接口,里邊的核心方法就是choose方法,用來(lái)選擇一個(gè)服務(wù)實(shí)例。

AbstractLoadBalancerRule

AbstractLoadBalancerRule是一個(gè)抽象類(lèi),里邊主要定義了一個(gè)ILoadBalancer,就是我們上文所說(shuō)的負(fù)載均衡器,負(fù)載均衡器的功能我們?cè)谏衔囊呀?jīng)說(shuō)的很詳細(xì)了,這里就不再贅述,這里定義它的目的主要是輔助負(fù)責(zé)均衡策略選取合適的服務(wù)端實(shí)例。

RandomRule

看名字就知道,這種負(fù)載均衡策略就是隨機(jī)選擇一個(gè)服務(wù)實(shí)例,看源碼我們知道,在RandomRule的無(wú)參構(gòu)造方法中初始化了一個(gè)Random對(duì)象,然后在它重寫(xiě)的choose方法又調(diào)用了choose(ILoadBalancer lb, Object key)這個(gè)重載的choose方法,在這個(gè)重載的choose方法中,每次利用random對(duì)象生成一個(gè)不大于服務(wù)實(shí)例總數(shù)的隨機(jī)數(shù),并將該數(shù)作為下標(biāo)所以獲取一個(gè)服務(wù)實(shí)例。

RoundRobinRule

RoundRobinRule這種負(fù)載均衡策略叫做輪詢(xún)負(fù)載均衡策略,也就是我們?cè)谏衔乃f(shuō)的BaseLoadBalancer負(fù)載均衡器中默認(rèn)采用的負(fù)載均衡策略。這個(gè)類(lèi)的choose(ILoadBalancer lb, Object key)函數(shù)整體邏輯是這樣的:開(kāi)啟一個(gè)計(jì)數(shù)器count,在while循環(huán)中遍歷服務(wù)清單,獲取清單之前先通過(guò)incrementAndGetModulo方法獲取一個(gè)下標(biāo),這個(gè)下標(biāo)是一個(gè)不斷自增長(zhǎng)的數(shù)先加1然后和服務(wù)清單總數(shù)取模之后獲取到的(所以這個(gè)下標(biāo)從來(lái)不會(huì)越界),拿著下標(biāo)再去服務(wù)清單列表中取服務(wù),每次循環(huán)計(jì)數(shù)器都會(huì)加1,如果連續(xù)10次都沒(méi)有取到服務(wù),則會(huì)報(bào)一個(gè)警告No available alive servers after 10 tries from load balancer: XXXX。

RetryRule

看名字就知道這種負(fù)載均衡策略帶有重試功能。首先RetryRule中又定義了一個(gè)subRule,它的實(shí)現(xiàn)類(lèi)是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次還是采用RoundRobinRule中的choose規(guī)則來(lái)選擇一個(gè)服務(wù)實(shí)例,如果選到的實(shí)例正常就返回,如果選擇的服務(wù)實(shí)例為null或者已經(jīng)失效,則在失效時(shí)間deadline之前不斷的進(jìn)行重試(重試時(shí)獲取服務(wù)的策略還是RoundRobinRule中定義的策略),如果超過(guò)了deadline還是沒(méi)取到則會(huì)返回一個(gè)null。

WeightedResponseTimeRule

WeightedResponseTimeRule是RoundRobinRule的一個(gè)子類(lèi),在WeightedResponseTimeRule中對(duì)RoundRobinRule的功能進(jìn)行了擴(kuò)展,WeightedResponseTimeRule中會(huì)根據(jù)每一個(gè)實(shí)例的運(yùn)行情況來(lái)給計(jì)算出該實(shí)例的一個(gè)權(quán)重,然后在挑選實(shí)例的時(shí)候則根據(jù)權(quán)重進(jìn)行挑選,這樣能夠?qū)崿F(xiàn)更優(yōu)的實(shí)例調(diào)用。WeightedResponseTimeRule中有一個(gè)名叫DynamicServerWeightTask的定時(shí)任務(wù),默認(rèn)情況下每隔30秒會(huì)計(jì)算一次各個(gè)服務(wù)實(shí)例的權(quán)重,權(quán)重的計(jì)算規(guī)則也很簡(jiǎn)單,如果一個(gè)服務(wù)的平均響應(yīng)時(shí)間越短則權(quán)重越大,那么該服務(wù)實(shí)例被選中執(zhí)行任務(wù)的概率也就越大。

ClientConfigEnabledRoundRobinRule

ClientConfigEnabledRoundRobinRule選擇策略的實(shí)現(xiàn)很簡(jiǎn)單,內(nèi)部定義了RoundRobinRule,choose方法還是采用了RoundRobinRule的choose方法,所以它的選擇策略和RoundRobinRule的選擇策略一致,不贅述。

BestAvailableRule

BestAvailableRule繼承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基礎(chǔ)上主要增加了根據(jù)loadBalancerStats中保存的服務(wù)實(shí)例的狀態(tài)信息來(lái)過(guò)濾掉失效的服務(wù)實(shí)例的功能,然后順便找出并發(fā)請(qǐng)求最小的服務(wù)實(shí)例來(lái)使用。然而loadBalancerStats有可能為null,如果loadBalancerStats為null,則BestAvailableRule將采用它的父類(lèi)即ClientConfigEnabledRoundRobinRule的服務(wù)選取策略(線(xiàn)性輪詢(xún))。

PredicateBasedRule

PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一個(gè)子類(lèi),它先通過(guò)內(nèi)部定義的一個(gè)過(guò)濾器過(guò)濾出一部分服務(wù)實(shí)例清單,然后再采用線(xiàn)性輪詢(xún)的方式從過(guò)濾出來(lái)的結(jié)果中選取一個(gè)服務(wù)實(shí)例。

ZoneAvoidanceRule(Finchley.SR1版本中默認(rèn)均衡策略)

ZoneAvoidanceRule是PredicateBasedRule的一個(gè)實(shí)現(xiàn)類(lèi),只不過(guò)這里多一個(gè)過(guò)濾條件,ZoneAvoidanceRule中的過(guò)濾條件是以ZoneAvoidancePredicate為主過(guò)濾條件和以AvailabilityPredicate為次過(guò)濾條件組成的一個(gè)叫做CompositePredicate的組合過(guò)濾條件,過(guò)濾成功之后,繼續(xù)采用線(xiàn)性輪詢(xún)的方式從過(guò)濾結(jié)果中選擇一個(gè)出來(lái)。

四:自定義均衡策略

在引導(dǎo)類(lèi)中配置負(fù)載均衡策略

@Beanpublic IRule myRule(){    //return new RoundRobinRule();//輪詢(xún)    // return new RetryRule();//重試     return new BestAvailableRule();}

分享到:
標(biāo)簽:微服 負(fù)載均衡
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定