1.1Ribbon是什么
SpringCloud Ribbon是基于Netflix Ribbon實現(xiàn)的一套客戶端負載均衡工具。主要功能是提供客戶端的軟件負載均衡算法和服務(wù)調(diào)用,提供一系列完善的配置如連接超時,重試等。簡單來說,就是配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動幫助基于某種規(guī)則(如簡單輪詢,隨機連接等)去連接這些機器。
服務(wù)間發(fā)起請求的時候,基于Ribbon做負載均衡,從?個服務(wù)的多臺機器中選擇?臺 (被調(diào)用方的服務(wù)地址有多個),Ribbon也是通過發(fā)起http請求,來進行的調(diào)用,只不過是通過調(diào)用服務(wù)名的地址來實現(xiàn)的。雖然說Ribbon不用去具體請求服務(wù)實例的ip地址或域名了,但是每調(diào)用一個接口都還要手動去發(fā)起Http請求。
1.2LB負載均衡是什么?
簡單來說就是將用戶的請求平攤的分配到多個服務(wù)上,從而達到HA(高可用)。常見的負載均衡軟件有Nginx、LVS、硬件F5等
1.3Ribbon本地負載均衡客戶端 VS Nginx服務(wù)端負載均衡
Nginx是服務(wù)器負載均衡,客戶端會將請求都發(fā)給Nginx,然后由nginx實現(xiàn)轉(zhuǎn)發(fā)請求,即負載均衡是在服務(wù)端實現(xiàn)的。屬于集中式LB(即在服務(wù)的消費方和提供方之間使用的獨立的LB設(shè)施,由該設(shè)施負責把訪問請求通過某種策略轉(zhuǎn)發(fā)到服務(wù)的提供方)。
Ribbon是本地負載均衡,在調(diào)用微服務(wù)接口時,會在注冊中心上獲取注冊信息服務(wù)列表之后緩存到JVM本地,從而實現(xiàn)RPC遠程調(diào)用技術(shù)。屬于進程式LB(將邏輯集成到消費方,消費方從服務(wù)注冊中心獲知有哪些地址可用,然后自己再從這些地址中選擇一個合適的服務(wù)器)。它只是一個類庫,集成于消費方進程,消費方通過他來獲取到服務(wù)提供方的地址。
1.4Ribbon工作流程圖
1、先選擇EurekaServer,它優(yōu)先選擇在同一個區(qū)域內(nèi)負載較少的Server
2、根據(jù)用戶指定的策略,在server取到的服務(wù)提供者列表選擇一個地址
其中Ribbon有很多的策略,比如輪詢、隨機和根據(jù)響應(yīng)時間加權(quán)。

1.5RestTemplete
兩個模塊,一個是采購模塊,一個是支付模塊,假如采購模塊要調(diào)用支付模塊的接口,可以使用RestTemplete。在后面調(diào)用會使用Openfeign來實現(xiàn)。


如上就可以訪問cloud-payment-service的/payment/get/{id}路徑了
使用RestTemplete一般是getForObject方法和getForEntity,對比來看,前者返回的基本上可以理解為json,后者返回的則更加全面,可以獲得響應(yīng)中的一些重要信息,比如說響應(yīng)頭、響應(yīng)狀態(tài)碼、響應(yīng)體等。一般常用getForObject()方法
1.6問:有沒有使用過Ribbon其他負載均衡的算法,有沒有手寫過,設(shè)計思想是什么?
1.6.1首先Ribbon自帶的負載均衡算法一共有七種:

1.6.2默認的負載均衡算法是輪詢,那怎么替換成別的方法?
首先,官網(wǎng)特殊說明,不要將自定義配置類放在@ConponentScan所能掃描的當前包以及子包下,會達不到特殊定制化的目的。而@SpringBootApplication注解會將所有本包以及本包以下掃入,所以新建一個包myrule,在里面定制規(guī)則,然后在主啟動類加上注解如圖




1.6.3負載均衡輪詢算法原理:
rest接口第幾次請求數(shù)%服務(wù)器集群總數(shù)量=實際調(diào)用服務(wù)器下標。比如1%2=1;2%2=0;3%2=1.......輪流著調(diào)用下標為0和1的服務(wù)器。注意:每次服務(wù)重啟后rest接口計數(shù)從1開始。
2.1.OpenFeign是什么?
OpenFeign是一個聲明式web服務(wù)客戶端,讓編寫Web服務(wù)客戶端變得更加容易,只需要創(chuàng)建一個接口并在接口上添加注解即可。Feign也可以支持拔插式的編碼器和解碼器。SpringCloud對Feign進行了封裝,使其支持了Spring MVC標準注解和HttpMessageConverters。Feign可以與Eureka和Ribbon組合使用以支持負載均衡。
基于Feign的動態(tài)代理機制,根據(jù)注解和選擇的機器,拼接請求URL地址,發(fā)起請求 ,簡化服務(wù)間的調(diào)用,在Ribbon的基礎(chǔ)上進行了進一步的封裝。單獨抽出了一個組件,就是Spring Cloud Feign。在引入Spring Cloud Feign后,我們只需要創(chuàng)建一個接口并用注解的方式來配置它,即可完成對服務(wù)提供方的接口綁定。調(diào)用遠程就像調(diào)用本地服務(wù)一樣
2.2Feign能干什么
前面在使用Ribbon時候,利用RestTemplete對http請求封裝處理形成一套模板化的調(diào)用方法。但是在實際開發(fā)過程中,由于對服務(wù)依賴的調(diào)用可能不止一處,往往一個接口會被多處調(diào)用,所以通常都會針對每個微服務(wù)自行封裝一些客戶端類來包裝這些依賴服務(wù)的調(diào)用,所以Feign在此基礎(chǔ)上做了進一步的封裝,我們只需要在一個微服務(wù)接口上標注一個Feign注解即可完成對服務(wù)提供方的接口綁定,簡化了Spring Cloud Ribbon時,自動封裝服務(wù)調(diào)用客戶端的開發(fā)量。
和Ribbon對比,F(xiàn)eign只需要在服務(wù)調(diào)用接口上加一個注解就可以了,優(yōu)雅而簡單的實現(xiàn)了服務(wù)調(diào)用。
2.3.OpenFeign和Feign對比

2.4.OpenFeign的使用
- 1、pom文件引入依賴
- 2、寫yml
- 3、寫主啟動類,注意要加上@EnableFeignClients注解
- 4、業(yè)務(wù)類:新建一個Service接口,在接口上加注解@FeignClient(value ="cloud-payment-service"),并指向要調(diào)用的服務(wù)實例名。然后在接口中加入在服務(wù)端Controller調(diào)用的方法。然后在客戶端調(diào)用接口即可,看下圖來理解:

2.5.OpenFeign的超時控制
注意OpenFeign默認等待一秒鐘,但是服務(wù)端處理需要超過1s,導(dǎo)致Feign客戶端返回報錯,Read timed out,讀取超時,而我們有時候需要設(shè)置Feign客戶端的超時控制,就在yml文件中進行設(shè)置。

2.6日志打印功能
其實就是OpenFeign提供了對Feign接口調(diào)用情況進行監(jiān)控和輸出。日志級別一共分為以下四類:
NONE:默認的,不顯示任何日志;
BASIC:僅記錄請求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時間。
HEADERS:除了BASIC中定義的信息·,還有請求和響應(yīng)的頭信息。
FULL:除了HEADERS中定義的信息,還有請求和響應(yīng)的正文及元數(shù)據(jù)。


