天天看點

Spring Cloud Netflix Feign 基礎應用實戰

點選上方"程式員曆小冰",選擇“置頂或者星标”

   你的關注意義重大!

微服務是軟體系統架構上的一種設計風格,它倡導将一個原本獨立的服務系統分成多個小型服務,這些小型服務都在獨立的程序中運作,通過各個小型服務之間的協作來實作原本獨立系統的所有業務功能。小型服務基于多種跨程序的方式進行通信協作,而在 <code>SpringCloud</code>架構中比較常見的跨程序的方式是RESTful HTTP請求和RPC調用。

RPC就是遠端過程調用,它是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定。比如說,計算機 A 上的程序調用另外一台計算機 B 上的程序,其中 A 上的調用程序被挂起,而 B 上的被調用程序開始執行,當值傳回給 A 時,A 程序繼續執行。調用方可以通過使用參數将資訊傳送給被調用方,而後可以通過傳回的結果得到資訊。而這一過程,對于開發人員來說是透明的。

Spring Cloud Netflix Feign 基礎應用實戰

REST是Representational State Transfer的縮寫,是表現層狀态轉移的含義。

Resource是資源,所謂“資源”就是網絡上的一個實體,或者說網上的一個具體資訊。它可以是一段文本,一首歌曲,一種服務,總之就是一個具體的存在。你可以使用一個URI指向它,每種”資源“對應一個URI。

Representational是”表現層“的意思,”資源“是一種消息實體,它可以有多種外在的表現形式,我們把”資源“的具體呈現出來的形式叫做它的”表現層“。比如說,文本可以用txt格式進行表現,也可以使用xml格式,JSON格式和二進制格式;視訊可以以MP4格式表現,也可以以AVI格式表現。URI隻代表資源的實體,不代表它的形式。它的具體表現形式,應該在HTTP請求的頭資訊Accept和Content-Type字段指定,這兩個字段才是對”表現層“的描述。

State Transfer是指狀态轉化。用戶端通路服務的過程中必然涉及到資料和狀态的轉化。如果用戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生”狀态轉化“。而這種轉化是建立在表現層之上的,是以就是”表現層狀态轉化“。用戶端通過使用HTTP協定中的四個動詞來實作上述操作,它們分别:用來擷取資源的GET,用來建立或更新資源的POST,用來更新資源的PUT,用來删除資源的DELETE。

REST是Web Service的一種實作方式,另外一種實作方式為SOAP。REST緻力于通過HTTP協定中的POST/GET/PUT/DELETE等方法和一個可讀性較強的URL來提供一個HTTP請求;而SOAP緻力于通過wsdl資料格式來實作通信。二者的使用場景和設計目标不同。SOAP一般作為應用層協定來進行服務間的消息調用。

RPC和REST之間的最大差别在于RPC調用可以不依賴HTTP協定,底層直接使用TPC/IP協定進行傳輸,傳輸效率相比于REST會有一定的提升。

<code>Feign</code>是一個聲明式RESTful HTTP請求用戶端,它使得編寫Web服務用戶端更加友善和快捷。使用Feign建立一個接口并使用Feign提供的注解修飾該接口,然後就可以使用該接口進行RESTful HTTP請求的發送。<code>Feign</code>還可以內建Ribbon和Eureka來為自己提供負載均衡和斷路器的機制。

<code>Feign</code>會将帶有注解的函數接口資訊轉化為網絡請求模闆,在發送網絡請求之前,函數的參數值會以一定的方式設定到這些請求模闆中。雖然這樣的模式使得 <code>Feign</code>隻能支援基于文本的網絡請求,但是它可以簡化網絡請求的實作,友善程式設計人員快速建構自己的網絡請求架構。

Spring Cloud Netflix Feign 基礎應用實戰

如上圖所示,使用 <code>Feign</code>的程式的架構一般分為三個部分,分别為服務注冊中心,服務提供者和服務消費者。服務提供者向服務注冊中心注冊自己,然後服務消費者通過 <code>Feign</code>發送請求時, <code>Feign</code>會向去服務注冊中心擷取關于服務提供者的資訊,然後再向服務提供者發送網絡請求。

<code>Feign</code>可以配合 <code>eureka</code>等服務注冊中心同時使用。<code>eureka</code>來作為服務注冊中心,為 <code>Feign</code>提供關于服務端資訊的擷取,比如說IP位址。關于 <code>eureka</code>的具體使用可以參考第四章中關于 <code>eureka</code>的快速入門介紹。

<code>SpringCloudFeign</code>是聲明式RESTful請求用戶端,是以它不會侵入服務提供者程式的實作。也就是說,服務提供者隻需要提供Web Service的API接口,至于具體實作既可以是 <code>SpringControler</code>也可以是 <code>Jersey</code>。我們隻需要確定該服務提供者被注冊到服務注冊中心上。

上述代碼中通過 <code>@RestController</code>和 <code>@RequestMapping</code>聲明了四個網絡API接口,分别是對 <code>Instance</code>資源的增删改查操作。

除了實作網絡API接口之外,還需要将該service注冊到 <code>eureka</code>上。如下列代碼所示,需要在 <code>application.yml</code>檔案中設定服務注冊中心的相關資訊和代表該應用的名稱。

<code>Feign</code>是聲明式RESTful用戶端,是以建構 <code>Feign</code>項目的關鍵在于建構服務消費者。通過下面六步可以建立一個 <code>SpringCloudFeign</code>的服務消費者。

首先建立一個普通的 <code>SpringBoot</code>工程,取名為 <code>chapter-feign-client</code>。 然後在pom檔案中添加 <code>eureka</code>和 <code>feign</code>相關的依賴。其中 <code>spring-cloud-starter-eureka</code>是 <code>eureka</code>的starter依賴包, <code>spring-cloud-starter-feign</code>是 <code>feign</code>的starter依賴包。

接着在工程的入口類上添加 <code>@EnableFeignClients</code>注解表示開啟 <code>SpringCloudFeign</code>的支援功能,代碼如下所示。

 <code>@EnableFeignClients</code>就像是一個開關,如果你使用了該注解,那麼 <code>Feign</code>相關的元件和處理機制才會生效,否則不會生效。<code>@EnableFeignClients</code>還可以對 <code>Feign</code>相關元件進行自定義配置,它的方法和原理會在本章的源碼分析章節在做具體的講解。

接下來我們定義一個 <code>FeignServiceClient</code>接口,通過 <code>@FeignClient</code>注解來指定服務名進而綁定服務。這一類被 <code>@FeignClient</code>修飾的接口類一般被稱為FeignClient。我們可以通過 <code>@RequestMapping</code>來修飾相應的方法來定義調用函數。

如上面代碼片段所顯示的,如果你調用 <code>FeignServiceClient</code>對象的 <code>getInstanceByServiceId</code>函數,那麼 <code>Feign</code>就會向 <code>feign-service</code>服務的 <code>/feign-service/instance/{serviceId}</code>接口發送網絡請求。

建立一個 <code>Controller</code>來調用上邊的服務,通過 <code>@Autowired</code>來自動裝載 <code>FeignServiceClient</code>示例。代碼如下:

最後, <code>application.yml</code>中需要配置 <code>eureka</code>服務注冊中心的相關配置,具體配置如下所示:

相信讀者通過搭建 <code>Feign</code>的項目,已經對 <code>Feign</code>的相關使用原理有了一定的了解,相信這個過程将對于了解 <code>Feign</code>相關的工作原理大有裨益。

-關注我

Spring Cloud Netflix Feign 基礎應用實戰

推薦閱讀