Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring Boot中使用Tomcat启用HTTP2_Java_Spring Boot_Http_Tomcat_Http2 - Fatal编程技术网

Java 在Spring Boot中使用Tomcat启用HTTP2

Java 在Spring Boot中使用Tomcat启用HTTP2,java,spring-boot,http,tomcat,http2,Java,Spring Boot,Http,Tomcat,Http2,Tomcat 8.5是Spring Boot 1.4中的默认版本,它支持HTTP/2 如何在Spring引导应用程序中启用HTTP/2?您需要将HTTP 2升级协议添加到Tomcat的连接器中。您可以通过自定义嵌入的Tomcat容器来实现这一点: Java 8: Java 7: 下面是使用Spring引导应用程序启用HTTP/2的最优雅、性能最好的方法 首先,正如Andy Wilkinson在回答中提到的,您需要在Tomcat级别启用HTTP/2: @Bean public EmbeddedSe

Tomcat 8.5是Spring Boot 1.4中的默认版本,它支持HTTP/2


如何在Spring引导应用程序中启用HTTP/2?

您需要将HTTP 2升级协议添加到Tomcat的连接器中。您可以通过自定义嵌入的Tomcat容器来实现这一点:

Java 8: Java 7:
下面是使用Spring引导应用程序启用
HTTP/2
的最优雅、性能最好的方法

首先,正如Andy Wilkinson在回答中提到的,您需要在Tomcat级别启用HTTP/2:

@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return (container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            ((TomcatEmbeddedServletContainerFactory) container)
                    .addConnectorCustomizers((connector) -> {
                connector.addUpgradeProtocol(new Http2Protocol());
            });
        }
    };
}
如果您没有使用嵌入式Tomcat,您可以设置HTTP/2侦听,如下所示:

<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
keytool -genkey -keyalg RSA -alias my-the-best-api -keystore c:\tmp\keystore.store -storepass secret -validity 3650 -keysize 2048
编辑2019

在使用“tcp”模式时,我面临两个问题

  • 压缩不起作用,因为它依赖于http模式。所以后端必须处理它
  • 后端无法看到客户端的IP地址。也许我需要纳特。仍在调查

通常,由于haproxy代理较低级别的tcp连接,因此在Spring Boot 2.1及更高版本中无法访问任何http内容,只需将此属性添加到.properties(或.yml)文件即可:

您也可以这样通过编程实现(在一个配置类中):

@Bean
公共可配置ServletWebServerFactory tomcatCustomizer(){
TomcatServletWebServerFactory=新的TomcatServletWebServerFactory();
addConnectorCustomizers(连接器->连接器.addUpgradeProtocol(新的Http2Protocol());
返回工厂;
}

在Spring Boot 2中,您首先需要一个证书-它可以这样生成:

<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
keytool -genkey -keyalg RSA -alias my-the-best-api -keystore c:\tmp\keystore.store -storepass secret -validity 3650 -keysize 2048
然后,您只需将此证书添加到类路径,并将所需的属性添加到应用程序。属性:

server.http2.enabled=true
server.port = 8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret

SpringBoot2.2.0+默认随Tomcat9.0.x一起提供,当使用JDK9或更高版本时,Tomcat9.0.x支持HTTP/2开箱即用

除了使用https运行Tomcat,还有什么需要做的吗?(我确实通过以下问题为localhost启用了它)。但是在Chrome的网络调试器中,我看到所有的东西仍然是通过http/1.1
h2c
提供的,它将按原样工作,但没有多少(任何?)浏览器支持它。如果你想让它安全地工作(
h2
),你需要用Tomcat Native跳过一些障碍。因此,基本上你的代码示例支持没有ssl(h2c)的http2,没有浏览器支持,也可能永远不会支持它。。。所以我当然想安全地工作。你还没有“和Tomcat Native一起跳过一些障碍”吗?:-)这是一种寻求更多帮助的奇怪方式。我在这里完成了。只需补充一点,tomcat9支持HTTP2,并在server.xml文件中进行了一些配置。有没有办法不使用HAproxy?Spring boot和tomcat不能只处理加密和升级?请查看上面Alex发布的链接。我计划将其用于Spring的嵌入式tomcat,即8.5版。我想我会尝试一下,它应该支持http2嵌入的Tomcat也支持http2,ssl可以这样配置:。如果这样做,则添加connector.addUpgradeProtocol(新的Http2Protocol());我认为它应该能工作。你有关于嵌入式tomcat(8.5)支持http2的消息来源吗?我读了一些关于tomcat的文章。我还没有设置tomcat。值得注意的是,Spring Boot 2.0.x使用tomcat 8.5,因此如果使用嵌入式tomcat,您仍然需要配置
libtcnative
的路径,如中所述。Spring Boot 2.1.x将随Tomcat 9一起提供。这仅在使用JDK 9或更高版本时有效。我一直试图为运行在docker容器中的spring boot服务启用它,但它不起作用。检查这里@Avijeet Spring Boot不支持h2c,即HTTP/2协议的明文版本。所以您必须首先配置SSL。@Advicer感谢您指出这一点,我将对此进行研究。
keytool -genkey -keyalg RSA -alias my-the-best-api -keystore c:\tmp\keystore.store -storepass secret -validity 3650 -keysize 2048
server.http2.enabled=true
server.port = 8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret