Spring Boot中的容器(服务器)的基本配置

导读:本篇文章讲解 Spring Boot中的容器(服务器)的基本配置,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 指定容器

Spring Boot项目当我们添加了web依赖后,项目会内嵌有一个Tomcat(自动添加Tomcat依赖)。Spring Boot 2.2.4版本依赖的是tomcat9.0.30
在这里插入图片描述
我们可以在application.properties中配置容器的相关属性,例如:

#修改服务器端口号
server.port=8082
#修改项目的上下文路径
server.servlet.context-path=/test
#配置Tomcat URL编码
server.tomcat.uri-encoding=UTF-8

可以查看项目启动参数检查是否配置成功

在这里插入图片描述
当我们需要更改容器时,则在pom.xml中去除spring-boot-starter-web中的Tomcat依赖,并添加依赖即可。这里以添加jetty为例
在这里插入图片描述
再次启动项目,可以看到配置成功
在这里插入图片描述

2. 配置容器的端口

#指定容器端口号
server.port=8080
#不开放端口
#server.port=-1
#随机端口
#server.port=0

查看随机分配的端口,我们可以创建监听器监听Spring Boot的初始化事件,获取容器的端口。

@Component
public class MyApplicationListener implements ApplicationListener<WebServerInitializedEvent> {
    @Override
    public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
        System.out.println("Server Port:"+webServerInitializedEvent.getWebServer().getPort());
    }
}

3. 设置HTTP响应Gzip压缩

3.1 Gzip介绍

  1. HTTP 协议支持GZIP 压缩机制,也称协议压缩。 HTTP GZIP压缩是由WEB服务器和浏览器共同遵守的协议,也就是说WEB服务器和浏览器都必须遵守。目前主流的服务器和浏览器都支持GZIP压缩技术。包括 Chrome、IE、FireFox、Opera 等;服务器有 tomcat、Apache 和 IIS 等。

  2. GZIP 主要用来压缩html,css,javascript,等静态文本文件,也支持对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩。

  3. GZIP 压缩的比率通常在3~10 倍之间,这样可以大大节省服务器的网络带宽,大大提升浏览器的浏览速度。

  4. GZIP 是一种数据压缩格式,默认且目前仅使用deflate算法压缩data部分;deflate是一种压缩算法,是huffman编码的一种加强。

  5. 协议压缩就是依据HTTP协议进行压缩,不需要程序员进行压缩,解压编码,而是把压缩过程交给WEB服务器,将解压过程交给客户端。 如果客户端为支持GZIP压缩的浏览器,那么解压过程也不需要程序员参与,浏览器会按照一定的规则自动进行解压缩;如果客户端为HttpClient ,那么就需要手动进行GZIP解码了。

  6. 压缩过程:客户端发送http请求,如果请求头header中携带Accept-Encoding: gzip,deflate (现在的浏览器一般默认都是这样),那么浏览器的意思是:服务器需要进行GZIP压缩,再看响应内容的类型是否满足服务器配置的需要压缩的类型,如果符合,那么WEB服务器在传输响应内容之前,会对响应内容进行压缩,并在响应头中添加Content-Encoding gzip;如果不符合,那么将不压缩,直接返回。

  7. 解压过程:(浏览器)客户端接收到响应,如果响应头中包含Content-Encoding GZIP,那么浏览器会自动将响应内容进行GZIP解压缩,然后再呈现在页面上。如果不包含,那么将直接呈现在页面上。

  8. GZIP的缺点。相对于没有进行GZIP的工程来说,使用GZIP要增加服务器压缩的压力(cpu消耗)、客户端解压缩的压力,故而对服务器的配置需求更高。另外压缩也要耗费时间,想占用更小的空间,得到高压缩比率,肯定要牺牲较长的时间;反之,如果时间较为宝贵,要求快速,那么所得的压缩比率一定较小,当然会占用更大的空间了(压缩比率=原内容大小/压缩后大小,压缩比率越大,则表明压缩后占用空间的压缩包越小),这就是物理空间与时间的矛盾。

在这里插入图片描述

在这里插入图片描述

片段转自:https://www.cnblogs.com/DDgougou/p/8675504.html

3.2 Spring Boot配置Gzip

在实际项目开发过程为,如果由于服务端响应数据量较大,导致客户端下载响应数据的耗时较长,可以考虑开启Tomcat的gzip功能,对响应数据进行压缩。

开启gzip功能后,通过http请求header增加一个“Accept-Encoding:gzip”指令来告知服务器需要进行gzip压缩(当前浏览器都默认带有),而服务器接收到并处理完该请求后,通过新增加响应头“Content-Encoding:gzip”来告知客户端进行gzip解压。

对于js、css、html三种常用的类型,压缩率比较可观可以大幅度提升网络的传输速度。当然使用gzip要增加服务器压缩的压力、客户端解压缩的压力。

在Spring Boot项目中可以在application.properties文件中进行配置:

#开启压缩
server.compression.enabled=true
#设置进行响应压缩的阈值,默认2KB
server.compression.min-response-size=2KB
#设置进行压缩的响应类型,具体要压缩的类型可以在浏览器的响应头Content-Type查看
#默认:"text/html", "text/xml", "text/plain", "text/css", "text/javascript", "application/javascript", "application/json", "application/xml"
server.compression.mime-types=*/*

创建一个响应结果大小比较大的接口,浏览器访问查看:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/test")
    public List<String> getAllUsersForTest(){
        ArrayList<String> users = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            users.add("张三"+i);
        }
        return users;
    }
}

没有开启响应压缩,请求响应结果:
在这里插入图片描述
开启响应压缩后,请求响应结果:
在这里插入图片描述
可以看到同样的结果,浏览器获得的数据大小从大约12KB降到了2KB,所以通过减少HTTP响应大小可以显著减少响应时间,提高Web容器的性能。

3.3 检查配置是否成功

去检测网站:http://seo.chinaz.com/?host=iitshare.com 查询下效果

在这里插入图片描述

4. Tomcat日志配置

Spring Boot项目中关于Tomcat常用的日志配置如下所示:

#开启访问日志,默认的日志位置在项目运行的临时目录中,默认的生成的日志的命令格式:access_log.2021-01-01.log
server.tomcat.accesslog.enabled=true
#Tomcat访问日志的保存目录
server.tomcat.basedir=tomcat-log
#生成日志文件名的前缀,默认是access_log
server.tomcat.accesslog.prefix=test_access_log
#生成日志文件名的后缀,默认是.log
server.tomcat.accesslog.suffix=.log
#日志文件名中的日期格式,默认是.yyyy-MM-dd
server.tomcat.accesslog.file-date-format=.yyyyMMdd
#生成的日志文件内容格式
#%h  请求客户端的ip
#%l 用户的身份
#%u 用户名
#%t 请求时间
#%r 请求地址
#%s 响应的状态码
#%b 响应的大小
server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b

#服务器内部日志开启
logging.level.org.apache.tomcat=debug
logging.level.org.apache.catalina=debug

启动项目查看控制台的日志,可以看到服务器内部日志:

在这里插入图片描述
浏览器请求接口/users/test,可以看到生成了日志文件:
在这里插入图片描述
查看日志内容:

在这里插入图片描述

5. Tomcat配置HTTPS证书

5.1 HTTPS介绍

超文本传输安全协议(HyperText Transfer Protocol Secure),缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。

企业开发的实际生产环境一般在Nginx中配置HTTPS证书。但我们个人练习时也可以很方便得在Spring Boot项目中配置HTTPS证书。

5.2 生成HTTPS证书

我们可以从各个云服务厂商处申请一个免费的HTTPS证书,或者直接借助 Java 自带的 JDK 管理工具 keytool 来生成一个免费的 HTTPS证书。

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:\https_test.p12 -validity 365

命令说明:

  • genkey 表示要创建一个新的密钥。
  • alias 表示 keystore 的别名。
  • keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。
  • keysize 表示密钥的长度。
  • keystore 表示生成的密钥存放位置。
  • validity 表示密钥的有效时间,单位为天。
    在这里插入图片描述
    命令执行完成后 ,我们在 D 盘目录下会看到一个名为 https_test.p12 的文件。

5.3 配置HTTPS证书

将上面生成的 https_test.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:

#配置https
#密钥文件名
server.ssl.key-store=classpath:https_test.p12
#密钥别名
server.ssl.key-alias=tomcathttps
#密钥口令
server.ssl.key-store-password=123456

配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误:
在这里插入图片描述
改用 https 来访问 ,因为我们自己生成的 https 证书不被浏览器认可,我们直接点击高级按钮选择继续访问就可以了。
在这里插入图片描述
因为Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,我们需要配置请求转发,当用户发起 HTTP 请求时,自动转发到 HTTPS 上。以Tomcat容器为例:

@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }
    private Connector createTomcatConnector() {
        Connector connector = new
                Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
}

这个配置类配置了HTTP 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8080 这个 HTTPS 的端口上。

重启项目后浏览器请求,使用http://localhost:8081/users/test就会重定向到https://localhost:8080/users/test

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/44387.html

(0)

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!