SpringBoot同時監(jiān)聽多個端口的完整方法
01 引言
平時開發(fā)中常見的是一個Tomcat一個端口被訪問。從來沒有考慮過一個接口可以通過多個端口同時訪問。
直到前兩天看到一個帖子說,SpringBoot同時監(jiān)聽多個端口。于是自己玩了一下,感覺蠻有意思的,就整理一下分享給大家。

02 場景假設
假設有一套系統(tǒng)運行平穩(wěn),得到合作商的青睞,想要有一套一模一樣的系統(tǒng)。領導要求重新部署一套,但是為了節(jié)省經(jīng)費,領導不提供多余的服務器,希望能夠在原來的服務器的基礎上技能讓自己用,也能讓合作商使用。
# 自己使用 curl http://localhost:8081/a/api/foo # 合作商使用 curl http://localhost:8082/b/api/foo
這樣的情況下,聰明的你想到了同一個Tomcat開放兩個端口,一個給自己用,一個給合作商用。
03 問題解決
3.1 開發(fā)多接口
我們先不管端口的分配,我們先看看能不能開方多個接口。當然可以。
我們需要配置org.springframework.boot.web.servlet.server.ServletWebServerFactoryl類:
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
Connector aConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
aConnector.setPort(8081);
factory.addAdditionalTomcatConnectors(aConnector);
Connector bConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
bConnector.setPort(8082);
factory.addAdditionalTomcatConnectors(bConnector);
return factory;
}
這里開放了8081、8082兩個接口。這兩個接口不影響默認端口,加上默認端口8080總共有3個端口可以同時訪問。
Java測試
@Slf4j
@RestController
@RequestMapping("/api")
public class FooController {
@GetMapping("/foo")
public String foo() {
return "foo";
}
}
# 可以訪問的路徑 curl http://localhost:8080/api/foo curl http://localhost:8081/api/foo curl http://localhost:8082/api/foo
上面的三種方式都可以訪問。這就實現(xiàn)了一個接口三個端口都可以訪問的效果。
3.2 端口分配
為了實現(xiàn)不同接口的資源隔離。我們將代碼復制了一份,為了方便演示,修改了一點提示語。

假設FooController控制層給自己用,使用8081端口,并加前綴a。而FooV2Controller給合作商用,使用8082端口,并加前綴b。
我們將在不改變控制層代碼的情況下,通過配置的方式完成資源的隔離。通過攔截器使用端口路由攔截。
public class MultiPortIntercpetor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
int localPort = request.getLocalPort();
String requestURI = request.getRequestURI();
if (localPort == 8081 && requestURI.startsWith("/a")) {
return true;
}
if (localPort == 8082 && requestURI.startsWith("/b")) {
return true;
}
Map<String, Object> map = new HashMap<>();
map.put("code", 404);
map.put("success", false);
map.put("message", "請求錯誤");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(map));
return false;
}
}
攔截器的配置:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MultiPortIntercpetor()).addPathPatterns("/**");
}
3.3 配置前綴
前兩天剛好介紹了configurePathMatch配置方法,那我們就用起來。
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/a", clazz -> clazz.equals(FooController.class));
configurer.addPathPrefix("/b", clazz -> clazz.equals(FooV2Controller.class));
}
這里的配置直接使用控制層的類,也可以通過自定義的注解獲取比對。
3.4 測試


04 小結
這是一個有意思的技術點。真實場景一般不會通過一個Tomcat控制兩套系統(tǒng)。而多端口真正的使用場景,小編暫時還想不到。大家都會用在什么地方,一起嘮嘮!
到此這篇關于SpringBoot同時監(jiān)聽多個端口的完整方法的文章就介紹到這了,更多相關SpringBoot監(jiān)聽端口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)文件監(jiān)控器FileMonitor的實例代碼
這篇文章主要介紹了Java實現(xiàn)文件監(jiān)控器FileMonitor的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
Java設計模式之備忘錄模式_動力節(jié)點Java學院
我們在編程的時候,經(jīng)常需要保存對象的中間狀態(tài),當需要的時候,可以恢復到這個狀態(tài)。接下來通過本文給大家分享java設計模式之備忘錄模式,感興趣的的朋友一起看看吧2017-08-08
File的API和常用方法詳解_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了File的API和常用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Java8新特性stream和parallelStream區(qū)別
這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

