SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解
Feign遠(yuǎn)程調(diào)用
1.1、Feign概述
Feign是一款Java語(yǔ)言編寫的HttpClient綁定器,在Spring Cloud微服務(wù)中用于實(shí)現(xiàn)微服務(wù)之間的聲明式調(diào)用。Feign 可以定義請(qǐng)求到其他服務(wù)的接口,用于微服務(wù)間的調(diào)用,不用自己再寫http請(qǐng)求(eg:使用spring自帶的restTemplate或者h(yuǎn)ttpClinents工具構(gòu)建http請(qǐng)求調(diào)用第三方服務(wù)接口,在客戶端實(shí)現(xiàn),調(diào)用此接口就像遠(yuǎn)程調(diào)用其他服務(wù)一樣,當(dāng)請(qǐng)求出錯(cuò)時(shí)可以調(diào)用接口的實(shí)現(xiàn)類來(lái)返回
Feign是一個(gè)聲明式的web service客戶端,它使得編寫web service客戶端更為容易。
創(chuàng)建接口,為接口添加注解,即可使用Feign。
Feign可以使用Feign注解或者JAX-RS注解,還支持熱插拔的編碼器和解碼器。
Spring Cloud為Feign添加了Spring MVC的注解支持,并整合了Ribbon和Eureka來(lái)為使用Feign時(shí)提供負(fù)載均衡。
1.2、Feign替代RestTemplate
先來(lái)看我們以前利用RestTemplate發(fā)起遠(yuǎn)程調(diào)用的代碼
存在下面的問(wèn)題:
•代碼可讀性差,編程體驗(yàn)不統(tǒng)一
•參數(shù)復(fù)雜URL難以維護(hù)
Feign是一個(gè)聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign
其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送,解決上面提到的問(wèn)題。
1.2.1 引入依賴
我們?cè)趏rder-service服務(wù)的pom文件中引入feign的依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
1.2.2 添加注解
在order-service的啟動(dòng)類添加注解開啟Feign的功能:
@SpringBootApplication @EnableDiscoveryClient //服務(wù)發(fā)現(xiàn) @EnableFeignClients //開啟遠(yuǎn)程調(diào)用 public class TestNacosConsumerApplication { public static void main(String[] args) { SpringApplication.run(TestNacosConsumerApplication.class, args ); } }
1.2.3. 編寫Feign的消費(fèi)服務(wù)提供服務(wù)
消費(fèi)服務(wù)調(diào)用提供服務(wù)
消費(fèi)服務(wù)Feign接口,用來(lái)請(qǐng)求提供服務(wù)
service-consumer服務(wù):
編寫Controller層調(diào)用Feign:
@RestController @RequestMapping("/feign") public class TestFeignController { @Resource private EchoFeign echoFeign; @GetMapping("/echo") public String echo(){ //調(diào)用Feign String echo = echoFeign.tudou(); return "consumer-->"+echo; } }
編寫Feign接口:
@FeignClient(value = "service-provider",path = "test") public interface EchoFeign { @GetMapping("/tudou") public String tudou() ; }
service-provider服務(wù):
編寫Controller層提供被調(diào)用:
@RestController @RequestMapping("/test") public class EchoController { @Resource private HttpServletRequest request; @Resource private PatternProperties patternProperties; @GetMapping("/tudou") public String tudou() { int serverPort = request.getServerPort(); System.out.println(serverPort); return "你好nacos服務(wù),我是愛(ài)吃豆的土豆 " + ":" + serverPort; }
1.2.4 測(cè)試
訪問(wèn)路徑訪問(wèn)消費(fèi)服務(wù),得到提供服務(wù)的結(jié)果:http://localhost:8071/feign/echo
1.2.5 總結(jié)
使用Feign的步驟:
① 引入依賴
② 添加@EnableFeignClients注解
③ 編寫FeignClient接口
④ 使用FeignClient中定義的方法代替RestTemplate
1.3、自定義配置
Feign可以支持很多的自定義配置,如下表所示:
類型 | 作用 | 說(shuō)明 |
---|---|---|
feign.Logger.Level | 修改日志級(jí)別 | 包含四種不同的級(jí)別:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 響應(yīng)結(jié)果的解析器 | http遠(yuǎn)程調(diào)用的結(jié)果做解析,例如解析json字符串為java對(duì)象 |
feign.codec.Encoder | 請(qǐng)求參數(shù)編碼 | 將請(qǐng)求參數(shù)編碼,便于通過(guò)http請(qǐng)求發(fā)送 |
feign. Contract | 支持的注解格式 | 默認(rèn)是SpringMVC的注解 |
feign. Retryer | 失敗重試機(jī)制 | 請(qǐng)求失敗的重試機(jī)制,默認(rèn)是沒(méi)有,不過(guò)會(huì)使用Ribbon的重試 |
一般情況下,默認(rèn)值就能滿足我們使用,如果要自定義時(shí),只需要?jiǎng)?chuàng)建自定義的@Bean覆蓋默認(rèn)Bean即可。
下面以日志為例來(lái)演示如何自定義配置。
1.3.1 方式一配置文件方式
基于配置文件修改feign的日志級(jí)別可以針對(duì)單個(gè)服務(wù):局部生效
feign:
client:
config:
userservice: # 針對(duì)某個(gè)微服務(wù)的配置
loggerLevel: FULL # 日志級(jí)別
也可以針對(duì)所有服務(wù):全局生效
feign:
client:
config:
default: # 這里用default就是全局配置,如果是寫服務(wù)名稱,則是針對(duì)某個(gè)微服務(wù)的配置
loggerLevel: FULL # 日志級(jí)別
而日志的級(jí)別分為四種:
- NONE:不記錄任何日志信息,這是默認(rèn)值。
- BASIC:僅記錄請(qǐng)求的方法,URL以及響應(yīng)狀態(tài)碼和執(zhí)行時(shí)間
- HEADERS:在BASIC的基礎(chǔ)上,額外記錄了請(qǐng)求和響應(yīng)的頭信息
- FULL:記錄所有請(qǐng)求和響應(yīng)的明細(xì),包括頭信息、請(qǐng)求體、元數(shù)據(jù)。
1.3.2 方式二Java代碼方式
也可以基于Java代碼來(lái)修改日志級(jí)別,先聲明一個(gè)類,然后聲明一個(gè)Logger.Level的對(duì)象:
public class DefaultFeignConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; // 日志級(jí)別為BASIC } }
如果要**全局生效**,將其放到啟動(dòng)類的@EnableFeignClients這個(gè)注解中:
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
如果是**局部生效**,則把它放到對(duì)應(yīng)的@FeignClient這個(gè)注解中:
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
總結(jié):
Feign的日志配置:
1. 方式一是配置文件, feign.client.config.xxx.loggerLevel
① 如果 xxx 是 default 則代表全局
② 如果 xxx 是服務(wù)名稱,例如 userservice 則代表某服務(wù)
2. 方式二是 java 代碼配置 Logger.Level 這個(gè) Bean
① 如果在 @EnableFeignClients 注解聲明則代表全局
② 如果在 @FeignClient 注解中聲明則代表某服務(wù)
到此這篇關(guān)于SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解的文章就介紹到這了,更多相關(guān)SpringCloud Feign遠(yuǎn)程調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在SpringBoot中無(wú)縫整合Dubbo的實(shí)現(xiàn)過(guò)程
微服務(wù)架構(gòu)已經(jīng)成為現(xiàn)代應(yīng)用開發(fā)的熱門趨勢(shì),而Dubbo作為一款強(qiáng)大的分布式服務(wù)框架,與Spring?Boot的結(jié)合是構(gòu)建高性能微服務(wù)應(yīng)用的理想選擇,本文將詳細(xì)介紹如何在SpringBoot中無(wú)縫整合Dubbo,需要的朋友可以參考下2024-01-01springboot mybatis調(diào)用多個(gè)數(shù)據(jù)源引發(fā)的錯(cuò)誤問(wèn)題
這篇文章主要介紹了springboot mybatis調(diào)用多個(gè)數(shù)據(jù)源引發(fā)的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java開發(fā)SpringBoot參數(shù)校驗(yàn)過(guò)程示例教程
這篇文章主要為大家介紹了SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的過(guò)程示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Mybatis-Plus中update()和updateById()將字段更新為null
本文主要介紹了Mybatis-Plus中update()和updateById()將字段更新為null,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java Spring的數(shù)據(jù)庫(kù)開發(fā)詳解
這篇文章主要介紹了Spring的數(shù)據(jù)庫(kù)開發(fā),主要圍繞SpringJDBC和Spring Jdbc Template兩個(gè)技術(shù)來(lái)講解,文中有詳細(xì)的代碼示例,需要的小伙伴可以參考一下2023-04-04Springboot下載excel文件中文名亂碼問(wèn)題及解決
這篇文章主要介紹了Springboot下載excel文件中文名亂碼問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05