我正在使用Spring Cloud Gateway Hoxton.M1版本来实现API网关。我可以看到以下格式的日志-
[2019-11-13 18:33:09,432] [448877242] [reactor-http-epoll-5] [DEBUG] [r.n.r.PooledConnectionProvider] - [id: 0xfc0b1eb2, L:/x.x.x.x:42538 - R:xxxx4076.x.x.com/x.x.x.x:5001] Channel connected, now 1 active connections and 0 inactive connections
[2019-11-13 18:33:09,679] [448877489] [reactor-http-epoll-5] [DEBUG] [r.n.r.PooledConnectionProvider] - [id: 0xfc0b1eb2, L:/x.x.x.x:42538 - R:xxxx4076.x.x.com/x.x.x.x:5001] onStateChange(POST{uri=/gateway/api/public/process, connection=PooledConnection{channel=[id: 0xfc0b1eb2, L:/x.x.x.x:42538 - R:xxxxx4076.x.x.com/x.x.x.x:5001]}}, [request_sent])
[2019-11-13 18:33:09,880] [448877690] [reactor-http-epoll-5] [DEBUG] [r.n.r.PooledConnectionProvider] - [id: 0xfc0b1eb2, L:/x.x.x.x:42538 - R:xxxx4076.x.x.com/x.x.x.x:5001] onStateChange(POST{uri=/gateway/api/public/process, connection=PooledConnection{channel=[id: 0xfc0b1eb2, L:/x.x.x.x:42538 - R:x.x.x.com/x.x.x.x:5001]}}, [response_received])
在访问日志中,我也可以在下面看到-
x.x.x.x - - [13/Nov/2019:18:33:09 +0800] "POST /x/x/x HTTP/1.1" 200 14895 5556 455 ms
由此看来-
没有配置全局过滤器。 此外,路由仅使用重写路径并添加请求标头过滤器。以下是路线。它还使用redis速率限制功能。
- id: xxxx
uri: http://xxxxx.xxx.xxx.com:5001
predicates:
- Path=/x/x/x
- Method=POST
filters:
- RewritePath=/x/x/x,/gateway/api/public/process
- AddRequestHeader=xxxxx,yyyyy
- AddRequestHeader=appid,zzzzz
- SecureHeaders
- name: RequestRateLimiter
args:
key-resolver: "#{@userRemoteAddressResolver}"
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
当下游仅花费200毫秒时,Spring Cloud Gateway花费的255毫秒看起来有点高。
我已经为网关应用程序提供了足够的堆内存,并且在gc分析中我看不到任何内存问题。
关于如何优化网关性能的任何建议?
答案 0 :(得分:0)
老实说,我也遇到了同样的问题,与您试图改善现成的网关的可怕性能一样。我建议要做的第一件事是在pom或gradle文件中包含Blockhound代理依赖项。
这是我的gradle依赖项compile group: 'io.projectreactor.tools', name: 'blockhound', version: '1.0.2.RELEASE'
。
然后,在Spring Boot应用程序的主程序中,您只需调用Blockhound.install()
即可。这样可以监视网关中任何地方的阻止代码。
接下来要添加的是jvm选项-Dreactor.netty.ioWorkerCount=50
。这迫使netty使用的事件循环线程数超过默认数目。空闲时间的其他选项也可以更改。
不过,我认为这些更改无效。我认为Spring Gateway在事件循环线程上增加了很多过滤器工作量,这就是为什么perf会而且永远都是不好的原因。