我的開源項目的介紹和設計思路


首先放github地址:

 

https://github.com/yangfeixxx/chipsGateway.git

開源項目名:ChipsGateway  (因為我很愛吃薯條)

項目類型:網關

 

下面由本人精分一下,自問自答的給大家大概介紹一下此項目吧

問:這個項目是干嘛的?

答:一個服務網關,屬於半框架半服務,可以想象成netflix zuul.

問:此網關相比於其它網關的區別是什么?

答:網關的作用都大同小異,不過我會盡量多的添加默認組件,並達到最大的可配置化,還有相比於Zuul,我會盡量讓服務對於開發人員更加友善,更加側重於框架的那部分.

 

OK,上面是一個大概的介紹,現在我再來給大家詳細說說,我開發這個服務的思路,以及流程,我會盡量的給大家說清楚,我為什么要這樣做,非常期待大家可以給出建議.

首先,關於開發這個網關的動機,是我想通過寫比較接近底層的開源項目的形式好好將自己學到的所有知識進行一個整合,說白了就是練手,畢竟工作中的項目只能應用一小部分知識,而大部分知識都缺少一個實操的環境,所以我便想要寫一個開源項目,以此來學以致用,至於我為什么以網關作為自己的第二個開源項目呢?(第一個是一個類加載器 https://github.com/yangfeixxx/hotLoad.git ,其實之前也寫過ORM框架,但是因為單機環境實在是無聊,所以寫到一半就沒寫下去了),而因為網關是一個集高並發,高性能,高拓展三高為一體的服務,可以說涉及到了高並發,網絡編程,負載均衡算法等多個細分支知識鏈,因此,我選擇寫一個網關出來.

網關流程和架構設計思路:

記得愛因斯坦曾說過 (額,好像是他),當你想要解決一個問題的時候,首先要去搞懂這個問題是什么.所以我們要先搞懂網關是什么,它能做什么?

於是,我搜索了N多資料,最后總結出一條結論,所謂的網關,就是聚合請求,分發請求,聚合響應,分發響應的一個中間件,那么它能解決什么問題呢?這個如果你到網上搜的話,保證能搜到一大堆,像什么負載均衡,動態路由方便配置,統一的權限驗證等巴拉巴拉的.

但是這些只是現象,只是應用,不是本質,本質是什么?本質就是網關能攔截到多個客戶端發送到多個服務端的請求,多個服務端發送到多個客戶端的響應,並針對這些請求和響應進行一個處理.如下面這個圖

當我在腦海里形成這樣一幅圖后,我第一個想到的是LogStash,沒錯,就是那個ELK里的L,不同的是,LogStash是點對點的對兩個數據源做數據傳輸的處理,而網關則是多對多的做請求響應的處理(當然,從一個請求對應一個響應來看,也是點對點),

再思考一下,像LogStash如果我要對數據進行處理的話我們怎么做呢?答:添加一個過濾器作為過濾鏈中的一環.

那么我們如果使用面向過濾鏈這樣的思路來設計網關是否可行呢?

思考一下后,這是完全可行的,因為我完全可以將權限驗證,動態路由,甚至是限流這些都作為過濾鏈中的一環來進行處理,但是這樣做有什么好處呢?

好處就是將處理邏輯完全原子化,組件化了,這樣一來,我的所有邏輯都是可插拔的,實現了設計模式里提倡的類模塊化.

在思考完這些后,我便開始着手於流程架構圖的制作,下面是我的第一個草圖,當然,這個草圖是有問題的,我先不說問題在哪,大家自己思考一下

 

 這個草圖的問題在哪呢?那就是我既然定義了FilterChain類,那么我的過濾鏈就不應該直接與數據進行接觸了,所以我修改了一下

 當然,大家如果現在看我的項目源碼的話,會發現我現在的項目結構並不是如我畫的圖這樣,具體是哪樣,我准備先等第一個版本發布后再畫出來,因為在開發的過程中,我發現事情並沒有這么簡單,實際上因為要考慮可拓展性問題,所以我現在的項目架構比我畫的圖要復雜的多,.這里心機一下,還請大家關注下我的博客,等我發布了第一個能正式運行的版本后會畫出來並詳細解釋每個設計點

時間回到我當時畫完第二個草圖后,當時的我在畫完后並沒有馬上上手,而是先觀看了和我這個項目類型相同的Zuul網關的源碼,並分析了其架構設計的優點和缺點.下面是我總結的幾點:

優點:使用了preFilter,routerFilter,postFilter 三個邏輯分類將過濾器進行了分類,這種思路和我不謀而合

缺點:對於開發人員太不友好,開發人員在添加過濾器的時候只能通過RequestContext拿到原生的RequestBody,ResponseBody,而且preFilter不能強制中斷,哪怕打上了中斷標記,也必須要把preFilter全部過完,浪費資源,沒有必要,還有就是本身提供的Filter組件並不太多

所以我們取其精華去其糟粕,也就是同樣使用上述三個邏輯分類,並將RequestBody和ResponseBody進行一個包裝並注入,Filter過濾鏈在任何時候都可以強制中斷,並讓開發可以拿到中斷信息(比如在哪個過濾器被中斷的,為什么被中斷)等....

好了,上述這些就是我的大概思路,針對於源碼的具體設計這些大家可以先拉下我的代碼看看,等我正式發布第一個版本后,會詳細的跟大家進行分享.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM