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

完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題

 更新時間:2021年02月25日 11:06:24   作者:esunlang  
這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

事發(fā)地

原默認的Feign是使用URLConnector進行通信的,當換為okhttp時,直接引入包及配置以下內(nèi)容根本不生效,還是走原生的。

feign:
 okhttp:
 enable: true

事件還原

創(chuàng)建項目并引入pom相關(guān)的依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <properties>
 <java.version>1.8</java.version>
 </properties>
 <dependencyManagement>
 <dependencies>
  <dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dependencies</artifactId>
  <version>Finchley.RELEASE</version>
  <type>pom</type>
  <scope>import</scope>
  </dependency>
 </dependencies>
 </dependencyManagement>
<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
</dependencies>

</project>``

啟動類

@SpringBootApplication
@EnableFeignClients
public class Ch21OpenFeignApplication {

 public static void main(String[] args) {
 SpringApplication.run(Ch21OpenFeignApplication.class, args);
 }
}

配置文件

bootstrap.yml,這里只配置是否使用相關(guān)的HTTP

logging:
 level:
 springcloud.service.HelloFeignService: debug
feign:
 okhttp:
 enable: true
 httpclient:
 enable: false

測試類

Controller

.`@RestController
public class HelloFeignController {
 @Autowired
 private HelloFeignService helloFeignService;
 @RequestMapping(value = "/helloFeign",method = RequestMethod.GET)
 public Object helloFeign(){

 return helloFeignService.helloFeign();
 }
}`

service

@FeignClient(name = "feign-client",url = "http://localhost:8761",fallback = FallbackService.class)
public interface HelloFeignService {
 @RequestMapping(value = "/query/eureka-server",method = RequestMethod.GET)
 String helloFeign();
}

案件還原

寫好上述的配置與類后,開始DEBUG,下圖是Controller的DEBUG入口:

進入代理類查看HTTPCLIENT使用的是哪一個

到下圖時就要注意了,這才是進入使用client的入口

結(jié)果看下圖:

參考

經(jīng)過查找資料,有文章提到是自動配置類的問題FeignAutoConfiguration,文章參考:www.dbjr.com.cn/article/206294.htm文章提到,由于@ConditionalOnMissingBean({okhttp3.OkHttpClient.class})導致了無法注入OkHttpClient

個人猜測

在只添加依賴包時,還沒有自行創(chuàng)建okhttp相關(guān)的BEAN時,結(jié)果如下與添加了創(chuàng)建okhttp時一樣。

啟動springboot項目時,BEAN容器化時機不同導致得不到想要的client,在啟動項目時,org.springframework.cloud.openfeign.FeignAutoConfiguration這個配置類是執(zhí)行后。在BEAN裝載時看到BEAN一級緩存如下圖,并沒有OKHTTP相關(guān)的信息。

在這個自動裝配類最下方有一段代碼根本沒有執(zhí)行,所以從始到終都沒有看到有okHttpClient

@Bean
 @ConditionalOnMissingBean(Client.class)
 public Client feignClient() {
 return new OkHttpClient(this.okHttpClient);
 }

當我在主類添加以下代碼時,得到的bean如下:

注意:feignClient 這個bean 是一個loadBalancerFeignClient

@Bean
 public okhttp3.OkHttpClient okHttpClient(){
 return new okhttp3.OkHttpClient.Builder()
  .readTimeout(60, TimeUnit.SECONDS)
  .connectTimeout(60, TimeUnit.SECONDS)
  .writeTimeout(120, TimeUnit.SECONDS)
  .connectionPool(new ConnectionPool())
  // .addInterceptor();
  .build();
 }

當我在主類再追加以下代碼時,得到的bean如下:

注意:feignClient 這個bean,是我們要找的okhttp了

 @Bean
 @ConditionalOnMissingBean({Client.class})
 public Client feignClient(okhttp3.OkHttpClient client) {
 return new feign.okhttp.OkHttpClient(client);
 }

真正的真相

這個要再多看下創(chuàng)建流程,從代碼上分析,這時在有new feign.okhttp.OkHttpClient(client); 這一段代碼,重新把okhttp注入后,才使得feignClient 名稱對應(yīng)的bean為okhttp。不防從以下代碼進行分析:

LoadBalancerFeignClient 的來源

如下圖,LoadBalancerFeignClient是繼承了Client,進入實現(xiàn)類feign.Client.Default,這個類全程都只有使用HttpURLConnection,所以無論怎樣都只能獲取到的是默認的JDK里的http的client

所以這個類創(chuàng)建后要想使用okhttp,那么就只能重新創(chuàng)建把舊的bean沖掉,還好,在主類添加的@Bean創(chuàng)建的類正是在完成bean后再執(zhí)行這里主類增加的@Bean創(chuàng)建的對象,所以最后加載過程中又會執(zhí)行bean生命周期的finishBeanFactoryInitialization(beanFactory);

方法所在位置如下:

org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization

注意事項

在主類添加的方法用來創(chuàng)建okhttp時,方法名一定要寫成下圖的這樣,不然創(chuàng)建不了feignClient這個bean。

不知道是否有其他方法。這個估計是與org.springframework.cloud.openfeign.FeignAutoConfiguration.OkHttpFeignConfiguration#feignClient有關(guān),相當于創(chuàng)建的方法是一個重寫的過程。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 淺談Java響應(yīng)式系統(tǒng)

    淺談Java響應(yīng)式系統(tǒng)

    第一次聽到reactive這個詞還是在幾年前,偶然了解到了Rxjava這個項目,仿佛為我打開了一扇新的大門,Rxjava是ReactiveX的java實現(xiàn),ReactiveX家族除了Rxjava還有RxJS, Rx.NET,RxScala等等。
    2021-06-06
  • eclipse/intellij idea 查看java源碼和注釋方法

    eclipse/intellij idea 查看java源碼和注釋方法

    下面小編就為大家?guī)硪黄猠clipse/intellij idea 查看java源碼和注釋方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • java編程數(shù)據(jù)類型全面詳解教程新手必入

    java編程數(shù)據(jù)類型全面詳解教程新手必入

    這篇文章主要為大家介紹了java編程數(shù)據(jù)類型全面詳解教程,強烈推薦新手入,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • Java 代碼檢查工具之PMD入門使用詳細教程

    Java 代碼檢查工具之PMD入門使用詳細教程

    這篇文章主要介紹了Java 代碼檢查工具之PMD入門使用詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JSON在Java中的使用方法實例

    JSON在Java中的使用方法實例

    對于java來說,json的對象也是分為JSONObject和JSONArray這兩種,每種對象的操作方式不一樣哦,下面這篇文章主要給大家介紹了關(guān)于JSON在Java中使用的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Java如何設(shè)置PDF文檔背景色詳解

    Java如何設(shè)置PDF文檔背景色詳解

    這篇文章主要介紹了Java如何設(shè)置PDF文檔背景色詳解,一般生成的PDF文檔默認的文檔底色為白色,我們可以通過一定方法來更改文檔的背景色,以達到文檔美化以及保護雙眼的作用。 以下內(nèi)容提供了Java編程來設(shè)置PDF背景色的方法,需要的朋友可以參考下
    2019-07-07
  • java中jdk的下載和安裝全過程

    java中jdk的下載和安裝全過程

    這篇文章主要給大家介紹了關(guān)于java中jdk的下載和安裝的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 深入理解spring事務(wù)

    深入理解spring事務(wù)

    這篇文章主要介紹了spring事務(wù)深入理解,介紹了事物特性,事物隔離級別,事物的具體使用實例,有感興趣的同學可以研究下
    2021-03-03
  • SpringBoot實現(xiàn)郵件任務(wù)的步驟詳解

    SpringBoot實現(xiàn)郵件任務(wù)的步驟詳解

    這篇文章主要介紹了SpringBoot實現(xiàn)郵件任務(wù)的步驟詳解,使用Spring Boot實現(xiàn)QQ郵箱發(fā)送郵件具有快速集成、統(tǒng)一的開發(fā)體驗、強大的維護和擴展能力、可靠的送達性和安全性等優(yōu)勢,可以幫助你快速構(gòu)建穩(wěn)定可靠的郵件發(fā)送功能,需要的朋友可以參考下
    2023-10-10
  • Java中檢查值是否存在于數(shù)組中的4種詳細方法

    Java中檢查值是否存在于數(shù)組中的4種詳細方法

    這篇文章主要給大家介紹了關(guān)于Java中檢查值是否存在于數(shù)組中的4種詳細方法,相信大家在操作Java的時候經(jīng)常會要檢查一個數(shù)組(無序)是否包含一個特定的值,需要的朋友可以參考下
    2023-08-08

最新評論