springboot(21)容器整合

时间:2022-05-30
本文章向大家介绍springboot(21)容器整合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

SpringBoot可以嵌入容器从而更好实现微服务,默认支持Tomcat和Jetty的嵌入,只需要在POM文件中导入相应的依赖即可。在有些场景下,我们需要将服务发布到项目早已搭建好的WEB容器中。常见的WEB容器有:

Tomcat
Jetty
Jboss
Weblogic
内嵌容器

SpringBoot默认内嵌的容器是Tomcat,当在POM文件中引入spring-boot-starter-web时,会间接引入Tomcat内嵌容器依赖。

spring-boot-starter-web依赖关系 如果要替换成Jetty,则需要在pom.xml引入jetty的包,同时去除tomcat的依赖

<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>

另外还要在配置类中配置Jetty容器的管理Bean

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    JettyEmbeddedServletContainerFactory factory =
            new JettyEmbeddedServletContainerFactory();
    return factory;
}

外部容器 如果想要在WEB容器(这里以Tomcat作为说明,其他容器类似)中运行,项目的打包类型要为war,同时配置一个maven的war打包插件。

<build>
    <plugins>
        <!-- war打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <warName>springboot</warName>
            </configuration>
        </plugin>
    </plugins>
</build>

我们知道war工程中需要包含web.xml文件,SpringBoot也不例外

另外还需要让我们工程的启动类继承SpringBootServletInitializer并重写configure方法,如果不这样做,则项目发布到Tomcat容器中将不会起作用。

@SpringBootApplication
public class StartSpringBootMain extends SpringBootServletInitializer{
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(StartSpringBootMain.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(StartSpringBootMain.class,args);
    }
}

最后执行clean package命令进行打包,将打好的war包放入Tomcat容器中即可。

加入HTTPS 我们通过启用Tomcat中的Https协议来为应用提供https,从而为容器中所有应用提供HTTPS协议。

首先通过Java自带的工具keytool生成证书,在cmd中执行以下指令(生产上证书要向专业的CA机构申请购买)

keytool -genkey -alias mykey -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -storepass 123456

该指令会在当前用户的目录下生成keystore.p12文件,将该文件拷贝到D盘根路径下。

修改Tomcat的server.xml文件

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
keystoreFile="D:/keystore.p12" keystorePass="123456"/>

上面的配置默认是关闭的,只要打开即可。同时keystoreFile="D:/keystore.p12" keystorePass="123456"是新增的,依据步骤1的执行传值。 最后启动Tomcat,容器就为我们开启Https协议。

实现HTTP自动跳转到HTTPS。一般用户输入url时不会带上协议,此时默认走的是HTTP协议,因此我们要实现访问http时能自动跳转到https,要实现这个功能只需要在配置类中加入如下配置。

@Configuration
public class HttpConnectorConfig { // 此类专门负责HTTP的连接的相关配置
    public Connector initConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http"); // 如果现在用户使用普通的http的方式进行访问
        connector.setPort(8080); // 用户访问的是8080端口
        connector.setSecure(false); // 如果该连接为跳转则表示不是一个新的连接对象
        connector.setRedirectPort(8443); // 设置转发操作端口
        return connector;
    }
    @Bean
    public TomcatEmbeddedServletContainerFactory servletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
            @Override
            protected void postProcessContext(
                    org.apache.catalina.Context context) {// 该方法主要进行请求处理的上下文配置
                SecurityConstraint securityConstraint = new SecurityConstraint(); // 定义新的安全访问策略
                securityConstraint.setUserConstraint("CONFIDENTIAL"); // 定义用户的访问约束要求
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*"); // 匹配所有的访问映射路径
                securityConstraint.addCollection(collection); // 追加路径映射访问配置
                context.addConstraint(securityConstraint);
            }
            ;
        };
        factory.addAdditionalTomcatConnectors(this.initConnector());
        return factory;
    }
}