SpringCloud學習筆記之Feign遠程調(diào)用
前言
為啥需要學Feign呢?我們先來回顧之前寫的代碼
先來看我們以前利用RestTemplate發(fā)起遠程調(diào)用的代碼:
這里就有幾個問題:
- 代碼可讀性差,編程體驗不統(tǒng)一
- 參數(shù)復雜URL難以維護
而Feign是一個聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實現(xiàn)http請求的發(fā)送,解決上面提到的問題
1.Feign替代RestTemplate
1.1 引入依賴
我們在order-service服務的pom文件中引入feign的依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
1.2 添加注釋
在order-service的啟動類添加注解開啟Feign的功能:
1.3 編寫Feign的客戶端
在order-service中新建一個接口,內(nèi)容如下:
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
這個客戶端主要是基于SpringMVC的注解來聲明遠程調(diào)用的信息,比如:
- 服務名稱:userservice
- 請求方式:GET
- 請求路徑:/user/{id}
- 請求參數(shù):Long id
- 返回值類型:User
這樣,F(xiàn)eign就可以幫助我們發(fā)送http請求,無需自己使用RestTemplate來發(fā)送了
1.4 測試
修改order-service中的OrderService類中的queryOrderById方法,使用Feign客戶端代替RestTemplate:
1.5 總結
使用Feign的步驟:
① 引入依賴
② 添加@EnableFeignClients注解
③ 編寫FeignClient接口
④ 使用FeignClient中定義的方法代替RestTemplate
2.自定義配置
Feign可以支持很多的自定義配置,如下表所示:
一般情況下,默認值就能滿足我們使用,如果要自定義時,只需要創(chuàng)建自定義的@Bean覆蓋默認Bean即可
下面以日志為例來演示如何自定義配置:
2.1 配置文件方式
基于配置文件修改feign的日志級別可以針對單個服務:
feign: client: config: userservice: # 針對某個微服務的配置 loggerLevel: FULL # 日志級別
也可以針對所有服務:
feign: client: config: default: # 這里用default就是全局配置,如果是寫服務名稱,則是針對某個微服務的配置 loggerLevel: FULL # 日志級別
而日志的級別分為四種:
- NONE:不記錄任何日志信息,這是默認值
- BASIC:僅記錄請求的方法,URL以及響應狀態(tài)碼和執(zhí)行時間
- HEADERS:在BASIC的基礎上,額外記錄了請求和響應的頭信息
- FULL:記錄所有請求和響應的明細,包括頭信息、請求體、元數(shù)據(jù)
2.2 Java代碼方式
也可以基于Java代碼來修改日志級別,先聲明一個類,然后聲明一個Logger.Level的對象:
public class DefalutFeignConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; // 日志級別為BASIC } }
如果要全局生效,將其放到啟動類的@EnableFeignClients這個注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
如果是局部生效,則把它放到對應的@FeignClient這個注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
3.Feign使用優(yōu)化
Feign底層發(fā)起http請求,依賴于其它的框架。其底層客戶端實現(xiàn)包括:
- URLConnection:默認實現(xiàn),不支持連接池
- Apache HttpClient :支持連接池
- OKHttp:支持連接池
因此提高Feign的性能主要手段就是使用連接池代替默認的URLConnection。
這里我們用Apache的HttpClient來演示:
1)引入依賴
在order-service的pom文件中引入Apache的HttpClient依賴:
<!--httpClient的依賴 --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
2)配置連接池
在order-service的application.yml中添加配置:
feign: client: config: default: # default全局的配置 loggerLevel: BASIC # 日志級別,BASIC就是基本的請求和響應信息 httpclient: enabled: true # 開啟feign對HttpClient的支持 max-connections: 200 # 最大的連接數(shù) max-connections-per-route: 50 # 每個路徑的最大連接數(shù)
總結Feign的優(yōu)化:
日志級別盡量用basic
使用HttpClient或OKHttp代替URLConnection
① 引入feign-httpClient依賴
② 配置文件開啟httpClient功能,設置連接池參數(shù)
4.最佳實踐
所謂最佳實踐,就是使用過程中總結的經(jīng)驗,最好的一種使用方式。
自習觀察可以發(fā)現(xiàn),F(xiàn)eign的客戶端與服務提供者的controller代碼非常相似:
feign客戶端:
UserController:
有沒有一種辦法簡化這種重復的代碼編寫呢?
4.1 繼承方式
一樣的代碼可以通過繼承來共享:
1.定義一個API接口,利用定義方法,并基于SpringMVC注解做聲明
2.Feign客戶端和Controller都集成改接口
優(yōu)點:
- 簡單
- 實現(xiàn)了代碼共享
缺點:
- 服務提供方、服務消費方緊耦合
- 參數(shù)列表中的注解映射并不會繼承,因此Controller中必須再次聲明方法、參數(shù)列表、注解
4.2 抽取方式
Feign的Client抽取為獨立模塊,并且把接口有關的POJO、默認的Feign配置都放到這個模塊中,提供給所有消費者使用。
例如,將UserClient、User、Feign的默認配置都抽取到一個feign-api包中,所有微服務引用該依賴包,即可直接使用
4.3 實現(xiàn)基于抽取的最佳實踐 抽取
首先創(chuàng)建一個module,命名為feign-api:
項目結構:
在 feign-api 中然后引入feign的starter依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
然后,order-service中編寫的UserClient、User、DefaultFeignConfiguration都復制到feign-api項目中
在order-service中使用 feign-api
首先,刪除order-service中的UserClient、User、DefaultFeignConfiguration等類或接口
在order-service的pom文件中中引入feign-api的依賴:
<dependency> <groupId>com.xn2001.feign</groupId> <artifactId>feign-api</artifactId> <version>1.0</version> </dependency>
修改order-service中的所有與上述三個組件有關的導包部分,改成導入feign-api中的包
重啟測試
重啟后,發(fā)現(xiàn)服務報錯了:
這是因為UserClient現(xiàn)在在cn.itcast.feign.clients包下,
而order-service的@EnableFeignClients注解是在cn.itcast.order包下,不在同一個包,無法掃描到UserClient。
解決掃描包問題
方式一:
指定Feign應該掃描的包:(不推薦)
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:
指定需要加載的Client接口:
@EnableFeignClients(clients = {UserClient.class})
到此這篇關于SpringCloud學習筆記之Feign遠程調(diào)用的文章就介紹到這了,更多相關SpringCloud Feign遠程調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何基于mybatis框架查詢數(shù)據(jù)庫表數(shù)據(jù)并打印
這篇文章主要介紹了如何基于mybatis框架查詢數(shù)據(jù)庫表數(shù)據(jù)并打印,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11SpringBoot集成POI導出Execl表格之統(tǒng)一工具類
這篇文章主要為大家詳細介紹了SpringBoot集成POI導出Execl表格之統(tǒng)一工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09Spring框架+jdbcTemplate實現(xiàn)增刪改查功能
這篇文章主要介紹了Spring框架+jdbcTemplate實現(xiàn)增刪改查功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09解決在啟動eclipse的tomcat進行訪問時出現(xiàn)404問題的方法
這篇文章主要介紹了解決在啟動eclipse的tomcat進行訪問時出現(xiàn)404問題的方法,感興趣的小伙伴們可以參考一下2016-04-04java底層AQS實現(xiàn)類ReentrantLock鎖的構成及源碼解析
本章我們就要來學習一下第一個?AQS?的實現(xiàn)類:ReentrantLock,看看其底層是如何組合?AQS?,實現(xiàn)了自己的那些功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03