微服務架構閘道器介面設計
近年來微服務架構盛行,我司也利用spring cloud實踐微服務。使用的也是spring cloud很經典的架構,zuul充當閘道器路由,configserver作為靜態配置中心,feign作為遠端呼叫http client 等,反正都是官網文件能找到的元件,我們都在用。使用基礎的功能自然是沒有問題,但是我們也會針對進行深度定製,完成我們特有的功能,例如我們定製zuul閘道器,路由時針對部分request中的資料,這個在通用模式下是做不到,因為zuul基礎的功能是路由,通過連結將請求分發給哪個微服務的哪個方法進行處理,下面我們就以一個介面限流的案例,來一步步的教大家閘道器介面的設計方案與深度定製zuul閘道器的過程。
背景
- 微服務需要暴露介面給第三方使用,但是此介面是二次封裝的產物,封裝了一個按次付費的介面,所有不能隨便呼叫,需要限制呼叫方呼叫的次數。
- 基礎的應用框架正如前言所說使用spring cloud 全家桶。
基礎設計
- 為了更好的相容性和擴充套件性,我們決定在後臺配置需要被閘道器特殊處理的介面。例如此介面名稱叫做介面A,他的訪問連結是什麼。都需要被記錄。
- 閘道器介面需要被怎樣的處理?驗籤(1)?解密(2)?限流(3)?都可以。我們將這些被閘道器允許的特殊操作,做成一個個原子,然後隨意組合成某一類介面的具體的功能。比如說我們的某一類的介面的功能是限流+驗籤,那麼我們原子組合就是(1,3),我們稱這種方案為方案A,具體要怎麼處理這個組合可以根據大家自己的設計,我這邊建議是與或操作,利用計算機擅長的二進位制來處理。
- 我們通過第一步有了介面A,我們通過第二部有了方案A,然後將他們融合在一起,拼成的語義就是:當閘道器發現了被訪問的連結是特殊介面A所描述的,那麼就要找到這個介面的特殊配置,也就是方案A,在閘道器進行特殊處理就行了。
- 閘道器改怎麼進行特殊處理呢?屬性zuul的朋友應該都知道他是怎麼執行的,不熟悉的同學可以看一下我的另外一篇文章Zuul 原始碼分析,zuul分為諸多型別的filter,他們都是ZuulFilter的例項,所以你只要寫一個ZuulFilter的,並且把它做成Bean(@Component註解註釋或者通過配置檔案配置等),就能被Zuul察覺到,但是能不能執行,還得看ZuulFilter中的shouldFilter方法結果是否返回true,這種設計也給我們很大的靈活性和擴充套件性,也給我們通過程式碼操作我們寫的這個filter是否執行成為可能,並且這種設計和我之前提到的與或操作是天然的結合在一起,無縫銜接,特別好用!我們可以通過自定義pre型別的filter,將一些前置的邏輯,比如方案A是驗籤和限流的功能做掉。
- 功能驗證完了,我們就剩下路由了。也就是我們的route型別的過濾器。因為我們要實現驗籤和介面限流等功能,所有避免不了就是多一些非業務的引數,但是業務系統不需要這些,所以我們就要通過閘道器層面就要過濾掉。Zuul閘道器有兩個主要的route型別的過濾器,如果通過服務名稱路由,會從consul或者eureka中獲取到這個服務名稱對應的服務的資訊,然後通過軟負載均衡robbin,路由到具體的服務發起請求,這個filter叫做
RibbonRoutingFilter
,如果你指定了訪問服務的URL,那麼久不會走到這個RibbonRoutingFilter,你走的就是SimpleHostRoutingFilter
,它裡面就是直接通過apache http client 發起來請求。這兩個預設的route型別的過濾器都不能滿足我們傳遞部分資料到後端微服務的場景,所以我們就得自定義一個route型別的過濾器,我們要做的就是兩點,第一點,將後端微服務真真需要的資料傳給他們,第二點就是在執行時不要訪問到其他的route型別的過濾器,防止被介面被執行兩次。
結語
基本上實現跟著上面的步驟來就沒啥特別大的問題了,自己寫一個route型別的filter也不是特別難的事情,基本上把SimpleHostRoutingFilter重寫一些就行,大部分程式碼不需要改動,只要在傳遞request時,訊息體換成服務端真正需要的資料,並且注意content-length的設定就可以。另外怎麼防止不會有其他的route型別的filter訪問到,這就得看其他的route型別的filter的shouldFilter方法是怎麼樣的,想方設法把他們變成false就行了。我們再解決問題的同時也要思考框架級程式碼的設計,擴充套件性如此只好,即使沒有現成的解決方案,但是我們自己稍作改動就會支援。不得不說,這些大神們寫的程式碼,真的值得我們好好學習啊。
相關文章
- 高效能API閘道器(1)、微服務API閘道器架構設計API微服務架構
- 個推微服務閘道器架構實踐微服務架構
- 微服務架構基礎之API閘道器微服務架構API
- Spring Cloud構建微服務架構-服務閘道器SpringCloud微服務架構
- 微服務架構中整合閘道器、許可權服務微服務架構
- Spring Cloud構建微服務架構—服務閘道器過濾器SpringCloud微服務架構過濾器
- 微服務閘道器微服務
- 微服務設計中的API閘道器模式微服務API模式
- 微服務閘道器- Nginx微服務Nginx
- spring cloud微服務分散式雲架構-服務閘道器過濾器SpringCloud微服務分散式架構過濾器
- 微服務中的閘道器微服務
- 百億流量微服務閘道器的設計與實現微服務
- 億級流量架構之閘道器設計思路、常見閘道器對比架構
- 微服務(七)Gateway服務閘道器微服務Gateway
- 《springcloud 二》微服務動態閘道器,閘道器叢集SpringGCCloud微服務
- 架構設計思想-微服務架構設計模式架構微服務設計模式
- SpringCloud微服務系列- 分散式能力建設之微服務閘道器SpringGCCloud微服務分散式
- (六)spring cloud微服務分散式雲架構-服務閘道器Zuul高階篇SpringCloud微服務分散式架構Zuul
- (三)spring cloud微服務分散式雲架構-服務閘道器zuul初級篇SpringCloud微服務分散式架構Zuul
- 微服務閘道器 Spring Cloud Gateway微服務SpringCloudGateway
- SpringCloud 微服務閘道器 Gateway 元件SpringGCCloud微服務Gateway元件
- 微服務6:通訊之閘道器微服務
- 微服務基礎——厲害了!API閘道器微服務API
- SpringCloud微服務治理三(Zuul閘道器)SpringGCCloud微服務Zuul
- 微服務下的閘道器如何選擇微服務
- 微服務閘道器Gateway實踐總結微服務Gateway
- 為什麼微服務需要API閘道器?微服務API
- 微服務實踐分享(2)api閘道器微服務API
- 微服務架構和設計模式 - DZone微服務微服務架構設計模式
- .NET Core 微服務—API閘道器(Ocelot) 教程 [四]微服務API
- .NETCore微服務探尋(一) - 閘道器NetCore微服務
- .NET Core微服務開發閘道器篇-ocelot微服務
- .NET Core 微服務—API閘道器(Ocelot) 教程 [一]微服務API
- 微服務閘道器實戰——Spring Cloud Gateway微服務SpringCloudGateway
- 微服務與閘道器技術(SIA-GateWay)微服務Gateway
- 微服務閘道器SIA-GateWay使用指南微服務Gateway
- 5 種微服務閘道器,該選哪個?微服務
- SpringCloud分散式微服務雲架構 第五篇: 路由閘道器(zuul)(Finchley版本)SpringGCCloud分散式微服務架構路由Zuul