Spring Cloud Gateway:流程澄清

时间:2019-11-13 11:37:53

标签: spring-cloud spring-cloud-gateway reactor-netty

我正在使用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

由此看来-

  1. 下游花费了大约200毫秒
  2. 春季云网关占用的剩余时间,即455-200〜255 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分析中我看不到任何内存问题。

关于如何优化网关性能的任何建议?

1 个答案:

答案 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会而且永远都是不好的原因。