我正在用Spring Boot编写一个简单的微服务。此服务将作为具有硬并发连接限制的其他资源的代理,并且请求需要一段时间才能处理。
我想对允许我的微服务并发连接施加一个硬限制,并拒绝任何具有503或tcp/ip级别的连接。我已经尝试了不同的配置,可以为Jetty/Tomcat/Undertow,但还没有找到一些完全令人信服的东西。
我发现了一些调节线程池的设置:
- server.tomcat。max-threads=0 #工作线程的最大数量。
- server.undertow。io-threads= #为工作线程创建的I/O线程数。
- server.undertow。worker-threads= #工作线程数。
- server.jetty。acceptors= #接收线程数
- server.jetty。 选择器的线程数
但如果理解正确,这些都是配置线程池大小,只会导致连接在某种程度上排队。
这看起来真的很有趣,但这还没有被合并,并且是针对Spring Boot 1.5, https://github.com/spring-projects/spring-boot/pull/6571
我现在使用设置是不是运气不好?我当然可以执行一个过滤器,但我宁愿在较早的关卡就将其封锁,而不是重新发明轮子。我想在前面使用apache或其他东西也是一种选择,但仍然感觉有点多余。
尝试查看EmbeddedServletContainerCustomizer
这个要点可以给你一个如何做到这一点的想法。
TomcatEmbeddedServletContainerFactory factory = ...;
factory.addConnectorCustomizers(connector ->
((AbstractProtocol) connector.getProtocolHandler()).setMaxConnections(10000));