Feign學習筆記2 原始碼解讀

2021-08-06 04:06:03 字數 2470 閱讀 3570

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...