Spring Boot如何在同一端口部署两个不同Jar包的微服务
嘿,这个问题问得很接地气!答案是完全可行的,但直接把两个Jar都往80端口上绑肯定不行——毕竟同一端口同一时间只能被一个进程占用嘛。不过咱们有好几种靠谱的办法来实现你的需求,我给你梳理下最常用的几个:
可行方案梳理
1. 反向代理(最推荐,对原有服务零改动)
这是生产环境最常用的方式,比如用Nginx来做转发。步骤很简单:
- 先把两个Spring Boot服务分别启动在不同的本地端口,比如第一个绑
8080,第二个绑8081(启动的时候可以用java -jar xxx.jar --server.port=8080这种命令指定端口) - 然后配置Nginx监听80端口,根据请求的路径把流量转发到对应的服务。给你个简单的配置示例:
server { listen 80; server_name 你的服务器域名或IP; location /test { proxy_pass http://localhost:8080/test; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /test2 { proxy_pass http://localhost:8081/test2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
这样用户访问http://你的服务器/test就会转到第一个服务,访问/test2就转到第二个服务,完美实现同一端口不同路径对应不同服务。
2. 用Spring Cloud Gateway做统一网关
如果你的服务以后可能还要扩展,用Spring Cloud Gateway会更贴合Spring生态。本质上它也是一个Spring Boot服务,你可以让它监听80端口,然后配置路由规则,把不同路径的请求转发到对应的后端服务。比如在Gateway的配置文件里加:
spring: cloud: gateway: routes: - id: test-service uri: http://localhost:8080 predicates: - Path=/test/** - id: test2-service uri: http://localhost:8081 predicates: - Path=/test2/**
启动Gateway服务后,同样可以实现和Nginx一样的效果,而且如果以后要加鉴权、限流之类的功能,扩展起来更方便。
3. 部署到Servlet容器(传统方式)
如果你的Spring Boot服务可以打成war包(需要修改启动类继承SpringBootServletInitializer),那可以把两个war包放到Tomcat、Jetty这类Servlet容器的webapps目录下:
- 把第一个war包改名为
test.war,第二个改名为test2.war - 启动Tomcat并让它监听80端口,这样Tomcat会自动把
/test路径映射到第一个war包的服务,/test2映射到第二个。
不过这种方式现在用得越来越少了,毕竟Spring Boot的Jar包部署更轻便。
总结
最推荐的还是反向代理(Nginx)的方式,操作简单,对原有服务没有任何改动,而且性能稳定。如果是Spring生态的项目,用Gateway也是不错的选择,扩展性更强。
内容的提问来源于stack exchange,提问作者Luís Palma
相关产品推荐
相关产品推荐

