背景

当前系统采用微服务架构进行开发,该架构带来了系统可扩展性提升、服务间耦合度降低等优势。然而在实际运行中遇到了一系列问题,影响了工作效率和服务稳定性。本文档旨在提供一份微服务架构设计模板,总结常见问题与应对策略,供团队在后续架构设计、问题复盘时参考。

文档范围:本文档弱化了具体产品、项目、医院名称,聚焦于通用的微服务架构设计原则和常见问题处理思路。


一、微服务架构设计原则

1.1 服务划分原则

原则

说明

示例

单一职责

每个服务只负责一个明确的业务能力

用户服务只管用户,订单服务只管订单

边界清晰

服务边界按业务领域划分,避免循环依赖

影像服务与报告服务分离

独立部署

服务可独立发布,不影响其他服务

通过容器化 + CI/CD 实现

按需扩展

根据负载独立扩缩容,避免整体扩容

热点服务单独扩容

1.2 服务分层设计

  • 网关层:统一入口,处理鉴权、限流、路由

  • BFF 层:适配前端需求,聚合多个后端服务

  • 聚合:编排业务逻辑,组合多个基础服务

  • 基础服务层:承载核心业务能力,按领域划分

  • 数据存储层:数据库、缓存、搜索等持久化组件

1.3 服务通信设计

同步通信

方式

适用场景

注意事项

HTTP RESTful

简单的请求-响应场景

控制调用链路深度,建议不超过 3 层

gRPC

高性能、内部服务通信

需要 Schema 管理和版本控制

DICOM/HL7

医疗影像协议通信

专用协议,注意兼容旧版本

异步通信

方式

适用场景

注意事项

消息队列(RocketMQ/Kafka)

跨服务事件通知、异步处理

消息幂等、防重,订阅关系管理

Redis Stream

轻量级异步、解耦

避免消息堆积,设置过期策略

事件总线

跨域事件驱动

统一事件规范(Schema)

重要原则:东西向流量(服务间调用)不建议走网关和鉴权,直接服务发现调用,可显著降低延迟。


二、技术栈参考

以下为典型微服务架构的技术栈选型参考(可根据实际场景调整)。

2.1 开发技术栈

类别

技术选型

开发语言

Java(Spring Boot)、Go(Echo/GoKit)、Node.js(TypeScript)、C#(.NET 6+)

项目构建

Maven / Gradle(Java)、npm/pnpm(Node.js)

版本控制

Git

容器化

Docker

容器编排

Kubernetes

2.2 中间件选型

类别

推荐选型

关系型数据库

MySQL

非关系型数据库

MongoDB、Redis

搜索引擎

Elasticsearch

消息队列

RocketMQ、Kafka

缓存

Redis(单节点/集群)

对象存储

MinIO(私有化)、OSS/S3(云端)

2.3 可观测性

类别

推荐选型

指标监控

Prometheus + Grafana

日志收集

Filebeat + Elasticsearch + Kibana

链路追踪

OpenTelemetry + Tempo

报警通知

Alertmanager

2.4 网关与服务治理

类别

推荐选型

API 网关

APISIX / Kong

服务发现

Kubernetes Service

负载均衡

kube-proxy / 云负载均衡器

配置中心

ConfigMap / Apollo / Nacos


三、常见问题与应对策略

3.1 性能问题

问题

描述

应对策略

微服务性能不足

无法给出固定资源支撑的业务量,扩容只能临时缓解

梳理各服务及中间件的安全临界点,建立监控告警,提前发现瓶颈

资源消耗随服务数增加

微服务拆分越多,CPU 和内存消耗越大

按需拆分,避免过度拆分;非核心服务可合并部署

计算存储成本高

微服务数量多导致资源配置要求高

评估核心服务独立扩展,非核心服务共用资源

3.2 调用链路问题

问题

描述

应对策略

调用链路过长

低代码平台等场景下微服务间多次经过网关和认证

东西向流量绕过网关直连,减少不必要的代理跳转

问题排查复杂度高

每次排查问题需多人参与,周期长

建立有代表性的私有化环境副本,积累自动化测试和验证用例

链路追踪不完整

OTEL 只能覆盖 API 网关到业务服务层,外部代理层不可见

扩展链路追踪覆盖范围,完善 WebSocket 场景支持

3.3 中间件管理问题

问题

描述

应对策略

中间件共用互相影响

多应用共用 Redis、MySQL、Kafka 等,单个服务错误导致全线异常

重要业务和非重要业务的中间件实例分离;中间件容器化需充分验证

中间件维护困难

中间件随业务部署面临资源分配、性能、维护等问题

评估投入产出,专业团队维护或采购云服务

中间件容器化争议

容器内担心稳定性和性能,外部扩展困难

中高业务量场景建议物理机部署;中小业务量可容器化,逐步验证

3.4 部署与配置问题

问题

描述

应对策略

部署包体积大

安装包过大导致传输成本高、升级耗时长

优化镜像分层、增量更新、分批下载

配置管理混乱

服务升级时配置错误或被还原导致故障

分类管理配置(研发配置/常量配置/业务差异配置),使用配置中心统一管理

私有化配置爆炸

大量配置项,云端与私有化场地配置差异大

插件式开发,将产品主体与配置分离;配置做成插件独立维护

3.5 可观测性问题

问题

描述

应对策略

监控系统不完善

监控不全面,问题发现滞后

组建平台效率团队,负责中间件和监控的高可用建设

日志查询困难

跨服务链路日志查询复杂

统一日志规范,全链路 TraceID 串联,完善日志平台交互

链路系统不稳定

链路追踪数据丢失

提升链路系统稳定性,增加数据校验机制

业务监控缺失

核心业务指标监控不全,无法做变更前后对比

建立核心业务指标监控大盘,支持变更验证

3.6 团队协作问题

问题

描述

应对策略

跨团队协作困难

大功能跨越多个团队,节奏难以统一

明确团队职责边界,建立跨团队协作流程和接口规范

依赖管理缺失

服务间依赖关系复杂,部署升级无法快速识别

服务提供自检接口,建立依赖关系图谱

微服务拆分不明确

边界不清导致耦合度高,难以独立部署

按领域驱动设计(DDD)原则重新梳理服务边界

3.7 变更管理问题

问题

描述

应对策略

变更导致生产故障

混合云+私有化场景变更风险高

引入变更管理流程:变更评审 → 灰度发布 → 监控预警 → 快速回滚

变更自动化不足

大量人工操作,出错概率高

将人工审核改为自动审核,依赖监控和告警实现变更自动化


四、微服务拆分粒度建议

微服务拆分粒度需要在「独立部署灵活性」和「资源利用效率」之间取得平衡。云端与私有化场地的资源条件差异较大,建议设计可灵活组合的模块化部署方案。

场景

拆分策略

云端(资源充足)

可按领域细分,独立扩缩容

中小规模私有化

按功能模块打包部署,共用部分基础设施

大规模私有化(高并发)

按核心/非核心分层,关键服务独立部署


五、推荐实践

5.1 服务自检机制

每个服务应提供标准化的自检接口,涵盖:

  • 依赖服务连通性(数据库、缓存、消息队列)

  • 核心接口可用性

  • 配置完整性校验

  • 资源使用状态

5.2 环境标准化

针对私有化环境异构问题,建议:

  1. 建立典型场景的标准化环境副本

  2. 实现自动化测试、自动化安装、自动化验证

  3. 积累形成可复用的私有化部署标准包

5.3 平台效率团队职责

职责

说明

中间件运维

负责所有中间件的高可用和性能优化

可观测性建设

统一监控、日志、链路追踪平台的建设与维护

变更自动化

建设变更管理平台,实现变更可观测、可回滚

更多推荐