最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

事發(fā)地

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

feign:
 okhttp:
 enable: true

事件還原

創(chuàng)建項(xià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>``

啟動(dòng)類

@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入口:

進(jìn)入代理類查看HTTPCLIENT使用的是哪一個(gè)

到下圖時(shí)就要注意了,這才是進(jìn)入使用client的入口

結(jié)果看下圖:

參考

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

個(gè)人猜測

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

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

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

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

當(dāng)我在主類添加以下代碼時(shí),得到的bean如下:

注意:feignClient 這個(gè)bean 是一個(gè)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();
 }

當(dāng)我在主類再追加以下代碼時(shí),得到的bean如下:

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

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

真正的真相

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

LoadBalancerFeignClient 的來源

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

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

方法所在位置如下:

org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization

注意事項(xiàng)

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

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

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

相關(guān)文章

  • 在Java中使用MongoDB的方法詳解

    在Java中使用MongoDB的方法詳解

    這篇文章主要給大家介紹了關(guān)于在Java中使用MongoDB的相關(guān)資料,要操作MongoDB數(shù)據(jù)庫你需要使用MongoDB的Java驅(qū)動(dòng)程序,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java如何檢測當(dāng)前CPU負(fù)載狀態(tài)

    Java如何檢測當(dāng)前CPU負(fù)載狀態(tài)

    在Java中,直接檢測CPU負(fù)載狀態(tài)并不像在操作系統(tǒng)命令行中那樣簡單,因?yàn)镴ava標(biāo)準(zhǔn)庫并沒有直接提供這樣的功能,這篇文章主要介紹了java檢測當(dāng)前CPU負(fù)載狀態(tài)的方法,需要的朋友可以參考下
    2024-06-06
  • Java中實(shí)現(xiàn)Comparator接口和用法實(shí)例(簡明易懂)

    Java中實(shí)現(xiàn)Comparator接口和用法實(shí)例(簡明易懂)

    這篇文章主要介紹了Java中實(shí)現(xiàn)Comparator接口和用法實(shí)例(簡明易懂),本文給出實(shí)現(xiàn)Comparator接口的實(shí)例和使用這個(gè)接口的代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • JAVA面向?qū)ο?封裝原理及實(shí)例解析

    JAVA面向?qū)ο?封裝原理及實(shí)例解析

    這篇文章主要介紹了JAVA面向?qū)ο?封裝原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java多線程中斷機(jī)制三種方法及示例

    Java多線程中斷機(jī)制三種方法及示例

    這篇文章主要介紹了Java多線程中斷機(jī)制三種方法及示例,向大家分享了這三種方法的介紹幾代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作

    java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作

    UDP是與TCP相對應(yīng)的協(xié)議,UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應(yīng)用環(huán)境。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因?yàn)槿绱?,它的可靠性不如TCP協(xié)議高,本文給大家介紹java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作,感興趣的朋友一起看看吧
    2021-10-10
  • Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java的泛型擦除和運(yùn)行時(shí)泛型信息獲取方式

    Java泛型在編譯時(shí)會發(fā)生類型擦除,即泛型參數(shù)被替換為它們的限定類型(如Object),這使得ArrayList<Integer>和ArrayList<String>在運(yùn)行時(shí)類型相同,盡管如此,我們可以通過定義類或匿名內(nèi)部類的方式在運(yùn)行時(shí)獲取泛型信息
    2024-09-09
  • java操作oracle數(shù)據(jù)庫示例

    java操作oracle數(shù)據(jù)庫示例

    這篇文章主要介紹了java操作oracle數(shù)據(jù)庫示例,需要的朋友可以參考下
    2014-04-04
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(64)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(64)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-09-09
  • Java集合類的組織結(jié)構(gòu)和繼承、實(shí)現(xiàn)關(guān)系詳解

    Java集合類的組織結(jié)構(gòu)和繼承、實(shí)現(xiàn)關(guān)系詳解

    這篇文章主要介紹了Java集合類的組織結(jié)構(gòu)和繼承、實(shí)現(xiàn)關(guān)系,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

红河县| 衡阳市| 临朐县| 阿拉善左旗| 屏南县| 疏勒县| 海原县| 海宁市| 乌拉特中旗| 霍邱县| 酉阳| 建阳市| 盘锦市| 岱山县| 罗江县| 泰兴市| 鄂尔多斯市| 盐山县| 恭城| 香格里拉县| 宣汉县| 景东| 徐闻县| 紫云| 灌南县| 石城县| 峡江县| 泽普县| 中卫市| 扎赉特旗| 普格县| 翁牛特旗| 鄂尔多斯市| 东港市| 班戈县| 雅安市| 梅州市| 咸丰县| 定西市| 许昌市| 伊宁市|