Spring Cloud Gateway与WebFlux间HTTP2未启用问题排查及配置求助
问题描述
我搭建了基于Netty的响应式技术栈,Spring Cloud Gateway(SCG)和WebFlux应用均已启用HTTP2,但SCG路由到WebFlux时仍采用HTTP/1.1通信,具体配置与验证情况如下:
SCG配置
server: port: 8080 shutdown: graceful http2: enabled: true spring: cloud: gateway: routes: - id: id uri: https://localhost:8081/ predicates: - Path= ...
WebFlux配置
server: http2: enabled: true port: 8081 shutdown: graceful
验证情况
已通过curl命令确认两个应用均支持HTTP2:
curl --http2-prior-knowledge localhost:8080/~~ -v curl --http2-prior-knowledge localhost:8081/~~ -v
但WebFlux的Netty访问日志显示,SCG转发的请求使用的是HTTP/1.1:
// webflux server's netty log 2024-04-19 11:17:15,318 INFO reactor.netty.http.server.AccessLog : 127.0.0.6 - - [19/4월/2024:11:17:15 +0900] "GET /hello HTTP/1.1" 200 350 15
需解答以下问题:
- 为何SCG路由至WebFlux时未使用HTTP2
- 如何启用SCG与目标服务间的HTTP2通信
解答
1. 未使用HTTP2的原因
Spring Cloud Gateway默认不会自动启用与后端服务的HTTP2通信,即便双方都支持HTTP2,核心原因有两点:
- SCG路由URI使用
https://或http://协议头时,默认客户端配置基于HTTP/1.1,不会主动升级到HTTP2 - SCG默认的Reactor Netty HttpClient未开启HTTP2支持,因此发起的后端请求仍为HTTP/1.1
2. 启用SCG与WebFlux间HTTP2通信的配置步骤
方式一:全局启用HTTP2客户端支持
在SCG的配置文件中添加Reactor Netty HttpClient的HTTP2配置:
spring: cloud: gateway: httpclient: http2: enabled: true
方式二:针对单个路由启用HTTP2(可选)
若仅需特定路由使用HTTP2,可在路由配置中添加metadata属性:
spring: cloud: gateway: routes: - id: id uri: https://localhost:8081/ predicates: - Path= ... metadata: http2: true
额外注意事项
- 确保后端WebFlux服务已正确启用HTTP2(你的现有配置已满足要求)
- 若使用自签名证书,需配置SCG的HttpClient信任该证书,否则HTTPS通信会失败,无法建立HTTP2连接
内容的提问来源于stack exchange,提问作者hkjaaaip
相关产品推荐
相关产品推荐

