当前位置: 首页 > 知识库问答 >
问题:

微服务架构无法分配请求的地址

屠建本
2023-03-14

我们有一个微服务架构,其中来自公共(移动应用程序)的单个请求在内部导致对不同服务的4个HTTP调用。

  • 使用保持活动
  • 使用Apache HTTP池(HTTP://hc.Apache.org/httpcomponents-client-ga/httpclient/apidocs/org/Apache/HTTP/impl/conn/poolingclientconnectionmanager.html)

有什么想法吗?

共有1个答案

松锐藻
2023-03-14

您可能会耗尽可用端口的原因有几个。(为了避免混淆,我将面向用户的服务器称为“应用程序”):

  1. 如果您只有一个具有一个IP地址的应用程序实例,那么从这台机器到四个微服务中任何一个的最大连接数将被限制为短暂端口数。默认的临时端口范围因操作系统而异,但可以设置为高达65535(所有端口都可以作为强调端口使用,但这很不寻常)。
  2. 如果微服务的响应发送connection:close,或者如果应用程序不支持保留alives,则应用程序将在每次请求后关闭TCP连接。当TCP连接关闭时,关闭端进入2XMSL的TIME_WAIT(请参见RFC1122第4.2.2.13节)。默认的MSL也因操作系统而异,但通常的默认值是30s。这意味着应用程序将不能使用该端口与相同的微服务通信60s。
  3. 相反,如果微服务正在关闭连接(可能是因为应用程序正在发送connection:close),它们将进入TIME_WAIT,最终可能会导致微服务端的端口耗尽。

端口耗尽的解决方案取决于上述哪一种情况正在发生。以下是我要尝试的:

  • 在应用程序和微服务之间启用保留,并使用连接池。这将大大减少应用程序和微服务之间打开和关闭连接的数量,避免由于time_wait而导致端口耗尽。
  • 65k+单个应用程序实例和单个微服务之间的并发连接非常多。如果您达到了这个限制,您可能需要增加单个应用程序实例可以用来发出请求的IP地址的数量,可能是通过添加虚拟IP地址。您还可以添加应用程序实例,并将它们放在负载平衡器后面。
  • 您可以增加微服务可用的IP地址数,并使用DNS循环抢劫等系统来平衡IP地址之间的负载。
  • 您可以在操作系统级别调整应用程序和/或微服务的MSL,以减少time_wait中的套接字数量。不过,我不建议这样做;有潜在的负面影响,而且几乎在每一种情况下,如果这是问题的唯一解决方案,那么您的应用程序或体系结构都是错误的。

我建议首先从保留alives和连接池开始。

 类似资料:
  • 问题内容: 我想在我的应用程序中使用低端口(Spring Web上的SNMP陷阱接收器+ Tomcat7)。正如我之前在此线程将低端口绑定到Ubuntu Server上的Java程序中所告诉的那样,我收到了错误权限被拒绝。然后,我将tomcat7用户组更改为root。但是之后,我得到了java.net.BindException:无法分配请求的地址错误。对于我尝试的每个端口(低端口或高端口),我总

  • 我想在我的应用程序中使用低端口(SpringwebTomcat7上的SNMP陷阱接收器)。正如我之前在Ubuntu服务器上的这个线程Binding Low Port to Java Program中所说的,我得到了一个错误Permission denied。然后我将tomcat7用户组更改为root。但在那之后,我得到了java.net。BindException:无法分配请求的地址错误。对于我尝

  • Kubernetes 设计之初就是按照 Cloud Native 的理念设计的,Cloud Native 中有个重要概念就是微服务的架构设计,当将单体应用拆分微服务后, 随着服务数量的增多,如何微服务进行管理以保证服务的 SLA 呢?为了从架构层面上解决这个问题,解放程序员的创造性,避免繁琐的服务发现、监控、分布式追踪等事务,Service mesh 应运而生。 微服务 下图是Bilgin Ibr

  • 问题内容: 当我尝试设置套接字服务器时,出现错误消息: 整个代码是最简单的: 我100%确定端口已转发,Windows防火墙已关闭。什么都不会阻塞端口9999。还有什么会出错? 问题答案: 正如其他人指出的那样,这很可能与使用port的另一个进程有关。在Windows上,运行以下命令: 并且它应该列出任何阻塞端口的内容。当然,您必须去手动在Task Manager中杀死那些程序。如果仍然无法解决问

  • 我想发送和接收数据报套接字,但遇到了异常。我传递了要通信的服务器的正确IP地址和正确的端口号。 请帮帮我。

  • 我正在使用 GNetLib 在我的计算机上测试我的服务器。每当我使用我的网络的IP时,它都不会让我绑定。 我的主机是“76 . 5 . 43 . 21”//没有张贴我的实际IP,但你得到了要点。端口是43594,我已经用canyouseeme.org测试了连接,它显示成功。 以下是完整的错误: 问题是我使用家庭网络的IP,还是库限制了我可以使用的IP?