微服务中的线程和进程
2025-3-17
| 2025-3-17
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
 

微服务架构中的进程和线程

 
我理解这些概念可能有点抽象,让我用更简单的方式来解释微服务架构中的进程和线程。

简单类比理解进程与线程

想象一个购物中心(服务器)里有多个独立的专卖店(微服务)。每个专卖店是一个独立的进程,有自己的空间和资源:
  • 进程 = 专卖店:独立经营,有自己的库存、收银系统和员工
  • 线程 = 专卖店员工:一个专卖店有多名员工同时工作,共享店铺资源

微服务架构中的进程

在微服务架构(如Spring Cloud)中:
  1. 每个微服务是一个独立的进程
      • 每个微服务运行在自己的JVM(Java虚拟机)实例中
      • 它们有独立的内存空间,互不干扰
      • 一个微服务崩溃不会影响其他微服务
  1. 微服务独立部署
      • 每个微服务可以独立更新、重启
      • 可以部署在同一台服务器上,也可以分布在不同服务器上

微服务内部的线程

在一个微服务进程内部:
  1. 多个线程并行工作
      • 处理HTTP请求的线程
      • 数据库访问线程
      • 后台任务线程
  1. 线程池管理
      • Spring Boot默认使用Tomcat作为服务器
      • Tomcat维护一个线程池来处理请求
      • 当请求到达,从线程池分配一个线程处理该请求

实际例子:电商系统

想象一个电商系统的微服务架构:
  1. 用户服务(一个独立进程)
      • 有10-200个线程处理用户登录、注册请求
      • 所有这些线程共享同一个用户服务的内存和资源
  1. 订单服务(另一个独立进程)
      • 有自己的10-200个线程处理订单相关请求
      • 这些线程只能访问订单服务的内存和资源
  1. 库存服务(又一个独立进程)
      • 有自己的线程池处理库存查询和更新

微服务间通信

微服务之间通过网络通信(HTTP/REST、消息队列等),而不是直接共享内存:
  • 用户服务需要订单信息时,会发送HTTP请求到订单服务
  • 订单服务处理完成后,返回结果给用户服务

线程池的重要性

在每个微服务中:
  1. 线程池大小很关键
      • 太小:无法处理高并发请求
      • 太大:消耗过多资源,可能导致服务器崩溃
  1. 默认配置
      • Spring Boot默认最小10个线程
      • 最大可扩展到200个线程
      • 可以根据服务器性能和业务需求调整
总结来说,微服务架构中:每个微服务是一个独立的进程(JVM实例),内部有多个线程协同工作。这种设计让系统更加灵活、可扩展,同时提高了系统的容错能力。
 
 
 
Spring Boot应用默认使用Tomcat作为内嵌服务器,Tomcat使用基于线程池的并发模型
 
notion image

Tomcat线程模型详解

在Spring Boot微服务中,Tomcat服务器的线程模型包含:
  1. Acceptor线程:接收客户端Socket连接请求
  1. Poller线程:处理已连接的Socket,检测I/O事件
  1. 工作线程池:处理HTTP请求的线程池
      • 默认最小线程数:10
      • 默认最大线程数:200
      • 可通过配置文件调整
当HTTP请求到达时:
  1. Acceptor线程接收连接
  1. Poller线程将请求分配给工作线程池中的一个线程
  1. 工作线程处理整个请求,通过Spring MVC的DispatcherServlet分发到对应的
Goroutinegit cherry-pick
Loading...
Catalog