使用OpenFeign的五個(gè)步驟和七個(gè)高級(jí)功能
什么是Feign?
Feign是一個(gè)開(kāi)源的Java庫(kù),用于簡(jiǎn)化Web請(qǐng)求的過(guò)程。
它通過(guò)提供更高級(jí)別的抽象來(lái)簡(jiǎn)化RESTful Web服務(wù)的實(shí)現(xiàn),消除了樣板代碼的需要,使代碼庫(kù)更具可讀性和可維護(hù)性。
Feign是一個(gè)流行的Java HTTP客戶(hù)端庫(kù),具有多種優(yōu)勢(shì)和特性,是開(kāi)發(fā)基于HTTP的微服務(wù)和應(yīng)用程序的不錯(cuò)選擇。
什么是聲明式HTTP客戶(hù)端?
聲明式HTTP客戶(hù)端是一種通過(guò)編寫(xiě)Java接口來(lái)發(fā)起HTTP請(qǐng)求的方式。
Feign會(huì)根據(jù)我們提供的注解,在接口背后生成實(shí)際的實(shí)現(xiàn)。
為何使用Feign?
如果我們需要調(diào)用大量的API,手動(dòng)編寫(xiě)HTTP代碼或使用難以維護(hù)的代碼生成方式并不理想。
使用Feign,我們可以通過(guò)一個(gè)簡(jiǎn)單的小接口來(lái)描述API,讓Feign在運(yùn)行時(shí)解釋和實(shí)現(xiàn)該接口,這樣更加簡(jiǎn)便且易于維護(hù)。
誰(shuí)適合使用Feign?
如果我們?cè)贘ava代碼中需要發(fā)起HTTP請(qǐng)求,并且不想編寫(xiě)樣板代碼,或者不想直接使用像Apache httpclient這樣的庫(kù),那么Feign是一個(gè)很好的選擇。
創(chuàng)建基本的Feign客戶(hù)端
步驟0:添加bom
我們依然使用feign-bom作為版本管理:
<project>
……
<properties>
<openfeign.version>13.4</openfeign.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-bom</artifactId>
<version>${openfeign.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
步驟1:添加Feign依賴(lài)
引入feign-core:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
</dependency>
步驟2:定義客戶(hù)端接口
該接口通常包含帶有Feign注解的方法聲明。
我們將為服務(wù)器上要調(diào)用的每個(gè)REST端點(diǎn)聲明一個(gè)客戶(hù)端接口方法,這些只是聲明,無(wú)需實(shí)現(xiàn)這些方法,F(xiàn)eign會(huì)為我們完成。方法簽名應(yīng)包括HTTP方法以及所有必需的數(shù)據(jù)。
假設(shè)我們要定義一個(gè)表示計(jì)算器服務(wù)的接口,它有執(zhí)行加法、減法、乘法和除法等計(jì)算的簡(jiǎn)單API方法:
public interface CalculatorService {
/**
* 兩整數(shù)相加。
*
* @param firstNumber 第一個(gè)整數(shù)
* @param secondNumber 第二個(gè)整數(shù)
* @return 兩數(shù)之和
*/
@RequestLine("POST /operations/add?firstNumber={firstNumber}&secondNumber={secondNumber}")
Long add(@Param("firstNumber") Long firstNumber,
@Param("secondNumber") Long secondNumber);
/**
* 兩整數(shù)相減。
*
* @param firstNumber 第一個(gè)整數(shù)
* @param secondNumber 第二個(gè)整數(shù)
* @return 兩數(shù)之差
*/
@RequestLine("POST /operations/subtract?firstNumber={firstNumber}&secondNumber={secondNumber}")
Long subtract(@Param("firstNumber") Long firstNumber,
@Param("secondNumber") Long secondNumber);
/**
* 兩整數(shù)相乘。
*
* @param firstNumber 第一個(gè)整數(shù)
* @param secondNumber 第二個(gè)整數(shù)
* @return 兩數(shù)之積
*/
@RequestLine("POST /operations/multiply?firstNumber={firstNumber}&secondNumber={secondNumber}")
Long multiply(@Param("firstNumber") Long firstNumber,
@Param("secondNumber") Long secondNumber);
/**
* 兩整數(shù)相除。
*
* @param firstNumber 第一個(gè)整數(shù)
* @param secondNumber 第二個(gè)整數(shù),不應(yīng)為零
* @return 兩數(shù)之商
*/
@RequestLine("POST /operations/divide?firstNumber={firstNumber}&secondNumber={secondNumber}")
Long divide(@Param("firstNumber") Long firstNumber,
@Param("secondNumber") Long secondNumber);
}
@RequestLine
定義了請(qǐng)求的HTTP方法和url模板,而@Param
定義了一個(gè)模板變量。
?
不用擔(dān)心,稍后我們將詳細(xì)了解OpenFeign提供的注解。
步驟3:創(chuàng)建客戶(hù)端對(duì)象
我們使用Feign的builder()方法來(lái)準(zhǔn)備客戶(hù)端:
final CalculatorService target = Feign
.builder()
.decoder(new JacksonDecoder())
.target(CalculatorService.class, HOST);
準(zhǔn)備客戶(hù)端的方式有很多種,具體取決于我們的需求。
上面給出的代碼片段只是準(zhǔn)備客戶(hù)端的一種簡(jiǎn)單方式。
我們注冊(cè)了用于解碼JSON響應(yīng)的解碼器,解碼器可以根據(jù)服務(wù)返回的響應(yīng)的內(nèi)容類(lèi)型進(jìn)行更改,稍后我們將詳細(xì)了解解碼器。
步驟4:使用客戶(hù)端進(jìn)行API調(diào)用
現(xiàn)在讓我們調(diào)用客戶(hù)端的add()方法:
final Long result = target.add(firstNumber, secondNumber);
與其他HTTP客戶(hù)端相比,使用Feign HTTP客戶(hù)端調(diào)用服務(wù)相當(dāng)簡(jiǎn)單。
Feign注解
OpenFeign使用一組注解來(lái)定義HTTP請(qǐng)求及其參數(shù),常用的OpenFeign注解及其示例如下:
注解 | 描述 | 示例 |
@RequestLine | 指定HTTP方法和路徑 | @RequestLine("GET /resource/{id}") |
@Headers | 指定請(qǐng)求的HTTP頭 | @Headers("Authorization: Bearer {token}") |
@QueryMap | 將查詢(xún)參數(shù)映射到請(qǐng)求 | @QueryMap Map<String, Object> queryParams |
@Body | 發(fā)送特定對(duì)象作為請(qǐng)求體 | @Body RequestObject requestObject |
@Param | 向請(qǐng)求添加查詢(xún)參數(shù) | @Param("id") long resourceId |
@Path | 替換路徑中的模板變量 | @Path("id") long resourceId |
@RequestHeader | 向請(qǐng)求添加頭 | @RequestHeader("Authorization") String authToken |
@Headers | 指定請(qǐng)求的其他頭 | @Headers("Accept: application/json") |
這些注解可以用來(lái)定義OpenFeign客戶(hù)端接口,使其易于使用OpenFeign與遠(yuǎn)程服務(wù)進(jìn)行交互。我們可以根據(jù)特定的API要求混合和匹配這些注解。
處理響應(yīng)
Feign還提供了一種聲明式的API集成方法。
與手動(dòng)編寫(xiě)處理響應(yīng)或錯(cuò)誤的樣板代碼不同,F(xiàn)eign允許我們定義自定義處理程序并將其注冊(cè)到Feign構(gòu)建器中。
這不僅減少了我們需要編寫(xiě)的代碼量,還提高了可讀性和可維護(hù)性。
讓我們看一個(gè)解碼器的示例:
final CalculatorService target = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(CalculatorService.class, HOST);
這段給定的代碼片段展示了創(chuàng)建一個(gè)Feign客戶(hù)端,使用Jackson進(jìn)行請(qǐng)求編碼和響應(yīng)解碼:
- encoder(new JacksonEncoder()):在這里,為Feign客戶(hù)端設(shè)置了一個(gè)JacksonEncoder。JacksonEncoder是Feign Jackson模塊的一部分,用于將Java對(duì)象編碼為JSON格式的HTTP請(qǐng)求體。當(dāng)需要在請(qǐng)求體中發(fā)送對(duì)象時(shí),這特別有用。
- decoder(new JacksonDecoder()):同樣,為Feign客戶(hù)端設(shè)置了一個(gè)JacksonDecoder。JacksonDecoder負(fù)責(zé)將服務(wù)器的JSON響應(yīng)解碼為Java對(duì)象,它將JSON響應(yīng)反序列化為相應(yīng)的Java對(duì)象。
處理錯(cuò)誤
錯(cuò)誤處理是構(gòu)建健壯可靠應(yīng)用程序的關(guān)鍵方面,尤其是在進(jìn)行遠(yuǎn)程API調(diào)用時(shí)。Feign提供了強(qiáng)大的功能來(lái)幫助有效地處理錯(cuò)誤。
Feign讓我們對(duì)處理意外響應(yīng)有更多的控制。我們可以通過(guò)構(gòu)建器注冊(cè)一個(gè)自定義的ErrorDecoder。
final CalculatorService target = Feign.builder()
.errorDecoder(new CalculatorErrorDecoder())
.target(CalculatorService.class, HOST);
以下是一個(gè)錯(cuò)誤處理的示例:
public class CalculatorErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
ExceptionMessage message = null;
try (InputStream bodyIs = response.body().asInputStream()) {
ObjectMapper mapper = new ObjectMapper();
message = mapper.readValue(bodyIs, ExceptionMessage.class);
} catch (IOException e) {
return new Exception(e.getMessage());
}
final String messageStr = message == null? "" : message.getMessage();
switch (response.status()) {
case 400:
return new RuntimeException(messageStr.isEmpty()
? "Bad Request"
: messageStr
);
case 401:
return new RetryableException(response.status(),
response.reason(),
response.request().httpMethod(),
null,
response.request());
case 404:
return new RuntimeException(messageStr.isEmpty()
? "Not found"
: messageStr
);
default:
return defaultErrorDecoder.decode(methodKey, response);
}
}
}
所有HTTP狀態(tài)不在HTTP 2xx范圍內(nèi)的響應(yīng),例如HTTP 400,都將觸發(fā)ErrorDecoder的decode()方法。
在這個(gè)重寫(xiě)的decode()方法中,我們可以處理響應(yīng),將失敗包裝成自定義異常或執(zhí)行任何其他處理。
我們甚至可以通過(guò)拋出RetryableException來(lái)再次重試請(qǐng)求,這將調(diào)用注冊(cè)的Retryer。Retryer將在高級(jí)技術(shù)部分詳細(xì)解釋。
高級(jí)技術(shù)
集成編碼器/解碼器
編碼器和解碼器分別用于對(duì)請(qǐng)求和響應(yīng)數(shù)據(jù)進(jìn)行編碼/解碼。我們根據(jù)請(qǐng)求和響應(yīng)的內(nèi)容類(lèi)型選擇它們,例如,對(duì)于JSON數(shù)據(jù)可以使用Gson或Jackson。
以下是一個(gè)使用Jackson編碼器和解碼器的示例:
final CalculatorService target = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(CalculatorService.class, HOST);
更改HTTP客戶(hù)端
默認(rèn)情況下,F(xiàn)eign使用其自帶的HTTP客戶(hù)端。將Feign的默認(rèn)HTTP客戶(hù)端從原始的Apache HTTP Client更改為其他庫(kù)(如OkHttp)的主要?jiǎng)訖C(jī)是為了獲得更好的性能、改進(jìn)的功能以及與現(xiàn)代HTTP標(biāo)準(zhǔn)更好的兼容性。
現(xiàn)在讓我們看看如何覆蓋HTTP客戶(hù)端:
final CalculatorService target = Feign.builder()
.client(new OkHttpClient())
.target(CalculatorService.class, HOST);
配置日志記錄器
SLF4JModule用于將Feign的日志記錄發(fā)送到SLF4J。通過(guò)SLF4J,我們可以輕松使用我們選擇的日志后端(Logback、Log4J等)。
以下是一個(gè)構(gòu)建客戶(hù)端的示例:
final CalculatorService target = Feign.builder()
.logger(new Slf4jLogger())
.logLevel(Level.FULL)
.target(CalculatorService.class, HOST);
要在Feign中使用SLF4J,需要將SLF4J模塊和我們選擇的SLF4J綁定添加到類(lèi)路徑中,然后按照上述方式配置Feign使用Slf4jLogger。
配置請(qǐng)求攔截器
Feign中的請(qǐng)求攔截器允許我們?cè)趯TTP請(qǐng)求發(fā)送到遠(yuǎn)程服務(wù)器之前對(duì)其進(jìn)行自定義和操作。它們可用于多種目的,例如添加自定義頭、日志記錄、身份驗(yàn)證或請(qǐng)求修改。
以下是我們可能希望在Feign中使用請(qǐng)求攔截器的原因:
- 身份驗(yàn)證:我們可以使用請(qǐng)求攔截器向每個(gè)請(qǐng)求添加身份驗(yàn)證令牌或憑據(jù),例如添加帶有JWT令牌的“Authorization”頭。
- 日志記錄:攔截器有助于記錄傳入和傳出的請(qǐng)求和響應(yīng),這對(duì)于調(diào)試和監(jiān)控很有用。
- 請(qǐng)求修改:我們可以在發(fā)送請(qǐng)求之前修改請(qǐng)求,包括更改頭、查詢(xún)參數(shù)甚至請(qǐng)求體。
- 速率限制:通過(guò)檢查發(fā)出的請(qǐng)求數(shù)量來(lái)決定是否允許或阻止請(qǐng)求,從而實(shí)現(xiàn)速率限制。
- 緩存:根據(jù)特定標(biāo)準(zhǔn)緩存請(qǐng)求/響應(yīng)數(shù)據(jù)。
以下是一個(gè)演示如何使用請(qǐng)求攔截的代碼片段:
static class AuthorizationInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 檢查令牌是否存在,如果不存在則添加它
template.header("Authorization", "Bearer " + generatedToken);
}
}
public class CalculatorServiceTest {
public static void main(String[] args) {
final AuthorizationInterceptor interceptor = new AuthorizationInterceptor();
final CalculatorService target = Feign.builder()
.requestInterceptor(interceptor)
.target(CalculatorService.class, HOST);
}
}
實(shí)現(xiàn)RequestInterceptor并覆蓋其apply()方法,以根據(jù)需要對(duì)請(qǐng)求進(jìn)行任何修改。
配置重試器
OpenFeign Retryer是一個(gè)組件,允許我們配置Feign在請(qǐng)求失敗時(shí)如何處理重試。它對(duì)于處理網(wǎng)絡(luò)通信中的瞬時(shí)故障特別有用,我們可以指定Feign應(yīng)自動(dòng)重試失敗請(qǐng)求的條件。
重試器配置
要在OpenFeign中使用重試器,需要提供Retryer接口的實(shí)現(xiàn)。Retryer接口有兩個(gè)方法:
- boolean continueOrPropagate(int attemptedRetries, int responseStatus, Request request):此方法用于確定是繼續(xù)重試還是傳播錯(cuò)誤。它接受?chē)L試重試的次數(shù)、HTTP響應(yīng)狀態(tài)和請(qǐng)求作為參數(shù),并返回true以繼續(xù)重試或false以傳播錯(cuò)誤。
- Retryer clone():此方法創(chuàng)建重試器實(shí)例的克隆。
默認(rèn)重試器
Feign提供了一個(gè)默認(rèn)的重試器實(shí)現(xiàn),名為Retryer.Default。當(dāng)我們創(chuàng)建Feign客戶(hù)端而未顯式指定自定義重試器時(shí),將使用此默認(rèn)重試器。
它提供了兩個(gè)工廠方法來(lái)創(chuàng)建Retryer對(duì)象。
第一個(gè)工廠方法不需要任何參數(shù):
public Default() {
this(100L, TimeUnit.SECONDS.toMillis(1L), 5);
}
它定義了一個(gè)簡(jiǎn)單的重試策略,具有以下特點(diǎn):
- 最大嘗試次數(shù):對(duì)于失敗的請(qǐng)求,最多允許5次重試嘗試。
- 退避期:在重試之間使用指數(shù)退避策略,從100毫秒的退避開(kāi)始,每次后續(xù)重試將退避時(shí)間加倍。
- 可重試異常:如果請(qǐng)求導(dǎo)致任何被認(rèn)為可重試的異常(通常包括網(wǎng)絡(luò)相關(guān)異常,如連接超時(shí)或套接字異常),則會(huì)重試請(qǐng)求。
第二個(gè)工廠方法需要一些參數(shù)。如果默認(rèn)配置不適合我們,可以使用它:
public Default(long period, long maxPeriod, int maxAttempts)
// 使用它創(chuàng)建重試器
new Retryer.Default(1, 100, 10);
雖然Feign提供的默認(rèn)重試器涵蓋了許多常見(jiàn)的重試場(chǎng)景,但在某些情況下,我們可能希望定義自定義重試器。以下是定義自定義重試器的一些動(dòng)機(jī):
- 精細(xì)控制:如果我們需要對(duì)默認(rèn)重試行為進(jìn)行更多控制,例如指定不同的最大重試次數(shù)或自定義退避策略,自定義重試器允許我們根據(jù)特定要求定制行為。
- 重試邏輯:在某些情況下,我們可能只希望針對(duì)特定的響應(yīng)代碼或異常重試請(qǐng)求。自定義重試器允許我們實(shí)現(xiàn)自己的邏輯來(lái)確定何時(shí)應(yīng)該進(jìn)行重試。
- 日志記錄和指標(biāo):如果我們想要記錄或收集與重試嘗試相關(guān)的指標(biāo),實(shí)現(xiàn)自定義重試器提供了添加此功能的機(jī)會(huì)。
- 與斷路器集成:如果我們將斷路器模式與Feign結(jié)合使用,自定義重試器可以與斷路器的狀態(tài)集成,以便在決定何時(shí)重試或何時(shí)打開(kāi)斷路器時(shí)做出更明智的決策。
- 非標(biāo)準(zhǔn)重試策略:對(duì)于不適合默認(rèn)重試器提供的標(biāo)準(zhǔn)重試策略的場(chǎng)景,例如速率限制的API或具有特定重試要求的API,我們可以定義適合我們用例的自定義重試器。
以下是在OpenFeign中實(shí)現(xiàn)自定義Retryer的示例:
public class CalculatorRetryer implements Retryer {
/**
* 重試之間等待的毫秒數(shù)
*/
private final long period;
/**
* 最大重試次數(shù)
*/
private final int maxAttempts;
private int attempt = 1;
@Override
public void continueOrPropagate(RetryableException e) {
log.info("Feign retry attempt {} of {} due to {}",
attempt,
maxAttempts,
e.getMessage());
if (++attempt > maxAttempts) {
throw e;
}
if (e.status() == 401) {
try {
Thread.sleep(period);
} catch (InterruptedException ex) {
throw e;
}
} else {
throw e;
}
}
@Override
public Retryer clone() {
return this;
}
public int getRetryAttempts() {
return attempt - 1; // 減去1以排除初始嘗試
}
}
它專(zhuān)門(mén)重試HTTP 401錯(cuò)誤。
總之,當(dāng)我們需要對(duì)HTTP請(qǐng)求中的重試處理方式有更大的控制權(quán)和靈活性時(shí),就有必要在Feign中創(chuàng)建自定義重試器。當(dāng)我們的需求與默認(rèn)重試器的行為不同時(shí),自定義重試器允許我們根據(jù)特定用例修改重試邏輯。
斷路器
斷路器通常使用單獨(dú)的庫(kù)或工具(如Netflix Hystrix、Resilience4j或Spring Cloud Circuit Breaker)來(lái)實(shí)現(xiàn)。
為何使用斷路器?
在Feign中使用斷路器的主要?jiǎng)訖C(jī)是增強(qiáng)基于微服務(wù)的應(yīng)用程序的彈性。以下是一些關(guān)鍵原因:
- 故障隔離:斷路器通過(guò)隔離故障組件,防止一個(gè)服務(wù)中的故障級(jí)聯(lián)到其他服務(wù)。
- 快速失敗:當(dāng)電路打開(kāi)(表示故障狀態(tài))時(shí),后續(xù)請(qǐng)求會(huì)“快速失敗”,而不會(huì)嘗試向可能無(wú)響應(yīng)或故障的服務(wù)發(fā)出調(diào)用,從而減少延遲和資源消耗。
- 優(yōu)雅降級(jí):當(dāng)依賴(lài)服務(wù)出現(xiàn)問(wèn)題時(shí),斷路器允許應(yīng)用程序優(yōu)雅降級(jí),確保它能夠繼續(xù)提供一組簡(jiǎn)化的功能。
- 監(jiān)控和指標(biāo):斷路器提供指標(biāo)和監(jiān)控功能,使我們能夠跟蹤服務(wù)的健康狀況和性能。
配置斷路器
HystrixFeign用于配置Hystrix提供的斷路器支持。
Hystrix是一個(gè)延遲和容錯(cuò)庫(kù),旨在隔離分布式環(huán)境中對(duì)遠(yuǎn)程系統(tǒng)、服務(wù)和第三方庫(kù)的訪問(wèn)點(diǎn)。它有助于阻止級(jí)聯(lián)故障,并在故障不可避免的復(fù)雜分布式系統(tǒng)中實(shí)現(xiàn)彈性。
要在Feign中使用Hystrix,需要將Hystrix模塊添加到類(lèi)路徑中,并使用HystrixFeign構(gòu)建器,如下所示:
final CalculatorService target = HystrixFeign.builder()
.target(CalculatorService.class, HOST);
讓我們看看如何使用回退類(lèi)來(lái)處理服務(wù)錯(cuò)誤。
在Hystrix中,回退類(lèi)是為Hystrix命令定義回退邏輯的另一種方式,而不是直接在Hystrix命令類(lèi)的getFallback方法中定義回退邏輯。回退類(lèi)提供了關(guān)注點(diǎn)分離,使我們能夠?qū)⒚铑?lèi)專(zhuān)注于主要邏輯,并將回退邏輯委托給單獨(dú)的類(lèi)。這可以提高代碼的組織性和可維護(hù)性。
以下是為CalculatorService實(shí)現(xiàn)回退的示例代碼:
@Slf4j
public class CalculatorHystrixFallback implements CalculatorService {
@Override
public Long add(Long firstNumber, Long secondNumber) {
log.info("[Fallback add] Adding {} and {}", firstNumber, secondNumber);
return firstNumber + secondNumber;
}
@Override
public Long subtract(Long firstNumber, Long secondNumber) {
return null;
}
@Override
public Long multiply(Long firstNumber, Long secondNumber) {
return null;
}
@Override
public Long divide(Long firstNumber, Long secondNumber) {
return null;
}
}
為了演示回退,我們僅實(shí)現(xiàn)了add方法。然后在構(gòu)建客戶(hù)端時(shí)使用此回退:
final CalculatorHystrixFallback fallback = new CalculatorHystrixFallback();
final CalculatorService target = HystrixFeign.builder()
.decoder(new JacksonDecoder())
.target(CalculatorService.class,
HOST, fallback);
當(dāng)add端點(diǎn)返回錯(cuò)誤或電路打開(kāi)時(shí),Hystrix將調(diào)用add回退方法。
收集指標(biāo)
Feign本身不像其他一些庫(kù)或框架那樣提供內(nèi)置的指標(biāo)功能API。
與Feign相關(guān)的指標(biāo),如請(qǐng)求持續(xù)時(shí)間、錯(cuò)誤率或重試次數(shù),通常需要使用外部庫(kù)或工具來(lái)收集和跟蹤。
在Java應(yīng)用程序中收集指標(biāo)的流行庫(kù)包括Micrometer和Dropwizard Metrics。
以下是如何使用常用的Micrometer庫(kù)來(lái)收集和報(bào)告與Feign調(diào)用相關(guān)的指標(biāo):
public class CalculatorServiceTest {
public static void main(String[] args) {
final CalculatorService target = Feign.builder()
.addCapability(new MicrometerCapability())
.target(CalculatorService.class, HOST);
target.contributors("OpenFeign", "feign");
// 從此時(shí)起指標(biāo)將可用
}
}
請(qǐng)注意,我們需要將Micrometer作為依賴(lài)項(xiàng)添加到項(xiàng)目中并進(jìn)行適當(dāng)配置。
文末總結(jié)
本文算是溫故知新的一篇,由淺入深介紹了使用OpenFeign的5個(gè)步驟和7個(gè)高級(jí)功能,OpenFeign的使用方面,已經(jīng)涵蓋全了。后續(xù)再看看在SpringCloud中,OpenFeign的使用,以及在于Ribbon等組件結(jié)合使用時(shí),又能碰撞出哪些火花。