實戰(zhàn):這個手寫的網(wǎng)關(guān)已集成2大緩沖處理器+4大注冊中心+8種過濾器+14種負載均衡策略,嘎嘎強!!
沉淀,成長,突破,幫助他人,成就自我。
- 本節(jié)難度:★★★☆☆
- 本節(jié)重點:實戰(zhàn)通過自定義SPI加載的各種負載均衡策略訪問后端服務(wù),深入理解高性能Polaris網(wǎng)關(guān)負載均衡策略的核心設(shè)計與實現(xiàn)。重點掌握整體調(diào)用鏈路的設(shè)計思路和設(shè)計方法,并能夠?qū)⑵潇`活應(yīng)用到自身實際項目中。
截止到目前,我們自己手寫的高性能Polaris網(wǎng)關(guān)已經(jīng)實現(xiàn)了最基礎(chǔ)與最核心的功能。
主要包括:需求設(shè)計、總體架構(gòu)設(shè)計、環(huán)境搭建、通用模型設(shè)計與實現(xiàn)、基于自定義SPI設(shè)計與實現(xiàn)通用過濾器、高性能BatchEvent模式與MPMC模式緩沖隊列通用處理器的設(shè)計與實現(xiàn)、HTTP核心處理器的設(shè)計與實現(xiàn)和網(wǎng)關(guān)核心啟動容器的設(shè)計與實現(xiàn),同時,也對注冊中心、負載均衡策略和增強型負載均衡策略進行了設(shè)計與實現(xiàn)。
期間,也設(shè)計和實現(xiàn)了眾多的網(wǎng)關(guān)組件。那如何檢驗我們自己手搓的高性能網(wǎng)關(guān)的各種負載均衡策略是否滿足需求呢?最好的方式就是網(wǎng)關(guān)通過自定義SPI加載各種負載均衡策略訪問后端服務(wù)的接口驗證下網(wǎng)關(guān)的功能是否符合我們的預(yù)期。
一、背景
截止到目前,我們完成了《高性能Polaris網(wǎng)關(guān)》的十二大篇章的設(shè)計與實現(xiàn),也對代碼進行了深度的設(shè)計與封裝實現(xiàn),代碼結(jié)構(gòu)如下圖所示。
圖片
在需求設(shè)計篇章: 詳細設(shè)計了高性能Polaris網(wǎng)關(guān)的需求,對網(wǎng)關(guān)要實現(xiàn)的功能和性能進行了明確的定義和設(shè)計。
在總體架構(gòu)設(shè)計篇章: 詳細設(shè)計了網(wǎng)關(guān)的總體方案目標、架構(gòu)設(shè)計和網(wǎng)關(guān)的數(shù)據(jù)模型。
在環(huán)境搭建篇章: 詳細搭建了網(wǎng)關(guān)的基礎(chǔ)環(huán)境與研發(fā)環(huán)境、搭建了項目總體框架與工程結(jié)構(gòu)并詳細搭建了Maven私服倉庫用來開發(fā)高性能Polaris網(wǎng)關(guān)。
在通用模型設(shè)計篇章: 完成了整個通用模型的設(shè)計,為整個Polaris網(wǎng)關(guān)后續(xù)的設(shè)計和研發(fā)奠定了堅實的基礎(chǔ)。相信小伙伴們對網(wǎng)關(guān)已經(jīng)并不陌生,一個網(wǎng)關(guān)本質(zhì)上最基礎(chǔ)和最核心的功能就是接收客戶端請求,根據(jù)一定的策略將請求轉(zhuǎn)發(fā)至后端服務(wù),隨后接收后端服務(wù)的響應(yīng)結(jié)果,再將結(jié)果響應(yīng)給客戶端。在此基礎(chǔ)上,網(wǎng)關(guān)可以實現(xiàn)各種策略功能,例如:限流、熔斷、降級、重試、負載均衡、流控、灰度、藍綠發(fā)布等等一系列的功能。
在通用過濾器設(shè)計篇章: 對網(wǎng)關(guān)的頂級核心過濾器接口進行了設(shè)計和實現(xiàn),也進一步封裝了請求和響應(yīng)的模型,對網(wǎng)關(guān)過濾器的兩大頂級抽象類和整體過濾器鏈進行了設(shè)計和實現(xiàn)。基于自定義SPI實現(xiàn)了負載均衡過濾器、超時配置過濾器、HTTP過濾器、RPC過濾器、指標分析過濾器、Mock過濾器、灰度過濾器、錯誤處理過濾器。
注意:網(wǎng)關(guān)通過SPI內(nèi)置了各種過濾器的實現(xiàn),如果網(wǎng)關(guān)內(nèi)置的過濾器不滿足需求,大家也可以通過SPI擴展自己特定場景的過濾器。
在通用處理器篇章: 在網(wǎng)關(guān)的處理器設(shè)計中,我們重點設(shè)計和實現(xiàn)了通用處理器接口,基于Netty實現(xiàn)了核心處理器的功能,并且基于BatchEvent和MPMC兩種模式實現(xiàn)了緩沖隊列。在此基礎(chǔ)上,基于自定義SPI擴展實現(xiàn)了BatchEvent模式處理器和MPMC模式處理器。在實現(xiàn)緩沖隊列時,重點參考了JDK的隊列實現(xiàn),并且在JDK隊列實現(xiàn)的基礎(chǔ)上,做了進一步優(yōu)化。所以,各位小伙伴們在學(xué)習(xí)自定義緩沖隊列時,可以結(jié)合JDK的Queue接口及其實現(xiàn)類等深入學(xué)習(xí)和理解。
在HTTP處理器篇章: 對HTTP處理器的核心接口、服務(wù)端核心處理器與連接管理器進行了設(shè)計與實現(xiàn),并且基于Netty對網(wǎng)關(guān)的服務(wù)端和客戶端進行了設(shè)計與實現(xiàn)。其他服務(wù)或者客戶端可以通過HTTP協(xié)議、RPC協(xié)議和WebSocket協(xié)議訪問網(wǎng)關(guān)。
在核心啟動流程篇章: 對網(wǎng)關(guān)的核心啟動容器與核心啟動加載流程進行了設(shè)計與實現(xiàn)。
在牛刀小試篇章: 實戰(zhàn)通過高性能Polaris網(wǎng)關(guān)成功訪問后端服務(wù)。
在注冊中心篇章: 基于自定義SPI實現(xiàn)了Nacos注冊中心、Zookeeper注冊中心,并且為了提升小伙們對網(wǎng)關(guān)項目的參與感,搭建代碼框架交由小伙伴們實現(xiàn)Etcd注冊中心和Consul注冊中心。同時,對網(wǎng)關(guān)整合注冊中心實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)進行了詳細的設(shè)計與實現(xiàn)。
在負載均衡篇章: 基于自定義SPI實現(xiàn)了隨機算法、加權(quán)隨機算法、輪詢算法、加權(quán)輪詢算法、哈希算法、加權(quán)哈希算法、源IP地址哈希算法、加權(quán)源IP地址哈希算法、一致性哈希算法等多種負載均衡策略。
在增強型負載均衡篇章: 基于自定義SPI實現(xiàn)了增強型隨機算法、增強型輪詢算法、增強型哈希算法、增強型源IP地址哈希算法和增強型一致性哈希算法等多種負載均衡策略。
二、本節(jié)重點
整合負載均衡策略實戰(zhàn)訪問后端服務(wù),深入理解高性能Polaris網(wǎng)關(guān)負載均衡策略的核心設(shè)計與實現(xiàn)。重點掌握整體調(diào)用鏈路的設(shè)計思路和設(shè)計方法,并能夠?qū)⑵潇`活應(yīng)用到自身實際項目中。
三、實戰(zhàn)場景
本節(jié),主要驗證通過自定義SPI加載各種負載均衡策略實現(xiàn)訪問后端服務(wù)接口。
- 基于自定義SPI加載輪詢算法負載均衡策略實現(xiàn)訪問后端服務(wù)接口。
- 只啟動后端服務(wù),直接訪問后端服務(wù)接口,正確返回hello polaris。
- 啟動網(wǎng)關(guān)和后端服務(wù),通過網(wǎng)關(guān)訪問后端服務(wù)接口,正確返回hello polaris。
- 停止后端服務(wù),通過網(wǎng)關(guān)訪問后端服務(wù)接口,返回503:后端服務(wù)暫時不可用,請稍后再試。
四、服務(wù)規(guī)劃
實戰(zhàn)通過高性能Polaris網(wǎng)關(guān)訪問后端服務(wù)的規(guī)劃如下所示。
服務(wù)名 | 服務(wù)說明 | 端口 | 接口 |
polaris-examples-http | 后端服務(wù) | 8080 | /http_test |
polaris-examples-http-gateway | 網(wǎng)關(guān)服務(wù) | 10000 | 訪問polaris-examples-http的接口用來測試 |
五、路由實現(xiàn)
這里,需要修改下負載均衡路由的代碼,在負載均衡路由中通過自定義SPI加載各種負載均衡策略,實現(xiàn)通過負載均衡的方式訪問后端服務(wù)。
源碼詳見:polaris-filter-pre-loadbalancer工程下的io.binghe.polaris.filter.pre.loadbalancer.LoadBalancerFilter。
(1)新增serviceLoadBalancerMap成員變量
serviceLoadBalancerMap主要用來緩存通過自定義SPI加載的負載均衡實例,如下所示。
private final Map<String, ServiceLoadBalancer<ServiceInstance>> serviceLoadBalancerMap = new ConcurrentHashMap<>();(2)修改executeHttpLoadBalance()方法
executeHttpLoadBalance()方法主要是通過負載均衡的方式訪問后端HTTP接口的方法,修改后的方法如下所示。
private void executeHttpLoadBalance(RequestResponseContext requestResponseContext, String balanceType) {
HttpPolarisRequest request = requestResponseContext.getRequest();
String uniqueId = request.getUniqueId();
Set<ServiceInstance> serviceInstances = ConfigCacheFactory.getInstance().getServiceInstanceByUniqueId(uniqueId, requestResponseContext.isGray());
requestResponseContext.putAttribute(AttributeKeyFactory.getMatchInstances(), serviceInstances);
ServiceLoadBalancer<ServiceInstance> serviceLoadBalancer = serviceLoadBalancerMap.get(balanceType);
if (serviceLoadBalancer == null){
serviceLoadBalancer = serviceLoadBalancerMap.computeIfAbsent(balanceType, (t) -> ExtensionLoader.getExtension(ServiceLoadBalancer.class, balanceType));
}
ServiceInstance serviceInstance = serviceLoadBalancer.select(new ArrayList<>(serviceInstances), request.hashCode(), request.getClientIp());
String targetAddress = serviceInstance.getAddress().concat(":").concat(String.valueOf(serviceInstance.getPort()));
requestResponseContext.getMudifyRequest().setRequestHost(targetAddress);
}可以看到,在executeHttpLoadBalance()方法中已經(jīng)實現(xiàn)了通過自定義SPI加載負載均衡策略,在服務(wù)實例列表中,通過負載均衡策略選擇其中一個服務(wù)實例。
六、測試場景驗證
接下來,對網(wǎng)關(guān)的測試場景進行驗證。
場景一: 基于自定義SPI加載輪詢算法負載均衡策略實現(xiàn)訪問后端服務(wù)接口。
分別啟動后端服務(wù)和網(wǎng)關(guān),在輪詢算法負載均衡策略的實現(xiàn)方法上打上斷點。也就在polaris-loadbalancer-round-robin工程的io.binghe.polaris.loadbalancer.round.robin.RobinServiceLoadBalancer#select方法打上斷點,如下所示。
圖片
通過Apifox訪問http://localhost:10000/http_test,如下所示。
圖片
點擊發(fā)生按鈕,可以看到訪問會正確進入代碼斷點,如下所示。

可以看到,已經(jīng)正確執(zhí)行到自定義SPI加載的輪詢負載均衡策略。
放過斷點,可以看到,正確返回了hello polaris。
圖片
場景二: 只啟動后端服務(wù),直接訪問后端服務(wù)接口,正確返回hello polaris。
只啟動后端服務(wù)后,通過Apifox訪問http://localhost:8080/http_test,如下所示。
圖片
測試結(jié)果符合預(yù)期,正確返回了hello polaris字符串。
場景三: 啟動網(wǎng)關(guān)和后端服務(wù),通過網(wǎng)關(guān)訪問后端服務(wù)接口,正確返回hello polaris。
啟動網(wǎng)關(guān)和后端服務(wù)后,通過Apifox訪問http://localhost:10000/http_test,如下所示。
圖片
測試結(jié)果符合預(yù)期,正確返回了hello polaris字符串。
場景四: 停止后端服務(wù),通過網(wǎng)關(guān)訪問后端服務(wù)接口,返回503:后端服務(wù)暫時不可用,請稍后再試。
停止后端服務(wù)后,通過Apifox訪問http://localhost:10000/http_test,如下所示。
圖片
測試結(jié)果符合預(yù)期,正確返回了503:后端服務(wù)暫時不可用,請稍后再試。
七、本節(jié)總結(jié)
本節(jié),主要實戰(zhàn)的形式通過自定義SPI加載的各種負載均衡策略訪問后端服務(wù),對典型的正常和異常場景都進行了驗證,結(jié)果都符合預(yù)期效果。
希望這節(jié)內(nèi)容能夠為大家?guī)韺嵸|(zhì)性的收獲,最后,可以在評論區(qū)寫下你學(xué)完本章節(jié)的收獲,祝大家都能學(xué)有所成,我們一起搞定高性能Polaris網(wǎng)關(guān)。




























