欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloudAlibaba微服務調用組件OpenFeign的方法

 更新時間:2024年07月05日 10:47:57   作者:麥芽糖0219  
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,其靈感來自Retrofit、JAXRS-2.0以及WebSocket,Feign可幫助我們更加便捷、優(yōu)雅地調用HTTP API,這篇文章主要介紹了SpringCloudAlibaba微服務調用組件OpenFeign,需要的朋友可以參考下

JAVA 項目中如何實現(xiàn)接口調用?
1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 Http 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新版本和建議。HttpClient 相比傳統(tǒng) JDK 自帶的 URLConnection,提升了易用性和靈活性,使客戶端發(fā)送 HTTP 請求變得容易,提高了開發(fā)的效率。
2)Okhttp
一個處理網絡請求的開源項目,是安卓端最火的輕量級框架,由 Square 公司貢獻,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 擁有簡潔的 API、高效的性能,并支持多種協(xié)議(HTTP/2 和 SPDY)。
3)HttpURLConnection
HttpURLConnection 是 Java 的標準類,它繼承自 URLConnection,可用于向指定網站發(fā)送 GET 請求、POST 請求。HttpURLConnection 使用比較復雜,不像 HttpClient 那樣容易使用。
4)RestTemplate WebClient
RestTemplate 是 Spring 提供的用于訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪問遠程 HTTP 服務的方法,能夠大大提高客戶端的編寫效率。

上面介紹的是最常見的幾種調用接口的方法,我們下面要介紹的方法比上面的更簡單、方便,它就是 Feign。

一 Feign介紹

Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,其靈感來自Retrofit、JAXRS-2.0以及WebSocket。Feign可幫助我們更加便捷、優(yōu)雅地調用HTTP API。

Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。

Spring Cloud Openfeign對Feign進行了增強,使其支持Spring MVC注解,另外還整合了Ribbon和Nacos,從而使得Feign的使用更加方便。

優(yōu)勢
Feign可以做到使用 HTTP 請求遠程服務時就像調用本地方法一樣的體驗,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個 HTTP 請求。它像 Dubbo 一樣,consumer 直接調用接口方法調用 provider,而不需要通過常規(guī)的 Http Client 構造請求再解析返回數據。它解決了讓開發(fā)者調用遠程接口就跟調用本地方法一樣,無需關注與遠程的交互細節(jié),更無需關注分布式環(huán)境開發(fā)。

二 Spring Cloud Alibaba快速整合OpenFeign

引入依賴

<!‐‐ openfeign 遠程調用 ‐‐>
<dependency>
	 <groupId>org.springframework.cloud</groupId>
	 <artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>

編寫調用接口+@FeignClient注解

@FeignClient(value = "mall‐order",path = "/order")
 public interface OrderFeignService {
	@RequestMapping("/findOrderByUserId/{userId}")
 	public R findOrderByUserId(@PathVariable("userId") Integer userId);
 }
/*
* 添加feign接口和方法
* name 指定調用rest接口所對應的服務名
* path 指定調用rest接口所在的StockController指定的@RequestMapping
* */
@FeignClient(name="stock-service",path ="/stock",configuration = FeignConfig.class)
public interface StockFeignService {
    // 聲明需要調用的rest接口對應的方法,沒有實現(xiàn)類:動態(tài)代理
    @RequestMapping("/reduct")
    String reduct();
}

調用端在啟動類上添加@EnableFeignClients注解

@EnableFeignClients

發(fā)起調用,像調用本地方式一樣調用遠程服務

@RestController
 @RequestMapping("/user")
 public class UserController {
	 @Autowired
	 OrderFeignService orderFeignService;
	 @RequestMapping(value = "/findOrderByUserId/{id}")
	 public R findOrderByUserId(@PathVariable("id") Integer id) {
		 //feign調用
		 R result = orderFeignService.findOrderByUserId(id);
		 return result;
	 }
 }

三 Spring Cloud Feign的自定義配置及使用

Feign 提供了很多的擴展機制,讓用戶可以更加靈活的使用

3.1 日志配置

有時候我們遇到 Bug,比如接口調用失敗、參數沒收到等問題,或者想看看調用性能,就需要配置 Feign 的日志了,以此讓 Feign 把請求信息輸出來

第一種:全局配置,定義一個配置類,指定日志級別,全局生效

import feign.Contract;
import feign.Logger;
import feign.Request;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//服務調用方進行配置
// 注意: 此處配置@Configuration注解就會全局生效,如果想指定對應微服務生效,就不能配置(也就是相當于局部配置了)
@Configuration
 public class FeignConfig {
	 /**
	 * 日志級別
	 *
	 * @return
	 */
	  @Bean
	 public Logger.Level feignLoggerLevel() {
	 	return Logger.Level.FULL;
	 }
 }

注意使用的包:

通過源碼可以看到日志等級有 4 種,分別是:

  • NONE【性能最佳,適用于生產】:不記錄任何日志(默認值)。
  • BASIC【適用于生產環(huán)境追蹤問題】:僅記錄請求方法、URL、響應狀態(tài)代碼以及執(zhí)行時間。
  • HEADERS:記錄BASIC級別的基礎上,記錄請求和響應的header。
  • FULL【比較適用于開發(fā)及測試環(huán)境定位問題】:記錄請求和響應的header、body和元數據。

第二種:局部配置,讓調用的微服務生效,在@FeignClient 注解中指定使用的配置類
局部配置有兩種:配置類和配置文件

使用局部配置-配置類的話,還是要先新建上邊的配置類,只不過上邊的配置類不能加@Configuration注解了。

注意下邊,一定要使用@PathVariable("userId")指定參數,否則報錯

在yml配置文件中執(zhí)行 Client 的日志級別才能正常輸出日志,格式是"logging.level.feign接口包路徑=debug"

logging:
  level:
  com.maltose.mall.feigndemo.feign: debug

測試:BASIC級別日志

補充:局部配置可以在yml中配置
對應屬性配置類:
org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration

# feign日志局部配置
feign:
  client:
    config:
      product-service: #服務名
        loggerLevel: BASIC
        contract: feign.Contract.Default #設置為默認的契約  (還原成原生注解)
        # 連接超時時間,默認2s
        connectTimeout: 5000
        # 請求處理超時時間,默認5s
        readTimeout: 10000
        requestInterceptors[0]:
          com.tulingxueyuan.order.intercptor.feign.CustomFeignInterceptor

3.2 契約配置

Spring Cloud 在 Feign 的基礎上做了擴展,使用 Spring MVC 的注解來完成Feign的功能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式來定義客戶端也是可以的,通過配置契約來改變這個配置,Spring Cloud 中默認的是SpringMvcContract

Spring Cloud 早期版本就是用的原生Fegin. 隨著netflix的停更,替換成了Open feign。即舊Spring Cloud項目升級的話,就得了解契約配置了。

修改契約配置,支持Feign原生的注解

在上邊的FeignConfig.java類里添加:

/**
 * 修改契約配置,支持Feign原生的注解
 * @return
 */
 @Bean
 public Contract feignContract() {
	 return new Contract.Default();
 }

注意:修改契約配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原生的注解

OrderFeignService 中配置使用Feign原生的注解

@FeignClient(value = "mall‐order",path = "/order")
 public interface OrderFeignService {
     //必須指定請求方式
	 @RequestLine("GET /findOrderByUserId/{userId}")//對應之前springmvc里的RequestMapping注解
	 public R findOrderByUserId(@Param("userId") Integer userId);//Param對應PathVariable注解       
 }

補充,也可以通過yml配置契約

feign:
  client:
    config:
      mall‐order: #對應微服務
        loggerLevel: FULL
        contract: feign.Contract.Default #指定Feign原生注解契約配置

3.3 自定義攔截器實現(xiàn)認證邏輯

public class FeignAuthRequestInterceptor implements RequestInterceptor {
	 @Override
	 public void apply(RequestTemplate template) {
	    // 業(yè)務邏輯  如:記錄日志
	    String access_token = UUID.randomUUID().toString();
	    template.header("Authorization",access_token);
	}
}
@Configuration // 全局配置
 public class FeignConfig {
	 @Bean
	 public Logger.Level feignLoggerLevel() {
		 return Logger.Level.FULL;
 	}
	 /**
	 * 自定義攔截器
	 * @return
	 */
	  @Bean
	 public FeignAuthRequestInterceptor feignAuthRequestInterceptor(){
	 	return new FeignAuthRequestInterceptor();
	}
}

測試

補充:可以在yml中配置

feign:
  client:
    config:
      mall‐order: #對應微服務
        requestInterceptors[0]: #配置攔截器
          com.tuling.mall.feigndemo.interceptor.FeignAuthRequestInterceptor

mall-order端可以通過@RequestHeader獲取請求參數
建議在filter,interceptor中處理

3.4 超時時間配置

通過 Options 可以配置連接超時時間和讀取超時時間,Options 的第一個參數是連接的超時時間(ms),默認值是 2s;第二個是請求處理的超時時間(ms),默認值是 5s。

全局配置

@Configuration
 public class FeignConfig {
	  @Bean
	 public Request.Options options() {
		 return new Request.Options(5000, 10000);
	 }
 }

yml中配置

 feign:
  client:
    config:
      mall‐order: #對應微服務
	    # 連接超時時間,默認2s
	    connectTimeout: 5000
	    # 請求處理超時時間,默認5s
	    readTimeout: 10000

補充說明: Feign的底層用的是Ribbon,但超時時間以Feign配置為準

3.5 客戶端組件配置

Feign 中默認使用 JDK 原生的 URLConnection 發(fā)送 HTTP 請求,我們可以集成別的組件來替換掉 URLConnection,比如 Apache HttpClient,OkHttp

Feign發(fā)起調用真正執(zhí)行邏輯:feign.Client#execute (擴展點)

3.5.1 配置Apache HttpClient

引入依賴

<!‐‐ Apache HttpClient ‐‐>
<dependency>
	 <groupId>org.apache.httpcomponents</groupId>
	 <artifactId>httpclient</artifactId>
	 <version>4.5.7</version>
</dependency>
<dependency>
	 <groupId>io.github.openfeign</groupId>
	 <artifactId>feign‐httpclient</artifactId>
	 <version>10.1.0</version>
</dependency>

然后修改yml配置,將 Feign 的 Apache HttpClient啟用 :

feign:
  #feign 使用 Apache HttpClient 可以忽略,默認開啟
  httpclient:
  enabled: true

關于配置可參考源碼: org.springframework.cloud.openfeign.FeignAutoConfiguration

測試:調用會進入feign.httpclient.ApacheHttpClient#execute

3.5.2 配置 OkHttp

引入依賴

<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign‐okhttp</artifactId>
</dependency>

然后修改yml配置,將 Feign 的 HttpClient 禁用,啟用 OkHttp,配置如下

feign:
  #feign 使用 okhttp
  httpclient:
  enabled: false
  okhttp:
  enabled: true

關于配置可參考源碼: org.springframework.cloud.openfeign.FeignAutoConfiguration

測試:調用會進入feign.okhttp.OkHttpClient#execute

3.6 GZIP 壓縮配置

開啟壓縮可以有效節(jié)約網絡資源,提升接口性能,我們可以配置 GZIP 來壓縮數據

feign:
  # 配置 GZIP 來壓縮數據
  compression:
  request:
  enabled: true
  # 配置壓縮的類型
  mime‐types: text/xml,application/xml,application/json
  # 最小壓縮值
  min‐request‐size: 2048
  response:
  enabled: true

注意:只有當 Feign 的 Http Client 不是 okhttp3 的時候,壓縮才會生效,配置源碼在FeignAcceptGzipEncodingAutoConfiguration

核心代碼就是 @ConditionalOnMissingBean(type="okhttp3.OkHttpClient"),表示 Spring BeanFactory 中不包含指定的 bean 時條件匹配,也就是沒有啟用 okhttp3 時才會進行壓縮配置。

到此這篇關于SpringCloudAlibaba微服務調用組件OpenFeign的文章就介紹到這了,更多相關SpringCloudAlibaba OpenFeign內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Maven基礎之如何修改本地倉庫的默認路徑

    Maven基礎之如何修改本地倉庫的默認路徑

    這篇文章主要介紹了Maven基礎之如何修改本地倉庫的默認路徑問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java?方法的定義與調用詳解

    Java?方法的定義與調用詳解

    在java中,方法就是用來完成解決某件事情或實現(xiàn)某個功能的辦法。方法實現(xiàn)的過程中,會包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計算數值,這篇文章我們來探究一下方法的定義與調用
    2022-04-04
  • Java 獲取當前類名和方法名的實現(xiàn)方法

    Java 獲取當前類名和方法名的實現(xiàn)方法

    這篇文章主要介紹了 Java 獲取當前類名和方法名的實現(xiàn)方法的相關資料,這里不僅提供了實現(xiàn)方法并比較幾種方法的效率,需要的朋友可以參考下
    2017-07-07
  • java fastJson轉JSON兩種常見的轉義操作

    java fastJson轉JSON兩種常見的轉義操作

    在實際開發(fā)中,我們有時需要將特殊字符進行轉義,本文主要介紹了java fastJson轉JSON兩種常見的轉義操作,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • java實現(xiàn)一致性hash算法實例代碼

    java實現(xiàn)一致性hash算法實例代碼

    這篇文章主要給大家介紹了關于java實現(xiàn)一致性hash算法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 使用Java 壓縮文件打包tar.gz 包的詳細教程

    使用Java 壓縮文件打包tar.gz 包的詳細教程

    本文帶領大家學習如何使用Java 壓縮文件打包tar.gz 包,主要通過 Apache compress 工具打包,通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • mybatis-plus使用問題小結

    mybatis-plus使用問題小結

    這篇文章主要介紹了mybatis-plus使用問題匯總,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    Spring Data JPA自動生成表時列順序混亂的最新解決辦法

    文章主要介紹了Spring Boot 3.3.5版本中SpringDataJPA自動生成表時列順序混亂的問題,以及如何通過替換Hibernate實現(xiàn)來解決這個問題,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java設計模式--策略模式詳解

    java設計模式--策略模式詳解

    這篇文章主要介紹了Java經典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了java策略模式的具有用法與相關注意事項,需要的朋友可以參考下
    2021-07-07
  • MybatisPlus多表連接查詢的問題及解決方案

    MybatisPlus多表連接查詢的問題及解決方案

    MybatisPlus官方并沒有提供多表連接查詢的通用解決方案,然而連接查詢是相當普遍的需求,今天通過本文給大家介紹下MybatisPlus多表連接查詢的問題及解決方案,感興趣的朋友一起看看吧
    2022-01-01

最新評論