这是一篇正在学习中的文章,根据我的学习来不断更新
事情开始于一个问题,close wait
最近我们的服务器出现了大量的 close wait,作为一个从未接触过java的新员工学习这个问题的路径
由问题已知 close wait 是由于 tcp连接时一方发送了fine 但是另一方没发送(或者说超时没有自动关闭socket)
这个问题通常发生在会超时的请求上,那我本能的现在代码里找超时写在什么地方
- HttpClient发送Http请求(HttpClient 发送请求的写法)
- @postmapping 等 Spring 框架,可以在 server 配置中写 timeout
@postmapping 等如果不是自己在函数中创建了 socket 也不需要自己close
Tomcat 会统一管理
问题一:Tomcat 是啥
Dubbo、Zookeeper、Servlet、Tomcat 之间的关系
bash
+------------+ HTTP/TCP +-------------+
| Web 客户端 | ---------> | 负载均衡器 |
+------------+ +-------------+
/ \
/ \
V V
+----------------+ +--------------+
| Tomcat Server 1 | | Tomcat Server 2 |
| - Servlet API | | - Servlet API |
| - Dubbo 消费者 | | - Dubbo 消费者 |
+----------------+ +--------------+
\ /
\ /
V V
+---------------+
| Zookeeper |
| - 注册中心 |
| - 存储提供者信息 |
+---------------+
^ ^
| |
(注册) (发现)
| |
+---------+ +---------+
| Dubbo 提供者1 | | Dubbo 提供者N |
+-----------------+ +-----------------+
Web 客户端通过HTTP或TCP请求访问服务。
负载均衡器根据策略将请求分发到不同的Tomcat服务器上。
Tomcat Server托管了基于Servlet API构建的Web应用,并在其中包含Dubbo消费者组件来调用远程服务。
Servlet是Java EE规范中的接口,用于处理Web请求和响应,在这里作为Dubbo与Web应用交互的桥梁。
Dubbo消费者在运行于Tomcat容器的Web应用中调用远程服务,它通过Zookeeper获取服务提供者的地址信息。
Dubbo提供者将自己的服务注册到Zookeeper,以便消费者能发现并调用它们的服务。
Zookeeper作为Dubbo框架的服务注册中心,存储和管理所有可用服务提供者的元数据信息。
查看 Tomcat 版本方法:点击跳转