spring-cloud-netflix-feign,這個是feign的全名。spring官網上是沒有feign這個專案存在的,feign是作為netflix的乙個子專案存在。
netflix包涵eureka、zuul、ribbon、feign、hystrix、hystrix dashboard、turbine。
曾經一度把netflix與spring cloud等同,用的全部都是netflix中的東西。後來接觸config與bus後才將netflix與cloud分開。然後,我就認識了乙個叫netflix的影片租賃公司。
我們目前所使用的feign來自於3個部分,或者說2個部分。
第乙個部分是來自社群的open-feign。具體**是 netflix還是社群未驗證。
第二個部分是 netflix的封裝。
第三個部分是來自於spring的封裝。
實際上大夥也就知道feign呢和那個影片租賃公司 netflix脫不開關係就是了。以上三個**最終變成了
1. org.springframework.cloud:spring-cloud-netflix-core
2. io.github.openfeign:feign-core
netflix自從加入了spring後**被改的天翻地覆,所以想看第二部分來自於netflix的**的話估計要看spring-cloud-netflix-core較老的版本才行了。
首先將所有標籤全部忽略掉,因為乙個都沒有用到。
然後還剩下幾個關鍵的是
1. client(介面) - feign(抽象類) - reflectivefeign(實現類)。
2. requesttemplate
3. invocationhandle***ctory(介面) - synchronousmethodhandler(實現類)
4. decoder與encoder
呼叫棧大約如下
1. reflectivefeign 被反射例項化
2. 呼叫reflectivefeign.invoke
3. 呼叫synchronousmethodhandler.invoke。此處例項化requesttemplate
4. 呼叫synchronousmethodhandler.executeanddecode
5. 將requesttemplate build為request,呼叫http客戶端執行
6. 將response decode為object並返回
open-feign並不是主題,就不貼**圖了,反正github上面有。後續會去研究研究原生的open-feign如何去玩的。
這個玩意比較坑爹,因為看了feign就意味你必須去看其他的**。你看到fegin包下存在諸如fegin.ribbon、hystrixtargeter等等字樣就知道已經分不開了。
標籤用法
springmvc
feign
requestparam
不寫name
預設使用欄位名稱
報錯待完成
–說是亂入,真的是亂入,這個**曾經誤導我好久。上面寫過了feign-core的關鍵**中有乙個介面client。我曾經一度認為它是使用的預設的default實現。
package feign;
public
inte***ce
client
....
但是,實際上是使用的ribbon的乙個實現
package org.springframework.cloud.netflix.feign.ribbon;
public
class
loadbalancerfeignclient
implements
client
public response execute(request request, options options) throws ioexception {
try {
uri asuri = uri.create(request.url());
string clientname = asuri.gethost();
uri uriwithouthost = cleanurl(request.url(), clientname);
ribbonrequest ribbonrequest = new ribbonrequest(this.delegate, request, uriwithouthost);
iclientconfig requestconfig = this.getclientconfig(options, clientname);
....
看完這裡我就突然明白為啥在feignclient中的name一定要寫servername了。都是因為這個實現。所以,想使用直連的方式只需要把這個實現類頂替掉就好了……..
在更換okhttp的時候試驗完成,不配置ribbon就可以使用ip+port直連。
feign原始碼解讀
對於feign的介面請求失敗的重試配置可通過如下自定義配置檔案實現 一般不建議配置 configuration public class feignconfig 當然,也可使用預設的retry配置檔案,下方是feign.retryer的原始碼 類的全路徑是feign.retryer public d...
學習筆記 解讀CppUnit原始碼2
上次我詳細的剖析了與test.h相互關聯的 test類是cppunit的核心。test這個類相信看了上一章就知道,也就起到測試用例的作用,但是畢竟乙個類的功能有限,如何擴充test類的功能呢?下面裝飾者模式就登場了。testdecorator.h 這個類中儲存了乙份test的指標,這個類的count...
CYYMysql 原始碼解讀 2
執行緒同步類 lock.h檔案和lock.cpp檔案實現比較簡單,使用的是臨界區,臨界區是使用者態的執行緒間切換消耗不是很大,而事件核心物件 訊號量 互斥量都是核心態的,呼叫的時候會切換到核心態,所以盡量使用臨界區來同步執行緒間操作。詳細資訊可以檢視windows核心程式設計,上面講解的很詳細。pr...