SpringBoot Feign使用教程超全面講解
開(kāi)篇
Feign 是聲明式、模板化的 HTTP 客戶端, 可以幫助我們更快捷、優(yōu)雅地調(diào)用 HTTP API;Spring Cloud 為 Feign 添加了 Spring MVC 的注解支持,并整合了 Ribbon 和 Eureka 來(lái)為使用 Feign 時(shí)提供負(fù)載均衡;在 Spring Cloud 中使用 Feign 是非常容易的。
本篇主要介紹 SpringBoot 中要玩轉(zhuǎn) Feign 需要掌握的如添加 pom 依賴、客戶端注解啟用、切換底層 HttpClient、配置數(shù)據(jù)壓縮、調(diào)整日志級(jí)別、定制配置、配置的優(yōu)先級(jí)機(jī)制、增加攔截器以及攔截器的追加機(jī)制等知識(shí)。
一、使用 Feign 的示例
1.1 添加依賴
<dependencies> <!--openfein的依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.3.RELEASE</version> </dependency> </dependencies>
1.2 啟用 Feign
在 SpringBoot 的啟用類(lèi)上添加注解@EnableFeignClients
,@EnableFeignClients
用于開(kāi)啟 Feign,會(huì)自動(dòng)掃描@FeignClient
標(biāo)注的 FeignClient 接口。
@SpringBootApplication @EnableFeignClients @EnableWeb public class FeignApplication { public static void main(String[] args) { SpringApplication.run(FeignApplication.class,args); } }
1.3 編寫(xiě) FeignClient 接口
@FeignClient( name = "demo-service", url = "http://localhost:8080/feign/server/", configuration = FeignInterceptor.class, fallback = TestService.DefaultFallback.class ) public interface TestService { @RequestMapping(value = "/getError/{id}", method = RequestMethod.GET) public String getError(@RequestParam("id") Integer id); @RequestMapping(value = "/get1", method = RequestMethod.GET) public String get1(); @RequestMapping(value = "/get2/{param}", method = RequestMethod.GET) public String get2(@RequestParam("param") String param); @RequestMapping(value = "/post1", method = RequestMethod.POST) public FeignDemo post1(@RequestBody FeignDemo demo);
1.4 編寫(xiě)對(duì)應(yīng)的服務(wù)端
@RestController @RequestMapping("/feign/server") public class FeignServerController { @GetMapping("/get1") public String get1() { return "get1"; } @GetMapping("/get2/{para}") public String get2(@PathVariable("para") String para){ return para; } @PostMapping("/post1") public FeignDemo post1(@RequestBody FeignDemo demo) { return demo; } }
public class FeignDemo { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "FeignDemo{" + "name='" + name + ''' + ", age=" + age + '}'; } }
1.5 調(diào)用 FeignClient
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {FeignApplication.class},webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @ActiveProfiles("dev,feign") public class FeignClientTest { @Autowired private TestService testService; @Test public void testFallback(){ testService.getError(1); } @Test public void testGet1(){ System.out.println(testService.get1()); System.out.println(testService.get2("abc")); System.out.printf(".."); FeignDemo feignDemo = new FeignDemo(); feignDemo.setName("name"); feignDemo.setAge(1); System.out.println(testService.post1(feignDemo)); } @Component public class DefaultFallback implements TestService { @Override public String getError(@RequestParam("id") Integer id){ return ""; } @Override public String get1() { return null; } @Override public String get2(String param) { return null; } @Override public FeignDemo post1(FeignDemo demo) { return null; } } }
二、如何切換 Client
Feign 中自帶的是 HttpURLConnection,這個(gè) client 健壯性差,可替換為成熟的 Apache HttpClient 或 OkHttp 來(lái)進(jìn)行網(wǎng)絡(luò)請(qǐng)求。
2.1 使用 Apache 的 HTTP Client
使用 Apache 的httpclient
替換 Feign 中默認(rèn)的 client。
2.1.1 添加依賴
<!--httpclient的依賴,因?yàn)檫x擇了使用httpclient--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> <version>10.4.0</version> </dependency>
2.1.2 配置啟用
配置中添加如下信息,表示啟用httpclient
。
feign:
httpclient:
enabled: true
2.2 使用 OkHttp
2.2.1 添加依賴
在 Feign 中使用OkHttp
作為網(wǎng)絡(luò)請(qǐng)求框架,則只需要在 pom 文件中加上feign-okhttp
的依賴,代碼如下:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> <version>10.2.0</version> </dependency>
2.2.2 配置啟用
feign:
okhttp:
enabled: true
三、如何修改日志級(jí)別
在發(fā)送和接收請(qǐng)求的時(shí)候,其內(nèi)部將日志的打印輸出定義成了四個(gè)等級(jí),對(duì)應(yīng)的詳情如下:
級(jí)別 | 說(shuō)明 |
---|---|
NONE | 不做任何記錄 |
BASIC | 僅記錄請(qǐng)求方法和 URL 以及響應(yīng)狀態(tài)代碼和執(zhí)行時(shí)間 |
HEADERS | 記錄基本信息以及請(qǐng)求和響應(yīng)標(biāo)頭 |
FULL | 記錄請(qǐng)求和響應(yīng)的標(biāo)題,正文和元數(shù)據(jù) |
3.1 通過(guò)配置文件修改日志級(jí)別
注意需要指定接口的全限定名
logging:
level:
com.zto.titans.test.feign.service.TestService : DEBUG
3.2 通過(guò)配置類(lèi)修改日志級(jí)別
@Configuration public class FooConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
這個(gè)一看即懂,不再?gòu)U話。
四、如何實(shí)現(xiàn)數(shù)據(jù)壓縮
可以分別對(duì) HTTP 通信的request
和response
設(shè)置是否啟用 GZIP 壓縮,配置方法如下:
feign:
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json # 配置壓縮支持的MIME TYPE
min-request-size: 2048 # 配置壓縮數(shù)據(jù)大小的下限
response:
enabled: true # 配置響應(yīng)GZIP壓縮
五、FeignClient 的配置以及配置的優(yōu)先級(jí)機(jī)制
有 2 種途徑設(shè)置 FeignClient 的配置,通過(guò)自定義配置類(lèi)來(lái)設(shè)置配置和在配置文件中設(shè)置,其中配置文件方式有點(diǎn)特殊,它里邊可以指定全局配置對(duì)所有 FeignClient 有效,也可以為特定名稱(chēng)的 FeignClient 設(shè)置專(zhuān)屬的配置。
5.1 通過(guò)自定義配置類(lèi)來(lái)定制配置
實(shí)現(xiàn)一個(gè)配置類(lèi)
public class TestConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
將配置類(lèi)TestConfiguration
指定給configuration
。
@FeignClient( name = "test-service", configuration = {FeignInterceptor2.class,TestConfiguration.class} )
5.2 在配置文件中設(shè)置全局配置
feign.client.config.default.xxx ,這個(gè)default意為
全局的配置屬性。
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
5.3 在配置文件中設(shè)置專(zhuān)屬配置
feign.client.config.feignName.xxx , 給名字為feignName的FeignClient
指定專(zhuān)屬的配置。
feign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false
encoder: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
5.4 理解配置的優(yōu)先級(jí)與攔截器的追加原則
從org.springframework.cloud.openfeign.FeignClientFactoryBean#configureFeign
中可以確認(rèn)以上 3 種配置的優(yōu)先級(jí):
configureUsingConfiguration(context, builder); // 1 configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder); //2 configureUsingProperties(properties.getConfig().get(this.contextId),builder);//3
- 第 1 類(lèi)為通過(guò)自定義配置類(lèi)來(lái)指定配置
- 第 2 類(lèi)為在配置文件中的
feign.client.config.default.xxx
設(shè)置全局配置 - 第 3 類(lèi)為在配置文件中的
feign.client.config.feignName.xxx
設(shè)置專(zhuān)屬配置
5.4.1 優(yōu)先級(jí)的效果
配置文件里的專(zhuān)屬配置-覆蓋->配置文件里的全局配置-覆蓋->配置類(lèi)的配置
5.4.2 追加的原則
RequestInterceptor
是攔截器,可以在發(fā)送前做一些處理,比如統(tǒng)一添加header
信息。每一類(lèi)中的requestInterceptors
可以存儲(chǔ)多個(gè)攔截器,攔截器并非覆蓋的效果,而是鏈?zhǔn)阶芳拥男Ч?;從?zhí)行順序來(lái)看優(yōu)先級(jí)是:1 > 2 > 3,即先執(zhí)行配置類(lèi)中指定的攔截器,然后是配置文件中指定的全局?jǐn)r截器,最后是配置文件中指定的專(zhuān)屬攔截器。
需特別注意:RequestInterceptor
的實(shí)現(xiàn)類(lèi)(例如 RI-A,RI-B)上如果添加了@Component
注解,就都會(huì)被掃描識(shí)別到,并被追加到第一類(lèi)的requestInterceptors
列表中;倘若不小心 RI-A 還在第 2 類(lèi)中又被指定了,則還會(huì)將攔截器 RI-A 追加在第二類(lèi)的requestInterceptors
列表中,結(jié)果是會(huì) RI-A 總計(jì)會(huì)執(zhí)行 2 次;若也在第三類(lèi)中指定 RI-A,則 RI-A 也在其列表中追加,結(jié)果是 RI-A 總計(jì)會(huì)執(zhí)行 3 次。
5.4.3 攔截器的效果驗(yàn)證
以一個(gè)實(shí)例來(lái)驗(yàn)證說(shuō)明效果
自定義三個(gè) RequestInterceptor
class FeignInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("user", "myuser1"); requestTemplate.header("password", "mypassword"); } }
class FeignInterceptor1 implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("user1", "myuser1"); requestTemplate.header("password1", "mypassword1"); } }
class FeignInterceptor2 implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header("user2", "myuser2"); requestTemplate.header("password2", "mypassword2"); } }
@FeignClient 中指定一個(gè)
@FeignClient( name = "test-service", url = "http://localhost:8080/feign/server/", configuration = {FeignInterceptor.class,TestConfiguration.class}, fallback = TestService.DefaultFallback.class )
配置中指定 2 個(gè)
default
指定了一個(gè),test-service
里指定一個(gè)
feign:
httpclient:
enabled: true
okhttp:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
#loggerLevel: none
requestInterceptors:
- com.zto.titans.test.feign.service.FeignInterceptor1
test-service:
#loggerLevel: basic
requestInterceptors:
- com.zto.titans.test.feign.service.FeignInterceptor2
logging:
level:
com.zto.titans.test.feign.service.TestService : DEBUG
根據(jù)追加邏輯,最終執(zhí)行的順序是:
- FeignInterceptor
- FeignInterceptor1
- FeignInterceptor2
總結(jié)
本篇主要介紹 SpringBoot 中要玩轉(zhuǎn) Feign 需要掌握的如添加 pom 依賴、客戶端注解啟用、切換底層 HttpClient、配置數(shù)據(jù)壓縮、調(diào)整日志級(jí)別、定制配置、配置的優(yōu)先級(jí)機(jī)制、增加攔截器以及攔截器的追加機(jī)制等知識(shí),以實(shí)例 + 效果的方式幫讀者高效全面并深入的理解它們。
到此這篇關(guān)于SpringBoot Feign使用教程超全面講解的文章就介紹到這了,更多相關(guān)SpringBoot Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用quartz,注入feignClient,client為null問(wèn)題
- SpringBoot使用Feign進(jìn)行服務(wù)間通信的實(shí)現(xiàn)示例代碼
- springboot+feign+Hystrix整合(親測(cè)有效)
- SpringBoot之使用Feign實(shí)現(xiàn)微服務(wù)間的交互
- SpringBoot動(dòng)態(tài)Feign服務(wù)調(diào)用詳解
- SpringBoot + openFeign實(shí)現(xiàn)遠(yuǎn)程接口調(diào)用的過(guò)程
- springboot單獨(dú)使用feign簡(jiǎn)化接口調(diào)用方式
- springboot集成Feign的實(shí)現(xiàn)示例
相關(guān)文章
Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析
這篇文章主要介紹了Java使用pulsar-flink-connector讀取pulsar catalog元數(shù)據(jù)代碼剖析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Java反射中java.beans包學(xué)習(xí)總結(jié)
本篇文章通過(guò)學(xué)習(xí)Java反射中java.beans包,吧知識(shí)點(diǎn)做了總結(jié),并把相關(guān)內(nèi)容做了關(guān)聯(lián),對(duì)此有需要的朋友可以學(xué)習(xí)參考下。2018-02-02Spring Boot集成Quartz注入Spring管理的類(lèi)的方法
本篇文章主要介紹了Spring Boot集成Quartz注入Spring管理的類(lèi)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04SpringSecurity6自定義JSON登錄的實(shí)現(xiàn)
目前最新版的Spring Boot已經(jīng)到了3.0.5了,隨之而來(lái)Spring Security 目前的版本也到了6.0.2了,Spring Security寫(xiě)法的變化特別多,本文就來(lái)介紹下,感興趣的可以了解一下2023-12-12