4. 医疗微服务项目工程结构搭建

医疗微服务项目通常不会只有一个可运行的服务,而是由患者服务、挂号服务、医嘱服务、检验检查服务、支付服务、网关、公共组件等多个模块共同组成。如果每个服务各自维护一套依赖版本、各自定义包名、各自搭建本地环境,项目很快会陷入“能编译但不敢升级、能运行但无法协作”的状态。因此,工程结构搭建的核心目标不是把代码放进文件夹,而是建立一套可统一构建、可统一依赖、可统一规范、可统一启动的工程骨架。

多模块工程:用父工程锁定“共同语言”

以 Maven 为例,推荐采用“父工程 + 公共模块 + 业务服务模块”的三层结构。父工程只负责聚合与依赖管理,不写业务代码;公共模块承载医疗项目共用的返回体、异常、工具、审计字段、患者标识脱敏等能力;业务服务模块各自独立启动、独立部署。典型目录如下:

medical-platform/
├── pom.xml                     # 父工程:聚合 + dependencyManagement
├── medical-common/             # 公共模块:Result、异常、工具、常量
│   └── pom.xml
├── medical-api/                # 服务间接口契约:DTO、Feign 接口
│   └── pom.xml
├── medical-gateway/            # 统一入口:路由、鉴权、限流
│   └── pom.xml
├── medical-patient-service/    # 患者服务
│   └── pom.xml
├── medical-order-service/      # 医嘱服务
│   └── pom.xml
└── medical-payment-service/    # 支付服务
    └── pom.xml

父工程 pom.xml 中通过 <modules> 聚合所有子模块,通过 <dependencyManagement> 统一声明 Spring Boot、Spring Cloud、MyBatis-Plus、MySQL 驱动、Hutool 等版本。子模块引用依赖时不写版本号,避免“同一个 Spring Cloud 在不同服务里版本不一致”导致注册中心、配置中心、网关协议不兼容。Gradle 项目同理,可在根 build.gradle 中使用 subprojects 或 platform 统一约束版本。

统一依赖管理:把版本收敛到一处

医疗项目对稳定性要求高,依赖升级必须可控。建议父工程继承 spring-boot-starter-parent,再用 spring-cloud-dependencies 与 spring-cloud-alibaba-dependencies 做 BOM 导入。示例:

<properties>
  <spring-boot.version>3.2.5</spring-boot.version>
  <spring-cloud.version>2023.0.1</spring-cloud.version>
  <mybatis-plus.version>3.5.6</mybatis-plus.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring-boot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-bom</artifactId>
      <version>${mybatis-plus.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

这样,业务模块只需写 <artifactId>mybatis-plus-boot-starter</artifactId>,版本由父工程统一决定。若某服务确实需要特殊版本,应在父工程中显式覆盖并注释原因,而不是在子模块里私自指定。

医疗项目命名与包结构设计

医疗项目命名应体现业务域与层级,避免 com.example.demo 这类无意义包名。推荐根包采用“机构域名倒写 + 业务域”,例如 com.hospital.medical。每个服务内部按“接口层—应用层—领域层—基础设施层”组织,包结构示例:

com.hospital.medical.patient
├── controller        # 对外 REST 接口
├── application       # 应用服务,编排用例
├── domain            # 实体、值对象、领域服务
│   ├── model
│   └── service
├── infrastructure    # Mapper、远程调用、消息、缓存
│   ├── mapper
│   ├── feign
│   └── config
└── PatientApplication.java

类名建议统一后缀:XxxController、XxxService、XxxServiceImpl、XxxMapper、XxxDTO、XxxVO、XxxConvert。医疗数据涉及隐私,DTO 与 VO 必须分离,禁止直接把数据库实体暴露给前端。患者标识、身份证号、手机号等字段在 VO 中应做脱敏处理。

代码规范:让协作可预期

代码规范不是形式主义,而是医疗系统可审计、可追溯的基础。建议在父工程中统一引入 spring-javaformat 或 checkstyle 插件,并约定:统一使用 4 空格缩进;类、方法必须写 Javadoc;禁止使用 System.out.println;日志使用 SLF4J;异常统一继承 MedicalBizException;接口返回统一包装为 Result<T>。可在父工程 pom.xml 中绑定校验插件,执行 mvn validate 时自动检查格式,未通过则构建失败。

本地开发环境搭建

本地环境建议用 Docker Compose 一键拉起 MySQL、Redis、Nacos、RabbitMQ 等中间件,避免每位开发者手工安装。示例 docker-compose.yml 片段:

services:
  mysql:
    image: mysql:8.0
    ports: ["3306:3306"]
    environment:
      MYSQL_ROOT_PASSWORD: medical123
      MYSQL_DATABASE: medical_patient
  redis:
    image: redis:7.2
    ports: ["6379:6379"]
  nacos:
    image: nacos/nacos-server:v2.3.2
    ports: ["8848:8848"]
    environment:
      MODE: standalone

启动顺序建议为:中间件 → Nacos → 网关 → 各业务服务。每个服务在 application-local.yml 中配置本地数据库、Redis 与 Nacos 地址,通过 --spring.profiles.active=local 激活。验证环境是否就绪,可访问 Nacos 控制台查看服务列表,再调用网关健康检查接口 /actuator/health,返回 {"status":"UP"} 即表示本地链路基本可用。

医疗微服务多模块工程结构与本地启动链路 父工程 medical-platform 聚合 modules | dependencyManagement 统一版本 | 代码规范插件 | 统一 Result / 异常 Spring Boot 3.2.5 | Spring Cloud 2023.0.1 | MyBatis-Plus 3.5.6 medical-common Result<T> / 全局异常 审计字段 / 脱敏工具 常量 / 枚举 / 分页对象 medical-api 服务间 DTO 契约 Feign 接口定义 版本兼容约束 medical-gateway 统一路由 / 鉴权 限流 / 日志追踪 对外唯一入口 患者服务 patient-service controller/domain 医嘱服务 order-service application/domain 支付服务 payment-service infrastructure 本地中间件 MySQL / Redis Nacos / RabbitMQ 本地启动顺序: ① docker compose up 中间件 ② 启动 Nacos ③ 启动 gateway ④ 启动业务服务 验证:Nacos 服务列表可见 → 网关 /actuator/health 返回 UP → 业务接口可调通

完成上述结构后,团队应形成一份可执行的“工程基线”:父工程版本锁定、公共模块可复用、包结构统一、本地环境可一键拉起。后续新增检验检查、随访、药房等服务时,只需复制业务模块骨架并接入父工程,即可保持依赖、规范与启动方式一致,为医疗微服务的持续演进打下稳定基础。