wordpress篩選插件seo優(yōu)化操作
目錄
一、前言
二、源碼分析
三、負載均衡策略
一、前言
如下圖,我們在 orderserver 中通過 restTemplate 向 usersever 發(fā)起 http 請求,在服務拉取的時候,主機名 localhost 是用服務名 userserver 代替的,那么該 url 是一個可訪問的網(wǎng)絡地址嗎?
?
我們在瀏覽器中訪問一下這個地址,果然不可用。
那么它又是怎么訪問到 userserver 數(shù)據(jù)的?別忘了我們的服務都是注冊在 Eureka 上的,那肯定是拿著服務名去找 Eureka 要人了對不對?找到服務之后把具體的主機名替換掉就OK了。
實際上,我們可能有多個 userserver 同時注冊在 Eureka 上,這時候 orderserver 要去 Eureka 上拉取服務的時候,拉取到的就不只是一個 userserver 服務了,它應該是一個服務列表,那么最終執(zhí)行的時候肯定是只交給一個服務去做,到底要交給誰呢?沒錯,這就是我們本篇要說的 —— Ribbon,用它來實現(xiàn)多服務的負載均衡。
二、源碼分析
上一篇文章中,提到了 @LoadBalanced 注解,我們說用它可以開啟負載均衡。這個注解其實就是一個標記,標記 RestTemplate 發(fā)起的請求要被 Ribbon 攔截并處理。
那個這個攔截動作具體是誰來做的呢?Ctrl + Shift + N,搜索 LoadBalancerInterceptor,點擊第一個。
我們可以打斷點?debug,可以看到?request.getURI() 這一步是在獲取請求路徑,也就是我們上面說的那個不可用的?url。
F8 快捷鍵下一步,originalUri.getHost()?應該就是在獲取主機名,獲取到的 host 正是 userserver。
拿到了主機名,就該去找 Eureka 拉取服務了,繼續(xù)往下走,發(fā)現(xiàn)它把該服務名稱交給了 loadBalancer.execute 去執(zhí)行,F7 跟進該方法。
服務列表拿到之后就準備負載均衡了,F7 進入方法內(nèi)部,我們發(fā)現(xiàn)它調(diào)用了 chooseServer 方法,翻譯一下:選擇服務。從剛才拉取到的服務列表中選擇一個出來?
繼續(xù) F7 進入?chooseServer 方法,可以看到它又去調(diào)用父類的?chooseServer 方法了。
跟進方法往下走,返回一個 rule.choose?翻譯一下:選擇規(guī)則。說明我們從服務列表中選擇一個服務的時候也是有規(guī)則的。
光標放到 rule 上,Ctrl 加鼠標左鍵跟進,它原來是一個 IRule 類型的。
?
那么這個 IRule 接口有哪些具體的 Rule 呢?光標放在 IRule 上,Ctrl + H,彈出它的實現(xiàn)類。翻譯一下:有隨機規(guī)則、輪詢規(guī)則等等。
拿到了真實的訪問地址,并且選擇了一種負載均衡策略,就可以對之前不可訪問的 url 進行替換了。
整體流程:
orderserver 發(fā)起 http 請求 → 請求被?LoadBalancerInterceptor 負載均衡攔截器攔截 →?RibbonLoadBalancerClient 拿到服務名,并將其作為參數(shù)傳給 DynamicServerListLoadBalancer →?DynamicServerListLoadBalancer 就會去 Eureka 中拉取服務列表?→ 隨后?DynamicServerListLoadBalancer 又會去請求 IRule 接口做負載均衡,根據(jù)規(guī)則挑一個服務出來,并返回 →?RibbonLoadBalancerClient 拿到了真實的服務地址就會對之前不可訪問的 url 地址進行替換,最終請求到目標服務。
三、負載均衡策略
如下圖,每一個子接口都是一種規(guī)則:
默認是的負載均衡策略是 ZoneAvoidanceRule,它父類的父類是輪詢的,所以本質(zhì)上講?ZoneAvoidanceRule 也是一個輪詢策略,但是它是以 Zone 對服務器進行劃分的,這個 Zone 可以理解為一個機房,所以在選擇服務的時候,它會優(yōu)先選擇跟自己在同一個機房里面的服務,然后進行輪詢。
那么如何修改負載均衡規(guī)則呢?有兩種方式。
① 代碼方式,在 orderserver 的啟動類中定義一個新的 IRule(作用于全局)
@Bean
public IRule randomRule() {return new RandomRule();
}
② 配置文件方式,在?orderserver 的 yml 文件中添加新的配置(只針對某個微服務而言)
Ribbon 的默認加載機制是懶加載,所謂懶加載就是不用的時候不加載,什么時候要用了才去加載,所以服務在第一次被訪問的時候速度較慢,由于 Ribbon 給我們提供了緩存,所以之后的訪問速度還是很快的。
相對于懶加載的是饑餓加載,顧名思義,饑餓加載就是在項目一啟動的時候就開始加載,所以它的每一次訪問速度都很快。那么如何修改 Ribbon 的加載方式呢?我們可以通過配置文件的方式進行修改。