springboot2 部署 tomcat 踩坑之旅

一、springboot2与tomcat

由于springboot是自带tomcat启动,默认的context是/,如果日后有部署tomcat的打算,那么需要注意提前规划好context与前端的交互。
例如:

  1. springboot 服务1 端口是8901,服务2 端口是8902,但是如果为了充分利用资源,上线后在tomcat部署多个服务,那么端口都是8080。
  2. sprintboot 服务1和服务2的context都是/,那么测试阶段如果有跟前端交互那么地址也是 /,后续部署tomcat上,两个项目会冲突,默认tomcat按照目录作为context的路径,导致后端服务部署到tomcat上后,前端无法访问。
application.yml 配置样例
server:
  port: ${maven.server.port}
  servlet:
    application-display-name: web-rest
    context-path: /web-rest

部署打包,pom中build->finalName配置与context-path保持一致,这样部署至tomcat时就不需要改war的名字,否则context会跟着目录的名字走。

<build>
        <finalName>web-rest</finalName>
      ...
</build>

二、springboot2与数据库连接池

springboot默认自带的是HikariCP,评测是目前最快的数据库连接池,短小精悍,因此无需再更换数据库连接池为Druid。

三、日志配置样例

logging:
  file:   eprint-web-rest.log # 日志文件,绝对路径或相对路径
  path:   ${maven.logging.rootPath} # 保存日志文件目录路径
  config: classpath:logback-custom.xml # 日志配置文件,Spring Boot默认使用classpath路径下的日志配置文件,如:logback.xml
#  level:  # 日志级别
#    org.springframework.web: DEBUG # 配置spring web日志级别

有的时候由于文件格式问题,导致无法读取config:中的logback-custom.xml,可重新建立文件,重新敲入配置。

四、多个服务部署至tomcat时报jmx错误

spring:
  jmx:
    default-domain: web-rest

因为jmx的默认域配置会有冲突,因此每个服务增加默认域配置区分开。

五、关于springboot网关的部署

springcloud对应的网关是gateway,由于使用的是netty,不能直接部署到tomcat中,只能打包通过java -jar运行。

六、部署tomcat的相关配置

<groupId>com.eprint</groupId>
    <artifactId>web-rest</artifactId>
    <version>${web-rest}</version>
    <packaging>war</packaging>
    <dependencies>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
</dependencies>

启动类修改,继承SpringBootServletInitializer,覆盖configure方法

public class EprintRestWebApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(EprintRestWebApplication.class, args);
    }

    /**
     * tomcat启动使用该方法
     * @param builder
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 注意这里要指向原先用main方法执行的Application启动类
        return builder.sources(EprintRestWebApplication.class);
    }
}

这样既可以测试启动自带的容器,也可以打war包,部署tomcat。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容