SpringBoot-2-嵌入式容器

简介: SpringBoot-2-嵌入式容器

SpringBoot—嵌入式容器

SpringBoot支持嵌入式容器(比如:Apache Tomcat, Eclipse Jetty, RedHat Undertow),默认情况下使用tomcat.



1.修改Tomcat版本

SpringBoot 2.6.3版本默认采用的是*Apache Tomcat/9.0.56版本



日志显示:

INFO 25080 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]



修改了pom.xml

<properties>
    <tomcat.version>9.0.58</tomcat.version>
</properties>


后重新运行

INFO 3840 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.58]


2.修改端口号和web路径

2.1 通过配置文件修改端口号和web路径

2.1.1 application.properties和application.yml的异同


在我们创建SpringBoot项目的时候,会在/main/resources/文件夹下新建application.properties配置文件,但是我们经常会把 application.properties修改成application.yml文件,这两种格式存在区别如下:



格式区别:


properties配置文件通过**=**进行赋值,没有层次感


yml配置文件通过key:value分层进行赋值,比较有层次感


执行顺序区别:


如果properties配置文件和yml配置文件同时存在,yml配置会先加载并且后加载的properties文件会覆盖yml配置文件示例

application.properties配置文件:

server.port=8889


application.yml配置文件

server:
  port: 8899
  servlet:
    context-path: /springweb


两个文件并存情况下,运行项目结果:

INFO 968 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8889 (http) with context path '/springweb'


访问页面http://localhost:8889/springweb/


0253a9d7e6514472c7918ff296759f99.png


配置相同的情况下application.properties覆盖application.yml

2.1.2通过WebServerFactoryCustomizer进行修改



在SpringBoot1.x的时候使用的是EmbeddedServletContainerCustomizer到SpringBoot2.x后WebServerFactoryCustomizer替代了EmbeddedServletContainerCustomizer。


SpringBoot1.x EmbeddedServletContainerCustomizer

    @Bean
    public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                //设置端口
                container.setPort(8883);
                container.setContextPath("/springweb");
            }
        };
    }


SpringBoot2.x  WebServerFactoryCustomizer

package com.learn.springboot.springbootpart2.config;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @program: spring-boot-part2
 * @package: com.learn.springboot.springbootpart2.config
 * @classname: PortConfig
 * @description: 端口和web修改
 * @author: zbb
 */
@Configuration
public class PortConfig {
    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer(){
        return  new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
            @Override
            public void customize(ConfigurableServletWebServerFactory factory) {
                //设置web路径
                factory.setContextPath("/webpath");
                //设置端口
                factory.setPort(8888);
            }
        };
    }
}

运行结果为

2.1.3 通过WebServerFactoryCustomizer进行修改


**SpringBoot1.x EmbeddedServletContainerFactory **

  @Bean  
    public EmbeddedServletContainerFactory servletContainer() {  
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();  
        tomcat.setPort(8879);  
        tomcat.setContextPath("/webserver");  
        return tomcat;  
    }  



SpringBoot2.X  ServletWebServerFactory

    @Bean
    public ServletWebServerFactory  servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() ;
        tomcat.setPort(8879);
        tomcat.setContextPath("/webserver");
        return tomcat;
    }


2.2 通过ServletWebServerFactory类优化Tomcat

**SpringBoot1.x EmbeddedServletContainerFactory **

@Bean  
public EmbeddedServletContainerFactory servletContainer() {  
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {  
        @Override  
        protected void postProcessContext(Context context) {  
           // ...  
        }  
    };   
    return tomcat;  
}  


SpringBoot2.X  ServletWebServerFactory

 @Bean
    public ServletWebServerFactory  servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                // ...  
            }
        };
        //tomcat.setPort(8879);
        //tomcat.setContextPath("/webserver");
        return tomcat;
    }


2.2.1开启HTTPS

SpringBoot默认端口是8080的HTTP服务,通过配置可以开启HTTPS服务在application.yml文件中配置

server:
  port: 8843
  servlet:
    context-path: /springweb
  ssl:
    key-store: tomcat.keystore
    key-store-password: password
    key-store-type: JKS
    key-alias: tomcat


tomcat.keystore生成步骤:

1):打开cmd输入命令

keytool -genkey -alias tomcat -keyalg RSA -keystore D:\software\file\java\myfirst\tomcat.keystore



09e1285bc9d68d751acdcf5a09be559b.png


2)将tomcat.keystore放到**/spring-boot-part2**文件夹下

运行结果为:

SpringBoot不支持通过application.yml同时支持HTTP和HTTPS


可以在application.yml设置HTTPS,HTTP在代码中添加来实现。

@Configuration
public class PortConfig {
    @Bean
    public ServletWebServerFactory  servletContainer() {
        TomcatServletWebServerFactory tomcat = 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);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector());
        return tomcat;
    }
    @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8888);
        connector.setURIEncoding("UTF-8");
        connector.setMaxPostSize(8192);
        connector.setSecure(false);
        connector.setRedirectPort(8843);
        return connector;
    }
}



这个时候访问http://localhost:8888/springweb就可以自动转到https://localhost:8843/springweb

2.3 SpringBoot的容器变更

  • 修改pom.xml
 <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>


  • config配置文件
@Bean
    public ServletWebServerFactory  jettyservletContainer() {
        JettyServletWebServerFactory container = new JettyServletWebServerFactory();
        container.setPort(8081);
        // Context Path
        container.setContextPath("/jettboot");
        return container;
    }


log日志显示:

 INFO 4560 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer  : Jetty started on port(s) 8081 (http/1.1) with context path '/jettboot'



运行http://localhost:8081/jettboot/

目录
相关文章
|
6天前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
|
6天前
|
Java Maven Docker
【SpringBoot系列】SpringBoot应用程序容器化及容器优化
【4月更文挑战第4天】SpringBoot应用程序容器化及容器大小优化
27 0
|
6天前
|
Java 应用服务中间件 API
【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲
53 0
|
6天前
|
存储 前端开发 Java
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
springboot中的第二个IOC容器BootstrapContext
|
6天前
|
Java 关系型数据库 MySQL
docker 部署springboot项目,连接mysql容器
docker 部署springboot项目,连接mysql容器
133 0
|
6天前
|
Java Maven Docker
SpringBoot项目打包部署到阿里云服务器、通过Maven插件制作Docker镜像、部署项目容器、配置生产环境
SpringBoot项目打包部署到阿里云服务器、通过Maven插件制作Docker镜像、部署项目容器、配置生产环境
198 0
|
6天前
|
Java 应用服务中间件 容器
SpringBoot 各种 Web 容器服开启 AccessLog 日志
SpringBoot 各种 Web 容器服开启 AccessLog 日志
44 0
|
6天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第20天】 在微服务架构日益普及的今天,Docker作为其重要的实现技术之一,承载着大量应用的运行。然而,随之而来的是对于容器健康状态、资源使用情况以及性能指标的监控需求急剧增加。本文旨在探讨构建一个高效且稳定的Docker容器监控体系,不仅涵盖了监控工具的选择与配置,还详细阐述了监控数据的分析与处理流程。通过精心设计的监控策略和实时响应机制,我们能够确保系统的稳定性,并及时发现及处理潜在的问题。
|
4天前
|
Java 虚拟化 Docker
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别

热门文章

最新文章