Fegin根據配置項請求不同的位址實現方法

2021-08-27 20:44:49 字數 1809 閱讀 3667

在專案過程中,可能會遇到比較奇葩的需求,比如:使用@feginclient註解的介面只能配置乙個url,但我又想根據不同的配置項決定我使用哪個url,當然,前提是這兩個url屬於同乙個專案的不同的部署環境。

眾所周知,feign只是個宣告式呼叫,沒有決策機制,所以想通過feign自己來實現是不可能了。

我的實現方式:

1.這兩個feignclient繼承同乙個介面,因為所有的方法都相同,把方法都寫到這個父類介面中,兩個子類介面body體為空即可。

2.配置檔案中增加乙個配置項,如果這個配置項等於某個值,就呼叫乙個feignclient,否則,呼叫另乙個。

下面上**:

公共介面(不需要加@service和@feginclient註解):

public inte***ce assetservice
兩個子類介面(需要加@feginclient和@service註解):

介面1:

@service

@feignclient(name = "ms-asset", url="$")

public inte***ce assetqueryserviceofdevice extends assetservice{}

介面2:

@service

@feignclient(name = "ms-asset", url="$")

public inte***ce assetqueryserviceofproject extends assetservice{}

使用這兩個feginclient:

在controller中使用這兩個feginclient的方法:

(1)給controller的增加構造方法

(2)在controller的構造方法中將@value獲取的變數和這兩個feginclient注入進去,這裡要注意:不能直接使用@value獲取配置檔案中的配置項,然後直接在aggquerycontroller 的構造方法中使用,因為:構造器的執行要早於@value和@autowired,構造方法執行時所有的@value或@autowired註解的物件此時都還為空,導致他們一直為空!

所以要把@value獲取的配置項通過乙個配置類獲取,然後將這個配置類通過構造方法注入到aggquerycontroller !

@requestcontroller

public class aggquerycontroller }

(3)配置類(用@configuration註解的好處是能保證例項化優先順序比較高):

@configuration

public class aggqueryconfig ")

private string assetrequest;

@autowired

private assetqueryservice assetqueryservice;

@autowired

private assetqueryserviceofproject assetqueryserviceofproject;

@autowired

private timeseriesservice timeseriesservice;

public assetservice getassetservice()

return assetqueryserviceofproject;

}}

這樣,在aggquerycontroller中的其他方法中就可以使用assetservice了。

nginx根據請求頭分流到不同後端服務

nginx map配置根據請求頭不同分配流量到不同後端服務,nginx版本為 nginx version nginx 1.17.9 配置nginx.conf檔案 當在電腦上hosts檔案裡配置了aa.hc.harmonycloud.cn網域名稱解析後,訪問時 即server的server name和...

axios請求方式和配置項

npm i axios import axios from axios get請求axios config axios url,config axios.get url,config post請求axios config axios url,config axios.post url,data,co...

winform C 根據配置檔案啟動不同的窗體

visual studio中,新建winform c 專案後,會預設生成乙個主窗體檔案,一般叫 form1,也可以自己改名,反正啟動程式就會首先啟動這個窗體。這是一種固定的模式,那麼如果專案中有多個不同的窗體,不同情況下分別啟動不同的窗體,如何實現呢?第一反應是把主窗體隱藏 hide 然後在主窗體中...