SpringCloud(五)Feign負載均衡
1、Feign概述
1.1、Feign官網解釋
http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign
Feign是一個宣告式WebService客戶端。使用Feign能讓編寫WebService客戶端更加簡單,他的使用方法是定義一個介面,然後再上面添加註解,同時也支援JAX-RS標準的註解。Feign也支援可插拔式的編碼器和解壓器。SpringCloud對Feign進行了封裝,使其支援了Spring MVC標準化註解和HttpMessageConverters。Feign就可以與Eureka和Ribbon組合使用以支援負載均衡。
1.2、Feign來源
Feign是一個宣告式的Web服務客戶端,使得編寫Web服務端非常容易。只需要建立一個介面,然後再上面添加註解即可。
之前我們都是用Ribbon進行負載均衡,功能很強大,甚至可以之定義演算法。
那麼Feign是怎麼出來的呢?
大部分的大家都可以介紹,直接呼叫我們的微服務來進行訪問:
//private static final String REST_URL_PREFIX = "http://localhost:8001";
修改為面向微服務程式設計
private static final String REST_URL_PREFIX = "http://DEPT-PROVIER";
實際中我們都習慣面向介面程式設計,比如WebService介面,比如我們的DAO介面,這個已經是規範了。
(1)微服務名稱獲取呼叫地址。
(2)通過介面+註解,獲取我們的呼叫服務。
最終目的適應社群大部分開發人員提出的,還是統一的面向介面的程式設計,就建立了Feign。
1.3、Feign能做什麼?
Feign旨在使編寫Java Http客戶端變得更容易。
前面在使用Ribbon+RestTemplate時,利用RestTemplate對http請求的封裝處理,形成了一套模板化的呼叫方法。但是在實際開發中,由於對服務依賴的呼叫可能不止一處,往往一個介面會被多處呼叫,所以通常都會針對每個服務自行封裝一些客戶端類來包裝這些服務的呼叫。
Feign集成了Ribbon:
利用Ribbon維護了PROVIDER-DEPT的服務列表資訊,並且通過輪詢實現了客戶端的負載均衡。而與Ribbon不同的是,通過Feign只需要定義服務介面且以宣告式的方法,優雅而簡單的實現了服務呼叫。
2、Feign使用步驟
2.1、新建microservice-consumer-dept-feign並新增feign支援
參考microservice-consumer-dept-80,主要新增對feign的支援。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.nari</groupId>
<artifactId>microservice-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservice-consumer-dept-feign</artifactId>
<dependencies>
<!-- 自己定義的api -->
<dependency>
<groupId>com.nari</groupId>
<artifactId>microservice-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 新增feign客戶端支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- Ribbon相關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- SpringBoot 起步依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
2.2、修改microservice-api工程
- pom.xml
新增Feign客戶端服務依賴支援:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <!-- 子類裡面顯示宣告才能有明確的繼承表現,無意外就是父類的預設版本否則自己定義 -->
<groupId>com.nari</groupId>
<artifactId>microservice-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservice-api</artifactId> <!-- 當前Module我自己叫什麼名字 -->
<dependencies><!-- 當前Module需要用到的jar包,按自己需求新增,如果父類已經包含了,可以不用寫版本號 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>
- 新建DeptClientService介面並新增註解@FeignClient
- mvn clean
- mvn install
2.3、修改Controller,注入上一步新建的DeptClientService介面
2.4、修改主啟動類
新增@EnableFeignClients客戶端掃描
2.5、測試
啟動3個eureka叢集
啟動3個部門微服務8001/8002/8003
啟動Feign自己啟動
http://localhost/consumer/dept/list
注意:Feign自帶負載均衡配置項
2.6、小總結
Feign通過介面的方法呼叫Rest服務(之前是Ribbon+RestTemplate),該請求傳送給Eureka伺服器(http://PROVIDER-DEPT/dept/list),通過Feign直接找到服務介面,由於在進行服務呼叫的時候融合了Ribbon技術,所以也支援負載均衡作用。