3. Development 环境定义:开发环境与生产环境的差异

在分布式事务鉴权拦截的移植适配工作中,Development 环境的定义直接决定了本地验证的有效性与生产部署的可靠性。开发环境与生产环境在资源约束、网络拓扑、服务发现、存储持久化等方面存在本质差异,理解这些差异是后续移植适配的前提。

3.1 核心差异对比

维度 开发环境 (Local Dev) 生产环境 (Production) 移植适配关注点
资源规模 单机/少量容器,CPU/内存有限 多节点集群,弹性伸缩 鉴权拦截器需支持资源降级与熔断
服务发现 Docker Compose 内部 DNS / 固定 IP K8s Service / 注册中心 (Nacos/Eureka) 拦截器需适配动态端点解析
网络模型 扁平网络,端口映射 Overlay 网络,CNI 插件,网络策略 分布式事务上下文透传需考虑网络延迟
存储持久化 容器卷挂载 / 临时数据 PV/PVC,分布式存储 (Ceph/OSS) 鉴权 Token 与事务日志的持久化策略
配置管理 环境变量 / .env 文件 ConfigMap / Secret / 配置中心 鉴权密钥与事务超时配置的分离
可观测性 容器日志 / 简单链路追踪 Prometheus + Grafana + 全链路追踪 拦截器需输出结构化指标与 TraceId
移植适配原则:开发环境应尽可能模拟生产环境的网络拓扑与配置结构,但允许在资源规格、持久化方案上做简化。鉴权拦截器在开发环境中通过 @Profile("dev") 启用本地降级策略,在生产环境通过 @Profile("prod") 启用完整校验链路。

3.2 本地 Docker Compose 环境架构

Docker Compose 是开发阶段最常用的多容器编排工具,适用于单机模拟微服务拓扑。下图展示了包含分布式事务协调器、鉴权服务、业务服务 A/B 的本地开发环境架构。

本地 Docker Compose 开发环境架构 API Gateway (Spring Cloud Gateway) Auth Service (鉴权拦截) Business Service A Business Service B Seata TC (事务协调器) MySQL / Redis (本地卷挂载) RocketMQ (事务消息) 说明: 所有服务通过 docker-compose.yml 定义,使用固定服务名(如 auth-service:8080)进行内部通信。 鉴权拦截器在网关层以 Filter 方式注入,分布式事务上下文通过 Seata 的 RootContext 透传。
本地开发建议:使用 docker-compose up -d 一键启动所有依赖服务。鉴权拦截器在开发阶段可配置 auth.skip=true 跳过 Token 校验,仅保留分布式事务上下文的传递逻辑,以加速调试。

3.3 云原生 K8s 环境架构

生产环境基于 Kubernetes 编排,服务以 Pod 形式运行,通过 Service 与 Ingress 暴露端点。下图展示了 K8s 环境下的分布式事务鉴权拦截部署拓扑。

云原生 K8s 生产环境架构 Ingress (Nginx Controller) Service (ClusterIP / NodePort) Pod 组 - 鉴权服务 auth-service:8080 (3 副本) seata-tc:8091 (1 副本) Pod 组 - 业务服务 biz-service:8080 (5 副本) sidecar (鉴权代理) 数据层 MySQL (StatefulSet + PV) Redis Sentinel (3 节点) ConfigMap / Secret Prometheus + Grafana ELK / 链路追踪 关键差异: K8s 环境使用 Service 抽象实现服务发现与负载均衡,鉴权拦截器需通过 K8s API 动态获取 Pod IP。 分布式事务的 Seata TC 以 StatefulSet 部署,确保事务日志持久化;鉴权 Token 存储在 Secret 中,通过 Volume 挂载到 Pod。

3.4 环境移植适配清单

从 Docker Compose 移植到 K8s 时,分布式事务鉴权拦截器需要完成以下适配项:

  1. 服务发现适配:将 docker-compose 中的固定服务名替换为 K8s Service DNS 名称(如 auth-service.namespace.svc.cluster.local)。
  2. 配置注入适配:将 .env 文件中的鉴权密钥、事务超时参数迁移至 K8s Secret 与 ConfigMap,通过 spring.cloud.kubernetes.config 自动加载。
  3. 网络策略适配:在 K8s 中定义 NetworkPolicy,仅允许网关 Pod 访问鉴权服务 8080 端口,业务 Pod 访问 Seata TC 的 8091 端口。
  4. 日志与指标适配:拦截器输出格式从 console 调整为 JSON 结构化日志,并暴露 /actuator/prometheus 端点供 Prometheus 采集。
  5. 健康检查适配:为鉴权拦截器添加 livenessProbe 与 readinessProbe,确保 K8s 在拦截器未就绪时不会路由流量。
常见陷阱:开发环境中 Docker Compose 的容器重启策略为 unless-stopped,而 K8s 默认使用 Always 策略。鉴权拦截器在启动时若依赖 Seata TC 未就绪,应实现重试机制(如 Spring Retry 或 Resilience4j),避免 CrashLoopBackOff。

3.5 环境差异总结

适配维度 Docker Compose 实现 K8s 实现 拦截器改动量
服务调用 http://auth-service:8080 http://auth-service:8080 (DNS 自动解析) 低(仅需调整 namespace)
配置管理 application-dev.yml + .env ConfigMap + Secret 中(需适配 Kubernetes 属性源)
事务日志 本地文件挂载 ./logs:/logs PVC 持久卷 + 日志采集 Sidecar 高(需实现日志轮转与采集)
鉴权缓存 本地 Redis 容器 Redis Sentinel 或 Cluster 中(需配置哨兵地址)
弹性伸缩 手动 docker-compose scale HPA 自动扩缩容 高(拦截器需无状态设计)
移植策略:建议在开发环境中使用 kind 或 minikube 搭建本地 K8s 集群,提前暴露环境差异。鉴权拦截器的核心逻辑(Token 校验、事务上下文透传)保持与部署环境无关,仅通过 Spring Profile 切换配置源与服务发现策略。