Spring Boot是一个简化的 Spring 开发框架。基于约定大于配置的原则,融合微服务架构的理念,简化独立的产品级应用开发过程,是 Java 微服务架构优选的技术支撑。
使用 Spring Boot 开发 JavaEE 工程,可以集成嵌入式的 Web 容器(如:Tomcat、Jetty、Undertow 等)进行发布,不再依赖特定的 Web 服务器实现独立运行,非常适用于微服务应用的安装部署。
独立的 Web 服务器部署程序,需要将程序放到指定的位置和修改服务器配置文件才能完成,且不同的 Web 容器配置方法大相径庭。而微服务架构的应用具有部署程序数量多、部署位置分布散的特征,因此部署难度非常大,运维成本非常高。
嵌入式 Web 容器与微服务程序打包在一起部署,只负责单个微服务程序的发布工作,相互独立、互不干扰,因此每个微服务可以选用不同的 Web 容器(只要是 Spring Boot 支持的嵌入式 Web 容器),而 Spring Boot 基于约定大于配置的原则,使得各种 Web 容器的配置几乎相似,有效的降低部署成和管理成本。
但是需要注意的是:由于嵌入式 Web 容器只负责打包程序本身的发布工作,不具备宏观管理特征(如:在一台服务器上,所有微服务程序使用的端口号、虚拟路径没有提供清单),盲目部署会产生网络资源冲突等问题。因此需要建立相应的管理制度和方案。
本方案基于 Ecplise 、Maven、 Spring Boot 2.2.6 设计。
基于Maven 配置 Spring Boot 嵌入式 Web 容器,主要包括三个步骤:
第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。
第二步,设置 Web 容器配置参数。
第三步,编写 Web 容器配置程序。
以上三个步骤中,只要完成第一步即可按照默认配置运行 Web 容器;第二步用于个性化配置(如:端口号、虚拟目录等),较为常用;第三步用于特殊的处理,特定场景中使用。
1. Tomcat(Spring Boot 默认集成的标准 Web 容器)
第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。
Spring Boot 默认集成了 Tomcat,因此只要在 POM 文件中引用 Spring Boot 框架即可。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
启动程序时,Tomcat 会通过 8080 端口发布程序。
第二步,设置 Web 容器配置参数。
编写 Web 容器配置文件 "application.properties"。常用参数如下:
# 监听端口号。默认为 8080。
server.port=8081
# 请求出错时跳转的位置。
server.error.path=/error
# session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
server.servlet.session.timeout=30m
# 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
server.servlet.context-path=/webname
# 请求编码。
server.tomcat.uri-encoding=utf-8
# 最大线程数。
server.tomcat.max-threads=500
# 运行日志和临时文件的目录。默认为系统临时目录。
server.tomcat.basedir=/home/webname/tmp
# -------------------- HTTPS --------------------
# 开启单向认证(服务器认证)
server.ssl.enabled = true
server.ssl.protocol = TLS
server.ssl.key-store=classpath:server.keystore
server.ssl.key-store-type=JKS
server.ssl.key-store-password=password
server.ssl.key-alias=https_server
# 开启双向认证(客户端与服务端互相校验)
server.ssl.client-auth=need
server.ssl.trust-store=classpath:ca.truststore
server.ssl.trust-store-password=password
server.ssl.trust-store-type=JKS
server.ssl.trust-store-provider=SUN
启动程序时,Tomcat 会通过配置参数发布程序。
有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。
第三步,编写 Web 容器配置程序。
在项目中创建配置类文件(TomcatConfig.java):
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatConfig{
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
return tomcat;
}
}
2. Jetty(适合长连接场景)
第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。
在 POM 文件中引用 Spring Boot 框架,排除默认的 Tomcat ,并引用 Jetty。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
启动程序时,Jetty 会通过 8080 端口发布程序。
第二步,设置 Web 容器配置参数。
编写 Web 容器配置文件 "application.properties"。常用参数如下:
# 监听端口号。默认为 8080。
server.port=8081
# 请求出错时跳转的位置。
server.error.path=/error
# session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
server.servlet.session.timeout=30m
# 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
server.servlet.context-path=/webname
# acceptor 线程数,建议 1-2 个。
server.jetty.acceptors=2
# selector 线程数,建议 2-4 个。
server.jetty.selectors=4
# PUT 或 POST 最大字节数,0 表示不限制。
server.jetty.max-http-post-size=0
# -------------------- HTTPS --------------------
# 开启单向认证(服务器认证)
server.ssl.enabled = true
server.ssl.protocol = TLS
server.ssl.key-store=classpath:server.keystore
server.ssl.key-store-type=JKS
server.ssl.key-store-password=password
server.ssl.key-alias=https_server
# 开启双向认证(客户端与服务端互相校验)
server.ssl.client-auth=need
server.ssl.trust-store=classpath:ca.truststore
server.ssl.trust-store-password=password
server.ssl.trust-store-type=JKS
server.ssl.trust-store-provider=SUN
启动程序时,Jetty 会通过配置参数发布程序。
有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。
第三步,编写 Web 容器配置程序。
在项目中创建配置类文件(JettyConfig.java):
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JettyConfig {
@Bean
public ServletWebServerFactory servletContainer() {
JettyServletWebServerFactory jetty = new JettyServletWebServerFactory();
return jetty;
}
}
3. Undertow(适合高并发场景)
第一步,设置 POM 文件声明 Spring Boot 和 Web 容器的引用。
在 POM 文件中引用 Spring Boot 框架,排除默认的 Tomcat ,并引用 Undertow。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
启动程序时,Undertow 会通过 8080 端口发布程序。
第二步,设置 Web 容器配置参数。
编写 Web 容器配置文件 "application.properties"。常用参数如下:
# 监听端口号。默认为 8080。
server.port=8081
# 请求出错时跳转的位置。
server.error.path=/error
# session 失效时间。30m 表示 30 分钟,如果不写单位则默认单位是秒。(注意:由于 Tomcat 中配置 session 过期时间是以分钟为单位,如果我们这里设置是秒的话,那么会自动转换为一个不超过所配置秒数的最大分钟数。比如配置了 119 秒,那么实际 session 过期时间是 1 分钟)。
server.servlet.session.timeout=30m
# 虚拟目录(默认为 /)。如果配置了虚拟目录,那么在访问路径中要加上配置的路径。
server.servlet.context-path=/webname
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
# 不要设置过大,如果过大,启动项目会报错:打开文件数过多
server.undertow.io-threads=16
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程
# 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.worker-threads=256
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
# 每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
server.undertow.buffer-size=1024
# 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
server.undertow.buffers-per-region=1024
# 是否分配的直接内存(NIO直接分配的堆外内存)
server.undertow.direct-buffers=true
# -------------------- HTTPS --------------------
# 开启单向认证(服务器认证)
server.ssl.enabled = true
server.ssl.protocol = TLS
server.ssl.key-store=classpath:server.keystore
server.ssl.key-store-type=JKS
server.ssl.key-store-password=password
server.ssl.key-alias=https_server
# 开启双向认证(客户端与服务端互相校验)
server.ssl.client-auth=need
server.ssl.trust-store=classpath:ca.truststore
server.ssl.trust-store-password=password
server.ssl.trust-store-type=JKS
server.ssl.trust-store-provider=SUN
启动程序时,Undertow 会通过配置参数发布程序。
有关如何制作 SSL 证书,请阅读文章《RedHat/CentOS8【OpenSSL】制作自签名 CA 证书和 HTTPS 配置》,文章地址【https://www.jianshu.com/p/5b3dfe4bb12e】。
第三步,编写 Web 容器配置程序。
在项目中创建配置类文件(UndertowConfig.java):
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UndertowConfig {
@Bean
public ServletWebServerFactory servletContainer() {
UndertowServletWebServerFactory undertow = new UndertowServletWebServerFactory();
return undertow;
}
}
网友评论