目录
- 01 引言
- 02 场景假设
- 03 问题解决
- 3.1 开发多接口
- 3.2 端口分配
- 3.3 配置php前缀
- 3.4 测试
- 04 小结
01 引言
平时开发中常见的是一个Tomcat一个端口被访问。从来没有考虑过一个接口可以通过多个端口同时访问。
直到前两天看到一个帖子说,SpringBoot同时监听多个端口。于是自己玩了一下,感觉蛮有意思的,就整理一下分享给大家。

02 场景假设
假设有一套系统运行平稳,得到合作商的青睐,想要有一套一模一样的系统。领导要求重新部署一js套,但是为了节省经费,领导不提供多余php的服务器,希望能够在原来的服务器的基础上技能让自己用,也能让合作商使用。
# 自己使用 curl http://localhost:8081/a/api/foo # 合作商使用 curl http://localhost:8082/b/api/foo
这样的情况下,聪明的你想到了同一个Tomcat开放两个端口,一个给自己用,一个给合作商用。
03 问题解决
3.1 开发多接口
我们先不管端口的分配,我们先看看能不能开方多个接口。当然可以。
我们需要配置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 FoozrvXzController {
@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
上面的三种方式都可以访问。这就实现了一个接口三个端口都可以访问的效果。
3.2 端口分配
为了实现不同接口的资源隔离。我们将代码复制了一份,为了方便演示,修改了一点提示语。

假设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.equalphps(FooV2Controller.class));
}
这里的配置直接使用控制层的类,也可以通过自定义的注解获取比对。
3.4 测试


04 小结
这是一个有意思的技术点。真实场景一般不会通过一个Tomcat控制两套系统。而多端口真正的使用场景,小编暂时还想不到。大家都会用在什么地方,一起唠唠!
到此这篇关于SpringBoot同时监听多个端口的完整方法的文章就介绍到这了,更多相关SpringBoot监听端口内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论