SpringCloud整合OpenFeign問題
什么是OpenFeign
Feign是NetFlix開發(fā)的聲明式、模板化的HTTP客戶端,F(xiàn)eign可以幫助我們更便捷的調(diào)用HTTP API,F(xiàn)eign支持多種注解,
例如Feign自帶的注解或者JAX-RS注解等,OpenFeign是對Feign的加強版,使其支持Spring MVC注解,另外還整合了Nacos和Ribbon,從而使用Feign更加的方便,F(xiàn)eign主要的優(yōu)勢就在于可以做到調(diào)用遠程服務(wù)時就像調(diào)用本地的服務(wù)一樣的體驗。
開發(fā)者完全感知不到是遠程API,更感知不到這是一個HTTP請求,它就像Dubbo一樣,consumer直接調(diào)用接口方法provider,而不需要通過常規(guī)的Http Client構(gòu)造請求在解析返回數(shù)據(jù),主要還是解決了開發(fā)者無需關(guān)心調(diào)用遠程API或無需關(guān)心分布式環(huán)境開發(fā)
整合OpenFeign
引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后在啟動類上加上Feign的注解:@EnableFeignClients

加上后就可以開始調(diào)用其他服務(wù)的方法了,具體實現(xiàn)如下
@FeignClient注解中就是去指定我們所要調(diào)用的服務(wù)信息,里面兩個參數(shù)意思我在代碼中給大家提示了,緊接著我們就可以像正常的調(diào)用service層去調(diào)用此方法了。
package com.fujii.order.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @Author: Fujii
* @description:
*/
/**
* name:指定調(diào)用rest接口所對應(yīng)的服務(wù)名
* path:指定調(diào)用rest接口所在的controller中的@RequestMapping
*/
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {
@GetMapping(value = "/reduct")
public String reduct();
}
這里我也把示例給大家粘貼出來吧
package com.fujii.order.controller;
import com.fujii.order.feign.StockFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: Fujii
* @description: 訂單服務(wù)
*/
@RestController
@RequestMapping(value = "/order")
public class OrderController {
@Autowired
private StockFeignService stockFeignService;
@GetMapping(value = "/add")
public String add(){
System.out.println("下單成功!");
String reduct = stockFeignService.reduct();
return "下單成功!"+reduct;
}
}
然后我們啟動服務(wù)查看是否能正常訪問,如下圖訪問正常,說明配置無誤

下面我在與大家說一下OpenFeign的其他的一些特性
日志配置
通過源碼可以看到日志等級分為4種
- NONE【性能最佳,適用于生產(chǎn)環(huán)境】不記錄任何日志信息(默認(rèn)級別)
- BASIC【適用于生產(chǎn)環(huán)境追蹤問題】僅記錄請求方法、URL、響應(yīng)狀態(tài)和執(zhí)行時間
- HEADRS:記錄BASIC的基礎(chǔ)之上 在記錄請求和響應(yīng)的HEAD
- FULL:【適用于開發(fā)環(huán)境和測試環(huán)境問題定位】記錄請求和響應(yīng)的HEAD、body和元數(shù)據(jù)
配置方式有兩種:
第一種:全局配置 使用@Configuration進行全局配置
package com.fujii.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: Fujii
* @description: OpenFeign日志輸出
*/
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.FULL;
}
}
這里配置好后大家在設(shè)置一個日志級別為DEBUG級別,因為springboot默認(rèn)的日志級別是info,而feign的debug日志就不會輸出出來
logging:
level:
com.fujii.order.feign: debug
設(shè)置好后去調(diào)用API后可以看到我調(diào)用了兩個服務(wù)為stock-service的和product-service的

上面這種是全局配置,那么想要設(shè)置成局部配置 也是很簡單,只需要在上面的config配置類中將@configuration注解清除掉 然后在配置文件中局部配置即可
feign:
client:
config:
product-service:
loggerLevel: BASIC
重啟可查看到是生效了

還有一種方式就是直接在feign service的調(diào)用服務(wù)中去調(diào)用配置類也是可以生效具體實現(xiàn)如下:

契約配置
契約配置主要是解決我們之前可能有些項目中使用到了feign 用的是feign的一些注解 但是我想在這基礎(chǔ)之上升級為OpenFeign 又不去改變原來的代碼 那么就可以使用契約配置來解決,實現(xiàn)方式也很簡單,以下是設(shè)置成局部修改成feign
feign:
client:
config:
product-service:
loggerLevel: BASIC
contract: feign.Contract.Default #設(shè)置為默認(rèn)的契約模式
全局的需在配置文件中添加如下代碼
@Bean
public Contract feignContract(){
return new Contract.Default();
}
超時時間配置
超時時間主要是給我們的服務(wù)設(shè)置一個時間限制 超過這個限制則返回請求重試或者連接超時,設(shè)置起來也簡單,下面我來演示一下全局配置和局部配置
全局配置:
@Bean
public Request.Options options(){
return new Request.Options(5000,10000);
}
局部配置:
feign:
client:
config:
product-service:
loggerLevel: BASIC
contract: feign.Contract.Default #設(shè)置為默認(rèn)的契約模式
#連接超時時間:默認(rèn)是2秒
connectionTimeout: 5000
#請求處理超時時間 默認(rèn)是5秒
readTimeout: 3000
當(dāng)超過限制之后,會報錯異常

自定義攔截器
openfign有一個攔截器可以幫助我們攔截服務(wù)中的一些請求的某些操作 實現(xiàn)的示例我放入以下參考,大家可以根據(jù)實際需求來擴展攔截的信息
package com.fujii.order.interceptor;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Author: Fujii
* @description:
*/
public class CustomFeignIntercptor implements RequestInterceptor {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("name","fujii");
requestTemplate.query("id","1");
requestTemplate.uri("9");
logger.info("feign攔截器");
}
}
在寫完攔截器之后我們還需要配置一下
feign:
client:
config:
product-service:
loggerLevel: BASIC
contract: feign.Contract.Default #設(shè)置為默認(rèn)的契約模式
#連接超時時間:默認(rèn)是2秒
connectionTimeout: 5000
#請求處理超時時間 默認(rèn)是5秒
readTimeout: 10000
requestInterceptors[0]: #feign攔截器
com.fujii.order.interceptor.CustomFeignIntercptor
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot集成knife4j實現(xiàn)風(fēng)格化API文檔
這篇文章主要介紹了Springboot如何集成knife4j實現(xiàn)風(fēng)格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下2020-12-12
@JsonFormat?和?@DateTimeFormat?時間格式化注解(場景示例代碼)
這篇文章主要介紹了@JsonFormat和@DateTimeFormat時間格式化注解,本文通過場景示例代碼詳解給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價值,有興趣的可以了解一下。2017-01-01

