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

加上后就可以開(kāi)始調(diào)用其他服務(wù)的方法了,具體實(shí)現(xiàn)如下
@FeignClient注解中就是去指定我們所要調(diào)用的服務(wù)信息,里面兩個(gè)參數(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接口所對(duì)應(yīng)的服務(wù)名
* path:指定調(diào)用rest接口所在的controller中的@RequestMapping
*/
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {
@GetMapping(value = "/reduct")
public String reduct();
}
這里我也把示例給大家粘貼出來(lái)吧
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;
}
}
然后我們啟動(dòng)服務(wù)查看是否能正常訪問(wèn),如下圖訪問(wèn)正常,說(shuō)明配置無(wú)誤

下面我在與大家說(shuō)一下OpenFeign的其他的一些特性
日志配置
通過(guò)源碼可以看到日志等級(jí)分為4種
- NONE【性能最佳,適用于生產(chǎn)環(huán)境】不記錄任何日志信息(默認(rèn)級(jí)別)
- BASIC【適用于生產(chǎn)環(huán)境追蹤問(wèn)題】?jī)H記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)和執(zhí)行時(shí)間
- HEADRS:記錄BASIC的基礎(chǔ)之上 在記錄請(qǐng)求和響應(yīng)的HEAD
- FULL:【適用于開(kāi)發(fā)環(huán)境和測(cè)試環(huán)境問(wèn)題定位】記錄請(qǐng)求和響應(yīng)的HEAD、body和元數(shù)據(jù)
配置方式有兩種:
第一種:全局配置 使用@Configuration進(jìn)行全局配置
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è)置一個(gè)日志級(jí)別為DEBUG級(jí)別,因?yàn)閟pringboot默認(rèn)的日志級(jí)別是info,而feign的debug日志就不會(huì)輸出出來(lái)
logging:
level:
com.fujii.order.feign: debug
設(shè)置好后去調(diào)用API后可以看到我調(diào)用了兩個(gè)服務(wù)為stock-service的和product-service的

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

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

契約配置
契約配置主要是解決我們之前可能有些項(xiàng)目中使用到了feign 用的是feign的一些注解 但是我想在這基礎(chǔ)之上升級(jí)為OpenFeign 又不去改變?cè)瓉?lái)的代碼 那么就可以使用契約配置來(lái)解決,實(shí)現(xiàn)方式也很簡(jiǎ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();
}
超時(shí)時(shí)間配置
超時(shí)時(shí)間主要是給我們的服務(wù)設(shè)置一個(gè)時(shí)間限制 超過(guò)這個(gè)限制則返回請(qǐng)求重試或者連接超時(shí),設(shè)置起來(lái)也簡(jiǎn)單,下面我來(lái)演示一下全局配置和局部配置
全局配置:
@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)的契約模式
#連接超時(shí)時(shí)間:默認(rèn)是2秒
connectionTimeout: 5000
#請(qǐng)求處理超時(shí)時(shí)間 默認(rèn)是5秒
readTimeout: 3000
當(dāng)超過(guò)限制之后,會(huì)報(bào)錯(cuò)異常

自定義攔截器
openfign有一個(gè)攔截器可以幫助我們攔截服務(wù)中的一些請(qǐng)求的某些操作 實(shí)現(xiàn)的示例我放入以下參考,大家可以根據(jù)實(shí)際需求來(lái)擴(kuò)展攔截的信息
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攔截器");
}
}
在寫(xiě)完攔截器之后我們還需要配置一下
feign:
client:
config:
product-service:
loggerLevel: BASIC
contract: feign.Contract.Default #設(shè)置為默認(rèn)的契約模式
#連接超時(shí)時(shí)間:默認(rèn)是2秒
connectionTimeout: 5000
#請(qǐng)求處理超時(shí)時(shí)間 默認(rèn)是5秒
readTimeout: 10000
requestInterceptors[0]: #feign攔截器
com.fujii.order.interceptor.CustomFeignIntercptor
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
jvm字符串常量池在什么內(nèi)存區(qū)域問(wèn)題解析
這篇文章主要介紹了jvm字符串常量池在什么內(nèi)存區(qū)域的問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Springboot集成knife4j實(shí)現(xiàn)風(fēng)格化API文檔
這篇文章主要介紹了Springboot如何集成knife4j實(shí)現(xiàn)風(fēng)格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下2020-12-12
Java實(shí)現(xiàn)Excel表單控件的添加與刪除
本文通過(guò)Java代碼示例介紹如何在Excel表格中添加表單控件,包括文本框、單選按鈕、復(fù)選框、組合框、微調(diào)按鈕等,以及如何刪除Excel中的指定表單控件,需要的可以參考一下2022-05-05
@JsonFormat?和?@DateTimeFormat?時(shí)間格式化注解(場(chǎng)景示例代碼)
這篇文章主要介紹了@JsonFormat和@DateTimeFormat時(shí)間格式化注解,本文通過(guò)場(chǎng)景示例代碼詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Intellij搭建springmvc常見(jiàn)問(wèn)題解決方案
這篇文章主要介紹了Intellij搭建springmvc常見(jiàn)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

