SpringBoot打包为JAR包或WAR 包,这两种打包方式在运行时端口将如何采用?又有什么不同?这篇文章将给你解惑

124 阅读5分钟

你们好,我是金金金。

image.png

前提

SpringBoot打包方式:不是jar就是war

场景

  • 写这篇文章也是我遇到一个很不理解的点,所以就去研究了一下

  • 场景如下: image.png

    • 这是后端生产配置文件给项目设置的端口,然后我前端写的url是:我就很纳闷,前端写了域名以及后端服务上下文路径,咋没写端口呢,这是怎么连接过去的

      image.png

排查

带个这个问题,我看了linux服务器当中配置的nginx配置文件 ,我发现是转发到8080端口,我靠这时候我更纳闷了,,咋回事,怎么是把请求转到8080端口呢?后端服务不是写的8083吗~

image.png

我真是百思不得其解,查阅了各种资料、百度,终于发现了不对劲的地方~

首先:公司项目打的是war包,我自己之前也编写过boot项目但是我自己项目打的是jar

问题就是出在这两个打包的不同方式上,还是有区别的,接着走 ~ 告诉你为什么~

解惑

这两种打包方式在运行时对端口的配置有所不同

JAR 包

  • 当您将 Spring Boot 应用程序打包为 jar 包时,应用程序是自包含的,这意味着它包含了嵌入式的 Web 服务器(默认情况下是 Tomcat)。在这种情况下,端口号是在 Spring Boot 的配置文件(通常是 application.yml 或 application.properties)中定义的 server.port 属性控制的。

  • 例如,在 application.yml 文件中:

    server:
      port: 8083
    

这将使 Spring Boot 应用程序在 8083 端口上监听。当您运行 JAR 包时,它会忽略任何外部 Tomcat 配置,因为它使用的是嵌入式的服务器实例。

WAR 包

  • 当您将 Spring Boot 应用程序打包为 war 包时,它被设计为部署在外部的 Servlet 容器中,比如 Apache Tomcat。在这种情况下,应用程序不会使用嵌入式的服务器实例,而是使用外部容器的配置。

  • 在部署 WAR 包时,以下步骤通常会发生:

    1. 将 WAR 文件放置在 Tomcat 的 webapps 目录下。
    2. Tomcat 会解压 WAR 文件并启动应用程序。
    3. 应用程序将使用 Tomcat 的 server.xml 配置文件中定义的端口,或者 Tomcat 的其他配置设置。
  • 看下 Tomcat 目录下的 cong 目录下的 server.xml 文件:注意看<Connector标签:

image.png

这将使 Tomcat(以及部署在其中的 WAR 包)在 8080 端口上监听。在这种情况下,Spring Boot 应用程序中的 server.port 配置将被忽略,因为应用程序不是以独立方式运行,而是作为外部容器中的 WAR 包运行。

总结

都知道了部署的WAR包在 8080 端口上监听,所以也就是为什么nginx配置为什么转发到8080端口了

线上环境前端发起请求(没有携带端口号会走默认端口http80 https则是443) -> nginx做好监听转发配置 -> nginx转发到8080,然后tomcat监听8080,又因为项目是war包,应用程序不会使用嵌入式的服务器实例,而是使用外部容器的配置 也就是8080 -> 后端服务收到响应,所以能正确的响应给到前端~

详细解释

  1. 线上环境前端发起请求:当前端通过 AJAX / AXIOS 或其他方式发起请求时,如果没有显式指定端口号,那么:

    • 对于 http 请求,浏览器默认会使用端口 80
    • 对于 https 请求,浏览器默认会使用端口 443
  2. Nginx 监听和转发配置Nginx 作为反向代理服务器,通常会配置在以下端口上监听:

    • 80 端口用于 HTTP 请求。
    • 443 端口用于 HTTPS 请求,这通常涉及到 SSL/TLS 证书,用于加密通信。

    Nginx 接收到请求后,会根据配置文件中的规则将请求转发到后端服务器的指定端口。Nginx 配置为将请求转发到 8080 端口。

  3. Tomcat 监听 8080:如果您的后端服务是一个部署在 Tomcat 服务器上的 WAR 包,那么 Tomcat 默认会监听 8080 端口(除非在 Tomcat 的配置文件中进行了更改)。

  4. 使用外部容器的配置:当应用程序作为 WAR 包部署在 Tomcat 或其他 Servlet 容器上时,它不会使用 Spring Boot 的嵌入式服务器实例,而是使用外部容器的服务器配置。这意味着应用程序的端口配置将取决于外部容器的配置。

  5. 后端服务响应:后端服务在 8080 端口接收到请求后,会处理请求并生成响应,然后将响应返回给 NginxNginx 再将响应转发回前端。

  • 编写有误还请大佬指正,万分感谢。