前言
本文小新為大家?guī)?微服務(wù)調(diào)用組件Feign 的相關(guān)知識,具體內(nèi)容包含什么是Feign
,Spring Cloud Alibaba快速整合OpenFeign
,Spring Cloud Feign的自定義配置及使用
(包括:日志配置
、契約配置
、自定義攔截器實(shí)現(xiàn)認(rèn)證邏輯
、超時時間配置
、客戶端組件配置
、GZIP 壓縮配置
)等~
不僅跬步,無以至千里;不積小流,無以成江海。每天進(jìn)步一點(diǎn)點(diǎn),在成為強(qiáng)者的路上,小新與大家共同成長!
??博主主頁:小新要變強(qiáng) 的主頁
??Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
??算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~
??Java微服務(wù)開源項目可參考:企業(yè)級Java微服務(wù)開源項目(開源框架,用于學(xué)習(xí)、畢設(shè)、公司項目、私活等,減少開發(fā)工作,讓您只關(guān)注業(yè)務(wù)!)
??本文上接:Spring Cloud Alibaba全家桶(三)——微服務(wù)負(fù)載均衡器Ribbon與LoadBalancer
目錄
JAVA 項目中如何實(shí)現(xiàn)接口調(diào)用?
- (1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 Http 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新版本和建議。HttpClient相比傳統(tǒng) JDK 自帶的 URLConnection,提升了易用性和靈活性,使客戶端發(fā)送 HTTP 請求變得容易,提高了開發(fā)的效率。
- (2)Okhttp
一個處理網(wǎng)絡(luò)請求的開源項目,是安卓端最火的輕量級框架,由 Square 公司貢獻(xiàn),用于替代
HttpUrlConnection 和 Apache HttpClient。OkHttp 擁有簡潔的 API、高效的性能,并支持多種協(xié)議(HTTP/2 和 SPDY)。
- (3)HttpURLConnection
HttpURLConnection 是 Java 的標(biāo)準(zhǔn)類,它繼承自 URLConnection,可用于向指定網(wǎng)站發(fā)送GET 請求、POST 請求。HttpURLConnection 使用比較復(fù)雜,不像 HttpClient 那樣容易使用。
- (4)RestTemplate WebClient
RestTemplate 是 Spring 提供的用于訪問 Rest 服務(wù)的客戶端,RestTemplate 提供了多種便捷訪問遠(yuǎn)程 HTTP 服務(wù)的方法,能夠大大提高客戶端的編寫效率。上面介紹的是最常見的幾種調(diào)用接口的方法,我們下面要介紹的方法比上面的更簡單、方便,它就是 Feign。
一、什么是Feign
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,其靈感來自Retrofit、JAXRS-2.0以及WebSocket。Feign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API。
Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
Spring Cloud openfeign對Feign進(jìn)行了增強(qiáng),使其支持Spring MVC注解,另外還整合了Ribbon和Nacos,從而使得Feign的使用更加方便
??優(yōu)勢
Feign可以做到使用 HTTP 請求遠(yuǎn)程服務(wù)時就像調(diào)用本地方法一樣的體驗,開發(fā)者完全感知不到這是遠(yuǎn)程方法,更感知不到這是個 HTTP 請求。它像 Dubbo 一樣,consumer 直接調(diào)用接口方法調(diào)用 provider,而不需要通過常規(guī)的 Http Client 構(gòu)造請求再解析返回數(shù)據(jù)。它解決了讓開發(fā)者調(diào)用遠(yuǎn)程接口就跟調(diào)用本地方法一樣,無需關(guān)注與遠(yuǎn)程的交互細(xì)節(jié),更無需關(guān)注分布式環(huán)境開發(fā)。
二、Spring Cloud Alibaba快速整合OpenFeign
??(1)引入依賴
<!‐‐ openfeign 遠(yuǎn)程調(diào)用 ‐‐>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
??(2)編寫調(diào)用接口+@FeignClient注解
@FeignClient(value = "mall‐order",path = "/order")
public interface OrderFeignService {
@RequestMapping("/findOrderByUserId/{userId}")
public R findOrderByUserId(@PathVariable("userId") Integer userId);
}
??(3)調(diào)用端在啟動類上添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class MallUserFeignDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MallUserFeignDemoApplication.class, args);
}
}
??(4)發(fā)起調(diào)用,像調(diào)用本地方式一樣調(diào)用遠(yuǎn)程服務(wù)
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
OrderFeignService orderFeignService;
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
//feign調(diào)用
R result = orderFeignService.findOrderByUserId(id);
return result;
}
}
三、Spring Cloud Feign的自定義配置及使用
Feign 提供了很多的擴(kuò)展機(jī)制,讓用戶可以更加靈活的使用。
1??日志配置
有時候我們遇到 Bug,比如接口調(diào)用失敗、參數(shù)沒收到等問題,或者想看看調(diào)用性能,就需要
配置 Feign 的日志了,以此讓 Feign 把請求信息輸出來。
??(1)定義一個配置類,指定日志級別
// 注意: 此處配置@Configuration注解就會全局生效,如果想指定對應(yīng)微服務(wù)生效,就不能配置
public class FeignConfig {
/**
* 日志級別
* * @return
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
通過源碼可以看到日志等級有 4 種,分別是:
- NONE【性能最佳,適用于生產(chǎn)】:不記錄任何日志(默認(rèn)值)。
- BASIC【適用于生產(chǎn)環(huán)境追蹤問題】:僅記錄請求方法、URL、響應(yīng)狀態(tài)代碼以及執(zhí)行時間。
- HEADERS:記錄BASIC級別的基礎(chǔ)上,記錄請求和響應(yīng)的header。
- FULL【比較適用于開發(fā)及測試環(huán)境定位問題】:記錄請求和響應(yīng)的header、body和元數(shù)據(jù)。
??(2)局部配置,讓調(diào)用的微服務(wù)生效,在@FeignClient 注解中指定使用的配置類
??(3)在yml配置文件中執(zhí)行 Client 的日志級別才能正常輸出日志,格式是 “l(fā)ogging.level. feign接口包路徑=debug”
logging:
level:
com.tuling.mall.feigndemo.feign: debug
測試: BASIC級別日志
補(bǔ)充: 局部配置可以在yml中配置
對應(yīng)屬性配置類:
org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration
feign:
client:
config:
mall‐order: #對應(yīng)微服務(wù)
loggerLevel: FULL
2??契約配置
Spring Cloud 在 Feign 的基礎(chǔ)上做了擴(kuò)展,使用 Spring MVC 的注解來完成Feign的功能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式來定義客戶端也是可以的,通過配置契約來改變這個配置,Spring Cloud 中默認(rèn)的是 SpringMvcContract。
Spring Cloud 1 早期版本就是用的原生Fegin。隨著netflix的停更替換成了Open feign。
??(1)修改契約配置,支持Feign原生的注解
/**
* 修改契約配置,支持Feign原生的注解
* @return
*/
@Bean
public Contract feignContract() {
return new Contract.Default();
}
注意: 修改契約配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原生的注解
??(2)OrderFeignService 中配置使用Feign原生的注解
@FeignClient(value = "mall‐order",path = "/order")
public interface OrderFeignService {
@RequestLine("GET /findOrderByUserId/{userId}")
public R findOrderByUserId(@Param("userId") Integer userId);
}
??(3)補(bǔ)充,也可以通過yml配置契約
feign:
client:
config:
mall‐order: #對應(yīng)微服務(wù)
loggerLevel: FULL
contract: feign.Contract.Default #指定Feign原生注解契約配置
3??自定義攔截器實(shí)現(xiàn)認(rèn)證邏輯
public class FeignAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 業(yè)務(wù)邏輯
String access_token = UUID.randomUUID().toString();
template.header("Authorization",access_token);
}
}
@Configuration // 全局配置
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
/**
* 自定義攔截器
* @return
*/
@Bean
public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
return new FeignAuthRequestInterceptor();
}
}
測試:
補(bǔ)充: 可以在yml中配置
feign:
client:
config:
mall‐order: #對應(yīng)微服務(wù)
requestInterceptors[0]: #配置攔截器
com.tuling.mall.feigndemo.interceptor.FeignAuthRequestInterceptor
mall-order端可以通過 @RequestHeader獲取請求參數(shù),建議在filter,interceptor中處理
4??超時時間配置
通過 Options 可以配置連接超時時間和讀取超時時間,Options 的第一個參數(shù)是連接的超時時間(ms),默認(rèn)值是 2s;第二個是請求處理的超時時間(ms),默認(rèn)值是 5s。
??(1)全局配置
@Configuration
public class FeignConfig {
@Bean
public Request.Options options() {
return new Request.Options(5000, 10000);
}
}
??(2)yml中配置
feign:
client:
config:
mall‐order: #對應(yīng)微服務(wù)
# 連接超時時間,默認(rèn)2s
connectTimeout: 5000
# 請求處理超時時間,默認(rèn)5s
readTimeout: 10000
補(bǔ)充說明: Feign的底層用的是Ribbon,但超時時間以Feign配置為準(zhǔn)
測試超時情況:
返回結(jié)果:
5??客戶端組件配置
Feign 中默認(rèn)使用 JDK 原生的 URLConnection 發(fā)送 HTTP 請求,我們可以集成別的組件來替換掉 URLConnection,比如 Apache HttpClient,OkHttp。
Feign發(fā)起調(diào)用真正執(zhí)行邏輯:feign.Client#execute (擴(kuò)展點(diǎn))
??(1)配置Apache HttpClient
引入依賴:
<!‐‐ Apache HttpClient ‐‐>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign‐httpclient</artifactId>
<version>10.1.0</version>
</dependency>
然后修改yml配置,將 Feign 的 Apache HttpClient啟用 :
feign:
#feign 使用 Apache HttpClient 可以忽略,默認(rèn)開啟
httpclient:
enabled: true
關(guān)于配置可參考源碼: org.springframework.cloud.openfeign.FeignAutoConfiguration
測試: 調(diào)用會進(jìn)入feign.httpclient.ApacheHttpClient#execute
??(2)配置 OkHttp
引入依賴:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign‐okhttp</artifactId>
</dependency>
然后修改yml配置,將 Feign 的 HttpClient 禁用,啟用 OkHttp,配置如下:
feign:
#feign 使用 okhttp
httpclient:
enabled: false
okhttp:
enabled: true
關(guān)于配置可參考源碼: org.springframework.cloud.openfeign.FeignAutoConfiguration
測試: 調(diào)用會進(jìn)入feign.okhttp.OkHttpClient#execute
6??GZIP 壓縮配置
開啟壓縮可以有效節(jié)約網(wǎng)絡(luò)資源,提升接口性能,我們可以配置 GZIP 來壓縮數(shù)據(jù):
feign:
# 配置 GZIP 來壓縮數(shù)據(jù)
compression:
request:
enabled: true
# 配置壓縮的類型
mime‐types: text/xml,application/xml,application/json
# 最小壓縮值
min‐request‐size: 2048
response:
enabled: true
注意: 只有當(dāng) Feign 的 Http Client 不是 okhttp3 的時候,壓縮才會生效,配置源碼在FeignAcceptGzipEncodingAutoConfiguration
核心代碼就是 @ConditionalOnMissingBean(type=“okhttp3.OkHttpClient”),表示Spring BeanFactory 中不包含指定的 bean 時條件匹配,也就是沒有啟用 okhttp3 時才會進(jìn)行壓縮配置。
后記
文章來源:http://www.zghlxwxcb.cn/news/detail-825818.html
??Java全棧學(xué)習(xí)路線可參考:【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識清單,Java自學(xué)方向指引,內(nèi)含最全Java全棧學(xué)習(xí)技術(shù)清單~
??算法刷題路線可參考:算法刷題路線總結(jié)與相關(guān)資料分享,內(nèi)含最詳盡的算法刷題路線指南及相關(guān)資料分享~文章來源地址http://www.zghlxwxcb.cn/news/detail-825818.html
到了這里,關(guān)于Spring Cloud Alibaba全家桶(四)——微服務(wù)調(diào)用組件Feign的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!