SpringCloud整合OpenFeign問題
什么是OpenFeign
Feign是NetFlix開發(fā)的聲明式、模板化的HTTP客戶端,F(xiàn)eign可以幫助我們更便捷的調用HTTP API,F(xiàn)eign支持多種注解,
例如Feign自帶的注解或者JAX-RS注解等,OpenFeign是對Feign的加強版,使其支持Spring MVC注解,另外還整合了Nacos和Ribbon,從而使用Feign更加的方便,F(xiàn)eign主要的優(yōu)勢就在于可以做到調用遠程服務時就像調用本地的服務一樣的體驗。
開發(fā)者完全感知不到是遠程API,更感知不到這是一個HTTP請求,它就像Dubbo一樣,consumer直接調用接口方法provider,而不需要通過常規(guī)的Http Client構造請求在解析返回數(shù)據(jù),主要還是解決了開發(fā)者無需關心調用遠程API或無需關心分布式環(huán)境開發(fā)
整合OpenFeign
引入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
然后在啟動類上加上Feign的注解:@EnableFeignClients
加上后就可以開始調用其他服務的方法了,具體實現(xiàn)如下
@FeignClient注解中就是去指定我們所要調用的服務信息,里面兩個參數(shù)意思我在代碼中給大家提示了,緊接著我們就可以像正常的調用service層去調用此方法了。
package com.fujii.order.feign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; /** * @Author: Fujii * @description: */ /** * name:指定調用rest接口所對應的服務名 * path:指定調用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: 訂單服務 */ @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; } }
然后我們啟動服務查看是否能正常訪問,如下圖訪問正常,說明配置無誤
下面我在與大家說一下OpenFeign的其他的一些特性
日志配置
通過源碼可以看到日志等級分為4種
- NONE【性能最佳,適用于生產環(huán)境】不記錄任何日志信息(默認級別)
- BASIC【適用于生產環(huán)境追蹤問題】僅記錄請求方法、URL、響應狀態(tài)和執(zhí)行時間
- HEADRS:記錄BASIC的基礎之上 在記錄請求和響應的HEAD
- FULL:【適用于開發(fā)環(huán)境和測試環(huán)境問題定位】記錄請求和響應的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; } }
這里配置好后大家在設置一個日志級別為DEBUG級別,因為springboot默認的日志級別是info,而feign的debug日志就不會輸出出來
logging: level: com.fujii.order.feign: debug
設置好后去調用API后可以看到我調用了兩個服務為stock-service的和product-service的
上面這種是全局配置,那么想要設置成局部配置 也是很簡單,只需要在上面的config配置類中將@configuration注解清除掉 然后在配置文件中局部配置即可
feign: client: config: product-service: loggerLevel: BASIC
重啟可查看到是生效了
還有一種方式就是直接在feign service的調用服務中去調用配置類也是可以生效具體實現(xiàn)如下:
契約配置
契約配置主要是解決我們之前可能有些項目中使用到了feign 用的是feign的一些注解 但是我想在這基礎之上升級為OpenFeign 又不去改變原來的代碼 那么就可以使用契約配置來解決,實現(xiàn)方式也很簡單,以下是設置成局部修改成feign
feign: client: config: product-service: loggerLevel: BASIC contract: feign.Contract.Default #設置為默認的契約模式
全局的需在配置文件中添加如下代碼
@Bean public Contract feignContract(){ return new Contract.Default(); }
超時時間配置
超時時間主要是給我們的服務設置一個時間限制 超過這個限制則返回請求重試或者連接超時,設置起來也簡單,下面我來演示一下全局配置和局部配置
全局配置:
@Bean public Request.Options options(){ return new Request.Options(5000,10000); }
局部配置:
feign: client: config: product-service: loggerLevel: BASIC contract: feign.Contract.Default #設置為默認的契約模式 #連接超時時間:默認是2秒 connectionTimeout: 5000 #請求處理超時時間 默認是5秒 readTimeout: 3000
當超過限制之后,會報錯異常
自定義攔截器
openfign有一個攔截器可以幫助我們攔截服務中的一些請求的某些操作 實現(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 #設置為默認的契約模式 #連接超時時間:默認是2秒 connectionTimeout: 5000 #請求處理超時時間 默認是5秒 readTimeout: 10000 requestInterceptors[0]: #feign攔截器 com.fujii.order.interceptor.CustomFeignIntercptor
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot集成knife4j實現(xiàn)風格化API文檔
這篇文章主要介紹了Springboot如何集成knife4j實現(xiàn)風格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下2020-12-12@JsonFormat?和?@DateTimeFormat?時間格式化注解(場景示例代碼)
這篇文章主要介紹了@JsonFormat和@DateTimeFormat時間格式化注解,本文通過場景示例代碼詳解給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價值,有興趣的可以了解一下。2017-01-01