【技巧】SpringCloud Gateway實現多子域(單個應用開放多個端口)

0. 目錄

      • 1. 需求背景
      • 2. 實現
      • 3. 額外 - 其它Servlet容器實現
        • 3.1 Undertow
        • 3.2 Tomcat
      • 4. 相關

1. 需求背景

瀏覽器針對單個網站地址(ip+port)存在“6個請求”限制;通過多子域配置可以突破這個限制,增加網站的響應效率,尤其是針對三維服務這類大請求量服務。

注意:

  1. 多子域的目的是為了突破瀏覽器"6個請求"的限制(【瀏覽器請求并發限制】,與后端應用提供的業務功能無關。
  2. 這個配置項的底層實現原理其實就是為當前網站增加幾個訪問端口,比如除了原始的123端口之外,還可以通過456,777端口訪問;僅此而已,沒有任何業務功能上的變化和影響。
  3. 瀏覽器對于"同一個網址"采取的是 ip + port 的組合認定,只有兩者都相同才會認定為同一個網站,這也是通過開放多個端口就可以突破該項限制的原因。

2. 實現

本項功能需求的應用場景比較窄,因此這里直接給出解決方案,不做原理性解讀。

以下三個類拷貝到項目中即可。

// ============================== 1/3 MultiportNettyWebServer
// 組合模式
public class MultiportNettyWebServer implements WebServer {private final List<NettyWebServer> servers;public MultiportNettyWebServer(List<NettyWebServer> servers) {this.servers = servers;}@Overridepublic void start() throws WebServerException {servers.stream().forEach(server -> server.start());}@Overridepublic void shutDownGracefully(GracefulShutdownCallback callback) {servers.stream().forEach(server -> server.shutDownGracefully(callback));}@Overridepublic void stop() throws WebServerException {servers.stream().forEach(server -> server.stop());}@Overridepublic int getPort() {return -1;}}// ============================== 2/3 MultiportNettyReactiveWebServerFactory
public class MultiportNettyReactiveWebServerFactory extends NettyReactiveWebServerFactory {@Overridepublic WebServer getWebServer(HttpHandler httpHandler) {NettyWebServer webServer = (NettyWebServer)super.getWebServer(httpHandler);List<NettyWebServer> newArrayList = CollUtil.newArrayList(webServer);// 這里并不是原地修改, 生效的是方法的返回值對象; 所以這里還得塞回去...// 這個思路其實很好, 保證對象的不可變....HttpServer httpServer = Convert.convert(HttpServer.class, ReflectUtil.getFieldValue(webServer, "httpServer"));httpServer = httpServer.port(81);ReflectUtil.setFieldValue(webServer, "httpServer", httpServer);webServer = (NettyWebServer)super.getWebServer(httpHandler);newArrayList.add(webServer);httpServer = Convert.convert(HttpServer.class, ReflectUtil.getFieldValue(webServer, "httpServer"));httpServer = httpServer.port(82);ReflectUtil.setFieldValue(webServer, "httpServer", httpServer);return new MultiportNettyWebServer(newArrayList);}
}// ============================== 3/3 MultiportNettyReactiveWebServerFactory
/*** COPY FROM {@code ReactiveWebServerFactoryConfiguration&EmbeddedNetty}*/
@Configuration
public class MultiportNettyWebServerConfig {@Bean@ConditionalOnMissingBeanReactorResourceFactory reactorServerResourceFactory() {return new ReactorResourceFactory();}@BeanNettyReactiveWebServerFactory nettyReactiveWebServerFactory(ReactorResourceFactory resourceFactory,ObjectProvider<NettyRouteProvider> routes, ObjectProvider<NettyServerCustomizer> serverCustomizers) {NettyReactiveWebServerFactory serverFactory = new MultiportNettyReactiveWebServerFactory();serverFactory.setResourceFactory(resourceFactory);routes.orderedStream().forEach(serverFactory::addRouteProviders);serverFactory.getServerCustomizers().addAll(serverCustomizers.orderedStream().collect(Collectors.toList()));return serverFactory;}}

3. 額外 - 其它Servlet容器實現

3.1 Undertow
@Slf4j
@Configuration
@ConditionalOnClass({Servlet.class, Undertow.class, SslClientAuthMode.class})
// 參考自: ServletWebServerFactoryConfiguration.EmbeddedUndertow.java
public class WebServerMultiPortConfigByUndertow implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {/*** 多個端口*/@Overridepublic void customize(UndertowServletWebServerFactory factory) {if (ArrayUtil.isEmpty(multiports)) {log.warn("### there is no multi-port config. so skip it");return;}final String[] finalMultiports = new String[]{"81", "82"};factory.addBuilderCustomizers(s -> {log.warn("### 啟用Undertow容器, 配置多端口 [ {} ]", Arrays.toString(finalMultiports));Arrays.stream(finalMultiports).forEach(port -> s.addHttpListener(Convert.toInt(port), "0.0.0.0"));});}
}
3.2 Tomcat
@Slf4j
@Configuration
// 參考自: ServletWebServerFactoryConfiguration.EmbeddedTomcat.java
@ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class }) 
public class WebServerMultiPortConfigByTomcat implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {/*** 多個端口*/@Overridepublic void customize(TomcatServletWebServerFactory factory) {factory.addAdditionalTomcatConnectors(addtionalConnetors());}private Connector[] addtionalConnetors() {final String[] multiPorts = new String[]{"81", "82"};log.warn("### 啟用Tomcat容器, 配置多端口 [ {} ]", Arrays.toString(multiPorts));List<Connector> connectors = new ArrayList<>();for (String s : multiPorts) {Connector connector = new Connector("HTTP/1.1");connector.setPort(Integer.parseInt(s));connector.setScheme("http");connectors.add(connector);}return connectors.toArray(new Connector[] {});}
}

4. 相關

  1. 【瀏覽器請求并發限制】
  2. Spring Boot中為Tomcat配置多個監聽端口

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深入了解設計模式】組合設計模式

組合設計模式 組合模式是一種結構型設計模式&#xff0c;它允許你將對象組合成樹狀結構來表現“整體-部分”關系。組合模式使得客戶端可以統一對待單個對象和組合對象&#xff0c;從而使得代碼更加靈活和易于擴展。 概述 ? 對于這個圖片肯定會非常熟悉&#xff0c;上圖我們可…

Carla自動駕駛仿真九:車輛變道路徑規劃

文章目錄 前言一、關鍵函數二、完整代碼效果 前言 本文介紹一種在carla中比較簡單的變道路徑規劃方法&#xff0c;主要核心是調用carla的GlobalRoutePlanner模塊和PID控制模塊實現變道&#xff0c;大體的框架如下圖所示。 一、關鍵函數 1、get_spawn_point(),該函數根據指定r…

c語言字符串函數之strcpy函數,strnpy函數

strcpy函數 語法格式 strcpy(字符數組1,字符串2&#xff09; 它的作用是把字符串2復制到字符數組1里面 #include<stdio.h> #include<string.h> int main() {char c[]"河南";char d[]"安徽";char d[];printf("%s\n",strcpy(c,d));…

力扣hot100題解(python版41-43題)

41、二叉樹的層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[9,20],[15,7]]示例…

【C語言結構體】用戶自定義類型--結構體,結構體傳參,位段,聯合體和枚舉【圖文詳解】

歡迎來CILMY23的博客喔&#xff0c;本篇為【C語言結構體】用戶自定義類型--結構體&#xff0c;結構體傳參&#xff0c;位段&#xff0c;聯合體和枚舉【圖文詳解】&#xff0c;感謝觀看&#xff0c;支持的可以給個一鍵三連&#xff0c;點贊關注收藏。 前言 上一篇&#xff08;ht…

GO—函數

Go 語言支持普通函數、匿名函數和閉包&#xff0c;從設計上對函數進行了優化和改進&#xff0c;讓函數使用起來更加方便。 Go 語言的函數屬于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是說&#xff1a; 函數本身可以作為值進行傳遞。支持匿名函數和閉…

Leetcode.2369 檢查數組是否存在有效劃分

題目鏈接 Leetcode.2369 檢查數組是否存在有效劃分 rating : 1780 題目描述 給你一個下標從 0 0 0 開始的整數數組 n u m s nums nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為…

推薦6款SSH遠程連接工具

1、Xshell 介紹&#xff1a; xshell是一個非常強大的安全終端模擬軟件&#xff0c;它支持SSH1, SSH2, 以及Windows平臺的TELNET 協議。Xshell可以在Windows界面下用來訪問遠端不同系統下的服務器&#xff0c;從而比較好的達到遠程控制終端的目的。 業界最強大的SSH客戶機 官…

數據分析-Pandas數據的直方圖探查

數據分析-Pandas數據的直方圖探查 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&…

農產品質量追溯系統—功能介紹(2)

儲藏管理 儲藏信息管理對需要儲藏的農產品,記錄儲藏的相關信息,如儲藏開始時間、存放倉庫、操作人員、儲藏原因等; 倉庫信息管理物流管理 物流公司管理對相關的物流公司信息進行登記,以便于管理和追溯; 車輛管理

我的秋招數據分析崗面經分享(京東,美團,阿里,拼多多,vivo,滴滴)

節前&#xff0c;我們社群組織了一場技術&面試討論會&#xff0c;邀請了一些互聯網大廠同學、參加社招和校招面試的同學&#xff0c;針對新手如何入門數據分析、機器學習算法、該如何備戰面試、面試常考點分享等熱門話題進行了深入的討論。 基于社群的討論&#xff0c;今天…

力扣爆刷第84天之hot100五連刷6-10

力扣爆刷第84天之hot100五連刷6-10 文章目錄 力扣爆刷第84天之hot100五連刷6-10一、15. 三數之和二、42. 接雨水三、3. 無重復字符的最長子串四、438. 找到字符串中所有字母異位詞五、560. 和為 K 的子數組 一、15. 三數之和 題目鏈接&#xff1a;https://leetcode.cn/problem…

JAVA學習筆記13(位運算)

1.位運算 1.1 原碼、反碼、補碼 ? *規則&#xff1a; ? 1.二進制的最高位是符號位&#xff1a;0表示正數&#xff0c;1表示負數 ? 2.正數的原碼&#xff0c;反碼&#xff0c;補碼都一樣&#xff08;三碼合一&#xff09; ? 3.負數的反碼 他的原碼符號位不變&#xff…

從metashape導出深度圖,從深度圖恢復密集點云

從metashape導出深度圖&#xff0c;從深度圖恢復密集點云 1.從metashape導出深度圖 參考&#xff1a;https://blog.csdn.net/WHU_StudentZhong/article/details/123107072?spm1001.2014.3001.5502 2.從深度圖建立密集點云 首先從metashape導出blockExchange格式的xml文件&…

OpenHarmony、HarmonyOS打開編輯 PDF 等操作的三方組件使用教程

項目場景: 隨著數字化時代的發展,PDF 文檔成為廣泛應用于各行業的重要文件格式。為了提高OpenHarmony/HarmonyOS生態系統的功能性和用戶體驗,我們需要一款支持打開、編輯PDF文件的應用程序。 使用戶能夠輕松打開、瀏覽和編輯PDF文件。該應用將充分利用OpenHarmony/HarmonyO…

【NTN 衛星通信】衛星和無人機配合的應用場景

1 場景概述 衛星接入網是一種有潛力的技術&#xff0c;可以為地面覆蓋差地區的用戶提供無處不在的網絡服務。然而&#xff0c;衛星覆蓋范圍對于位于考古或采礦地點內部/被茂密森林覆蓋的村莊/山谷/靠近山丘或大型建筑物的用戶可能很稀疏。因此&#xff0c;涉及衛星接入和無人駕…

HarmonyOS Full SDK的安裝

OpenHarmony的應用開發工具HUAWEI DevEco Studio現在隨著OpenHarmony版本發布而發布,只能在版本發布說明中下載,例如最新版本的OpenHarmony 4.0 Release。對應的需要下載DevEco Studio 4.0 Release,如下圖。 圖片 下載Full SDK主要有兩種方式,一種是通過DevEco Studio下載…

教你用Fiddler捕獲HTTPS請求

安裝Fiddler 這里不特別說明了&#xff0c;網上搜索一大把&#xff0c;根據安裝引導一步步安裝即可。&#xff08;這里采用的是fiddler v4.6&#xff09; 配置Fiddler 1、打開fiddler配置Tools –>Telerik Fiddler Options。 2、打開HTTPS配置項&#xff0c;勾選“Captur…

【程序員養生延壽系列-萬人關注的養生指南 4 】

1.早起一杯溫水&#xff0c;疏通腸胃&#xff0c;補充水分。 2.早十點和下午三點左右活動活動身體&#xff08;運動or健身&#xff09;&#xff0c;放松緊張疲憊的身體&#xff0c;幫助消化&#xff0c;給身體透個氣。 3.每天散步&#xff0c;好處多多&#xff08;減肥健身&a…

ctf_show筆記篇(web入門---爆破)

爆破 21&#xff1a;直接bp抓包跑字典&#xff0c;需base64加密 22&#xff1a;可用工具跑也可用瀏覽器找還可以用網上做好的域名查找去找 23&#xff1a;此題需跑腳本已經附上自寫腳本 最后跑出來六個答案一個一個嘗試得到答案為3j import hashlibm "0123456789qwert…