Spring Cloud 微服务上云实战:用华为云 ServiceStage + CSE 实现全链路治理
【摘要】 一、背景与痛点三个微服务,关系很清晰:用户服务 (user-service) ← 被调用库存服务 (inventory-service) ← 被调用订单服务 (order-service) ← 入口,调用上面两个本地开发时我们用的是经典组合:注册中心:Eureka配置中心:Spring Cloud Config + Git链路追踪:Sleuth + Zipkin熔断:Hyst...
一、背景与痛点
三个微服务,关系很清晰:
用户服务 (user-service) ← 被调用
库存服务 (inventory-service) ← 被调用
订单服务 (order-service) ← 入口,调用上面两个
本地开发时我们用的是经典组合:
- 注册中心:Eureka
- 配置中心:Spring Cloud Config + Git
- 链路追踪:Sleuth + Zipkin
- 熔断:Hystrix
上了测试环境后,问题逐个暴露:
|
痛点
|
具体表现
|
|---|---|
|
中间件运维重
|
Eureka 集群挂了没人发现,所有服务掉线
|
|
配置不统一
|
同一个
application.yml 在 3 台机器上内容不一致 |
|
调用不可见
|
订单创建慢,不知道是卡在用户服务还是库存服务
|
|
故障无隔离
|
库存服务超时,订单服务线程池被打满,级联雪崩
|
|
扩缩容靠手
|
流量高峰手动加实例,加完还要手动改 Nginx
|
核心诉求:中间件全托管、配置集中化、调用链路可视化、故障可隔离、弹性自动化。
二、方案设计
2.1 组件选型
|
功能
|
自建方案
|
华为云托管方案
|
选型理由
|
|---|---|---|---|
|
服务注册发现
|
Eureka
|
CSE 引擎(兼容 Spring Cloud)
|
免运维、多AZ高可用
|
|
配置中心
|
Config Server
|
CSE 配置管理
|
动态推送、版本管理
|
|
应用托管
|
手动部署 ECS
|
ServiceStage
|
容器化部署、弹性伸缩
|
|
链路追踪
|
Zipkin
|
APM(应用性能管理)
|
零侵入接入、拓扑自动发现
|
|
熔断限流
|
Hystrix
|
CSE 内置 + ServiceStage 治理
|
可视化规则配置
|
2.2 架构图
┌─────────────────────┐
│ API Gateway │
│ (ELB / APIG) │
└─────────┬───────────┘
│
┌─────────▼───────────┐
│ order-service │
│ (ServiceStage) │
└───┬───────────┬─────┘
│ │
┌───────────▼┐ ┌▼──────────────┐
│ user- │ │ inventory- │
│ service │ │ service │
│ │ │ │
└────────────┘ └───────────────┘
┌───────────────────────────────────────────────────┐
│ CSE 微服务引擎 │
│ ├── 服务注册发现(Service Registry) │
│ ├── 配置管理(Config Center) │
│ └── 治理中心(熔断/限流/路由) │
└───────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────┐
│ APM 应用性能管理 │
│ ├── 全链路追踪(Trace) │
│ ├── 应用拓扑(Topology) │
│ └── JVM / 方法级监控 │
└───────────────────────────────────────────────────┘
2.3 为什么不用 Istio / Service Mesh
团队规模小、Spring Cloud 代码已成型的情况下,Mesh 方案的改造成本高于收益:
- 需要改部署架构(注入 Sidecar)
- 网络调试复杂度陡增
- 对延迟敏感的业务,Sidecar 多一跳有影响
CSE 的 Java Agent 零侵入方案 更适合现阶段:不改代码,加一个 JVM 参数就能接入链路追踪和治理。
三、实操步骤
3.1 创建 CSE 微服务引擎
- 进入 微服务引擎 CSE 控制台 → 创建引擎
- 规格选择:入门版(测试)/ 专业版(生产)
- 网络:选择与应用同一个 VPC
- 创建完成后,记录:
- 注册中心地址:
https://cse-xxxx.sr.{region}.cse.myhuaweicloud.com - 配置中心地址:
https://cse-xxxx.cc.{region}.cse.myhuaweicloud.com
- 注册中心地址:
避坑点:CSE 引擎有「专享版」和「共享版」之分。生产环境务必选专享版,避免多租户资源争抢。
3.2 改造 Spring Cloud 应用接入 CSE
替换依赖(以 order-service 为例):
pom.xml 中移除 Eureka / Config / Hystrix 相关依赖,添加 CSE 适配:<!-- CSE Spring Cloud 适配 -->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-servicecomb-discovery</artifactId>
<version>1.11.0-2023.0.x</version>
</dependency>
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-config</artifactId>
<version>1.11.0-2023.0.x</version>
</dependency>
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-governance</artifactId>
<version>1.11.0-2023.0.x</version>
</dependency>
版本需与 Spring Boot / Spring Cloud 版本对齐,具体参考官方版本配套表。
bootstrap.yml 配置:
spring:
application:
name: order-service
cloud:
servicecomb:
discovery:
enabled: true
address: https://cse-xxxx.sr.cn-north-4.cse.myhuaweicloud.com
config:
enabled: true
address: https://cse-xxxx.cc.cn-north-4.cse.myhuaweicloud.com
file-source: order-service.yaml
governance:
enabled: true
# AK/SK 认证(使用华为云凭证)
servicecomb:
credentials:
enabled: true
accessKey: ${AK}
secretKey: ${SK}
region: cn-north-4
代码改造量:几乎为零。原有的
@FeignClient、@LoadBalanced RestTemplate 无需修改,CSE 自动接管服务发现。3.3 使用 CSE 配置中心
将原来散落在
application.yml 中的配置迁移到 CSE 配置中心:创建配置项
order-service.yaml:server:
port: 8080
spring:
datasource:
url: jdbc:mysql://rds-address:3306/order_db
username: ${db_user}
password: ${db_password}
# 自定义业务配置
order:
timeout-ms: 3000
max-retry: 2
# 日志级别动态调整
logging:
level:
com.example.order: DEBUG
动态刷新:在需要热更新的配置类上加
@RefreshScope:@RestController
@RefreshScope
public class OrderController {
@Value("${order.timeout-ms}")
private int timeoutMs;
@GetMapping("/config/timeout")
public int getTimeout() {
return timeoutMs; // 修改配置中心后无需重启即可生效
}
}
避坑点:CSE 配置中心的配置优先级高于本地application.yml,但低于bootstrap.yml。不要把spring.application.name放到配置中心里。
3.4 部署到 ServiceStage
① 创建应用
ServiceStage 控制台 → 应用管理 → 创建应用
shop-demo② 创建环境
- 环境名称:
test-env - 关联 CCE 集群(或弹性伸缩组)
- 关联 CSE 引擎
③ 创建组件
每个微服务创建一个组件:
|
组件名
|
来源
|
构建方式
|
实例数
|
|---|---|---|---|
|
user-service
|
源码仓库 / 镜像
|
Maven 构建
|
2
|
|
inventory-service
|
源码仓库 / 镜像
|
Maven 构建
|
2
|
|
order-service
|
源码仓库 / 镜像
|
Maven 构建
|
2
|
④ 部署配置
以 order-service 为例:
- 部署系统:CCE
- 命名空间:
shop-demo - 镜像:SWR 中构建好的
order-service:v1.0 - 环境变量:
JAVA_OPTS=-javaagent:/opt/asm/asm-agent.jar # APM Agent AK=xxx SK=xxx - 健康检查:HTTP GET
/actuator/health - 弹性伸缩:CPU > 70% 时自动加实例
⑤ 批量部署
ServiceStage 支持「一键部署所有组件」,按依赖顺序启动(先 user/inventory,后 order)。
3.5 接入 APM 全链路追踪
① 安装 APM Agent
在 ServiceStage 组件部署配置中开启 APM:
JAVA_OPTS=-javaagent:/opt/asm/asm-agent.jar \
-Dservice.name=order-service \
-Dservice.instance=order-service-${HOSTNAME}
或者在
pom.xml 中添加 APM Java Agent 依赖,构建时打入镜像。② 验证链路追踪
调用订单创建接口后,进入 APM 控制台:
- 应用拓扑:自动展示 order → user、order → inventory 的调用关系
- Trace 列表:每次请求生成一条完整调用链
- 方法级耗时:看到
OrderService.createOrder()里具体哪一步慢
示例调用链:
order-service POST /api/orders (120ms)
├── user-service GET /api/users/{id} (35ms)
└── inventory-service POST /api/inventory/deduct (60ms)
如果
inventory-service 突然变慢到 500ms,拓扑图上会标红,APM 自动触发慢调用告警。3.6 配置熔断与限流
在 CSE 治理中心配置规则:
熔断规则(针对 inventory-service):
circuitBreaker:
targetService: inventory-service
minRequests: 20 # 20 次请求内不触发
failureRate: 50 # 失败率超 50% 打开熔断
openDuration: 30s # 熔断 30 秒后半开
限流规则(保护 user-service):
rateLimit:
targetService: user-service
qps: 100 # 单实例限流 100 QPS
algorithm: token_bucket
降级策略:
fallback:
targetService: inventory-service
method: deduct
fallbackResponse: '{"success": false, "message": "库存服务暂不可用,请稍后重试"}'
关键原则:熔断是保护调用方,限流是保护被调方。两者要配合,不能只配一个。
四、验证结果
|
验证场景
|
预期结果
|
实际
|
|---|---|---|
|
服务启动后注册
|
CSE 控制台看到 3 个服务,各 2 个实例
|
✅
|
|
配置修改后生效
|
修改
order.timeout-ms,接口返回新值 |
✅
|
|
链路追踪
|
APM 中看到完整调用链和耗时
|
✅
|
|
库存服务宕机
|
order-service 触发熔断,返回降级响应
|
✅
|
|
用户服务过载
|
限流生效,超出 QPS 返回 429
|
✅
|
|
弹性伸缩
|
CPU 压测到 80%,自动新增 1 个 order 实例
|
✅
|
性能对比(改造前后):
|
指标
|
改造前(Eureka)
|
改造后(CSE)
|
|---|---|---|
|
注册中心可用性
|
单点风险
|
多 AZ 高可用
|
|
配置变更耗时
|
改文件 + 重启(5 min)
|
控制台修改(5 sec)
|
|
故障定位时间
|
翻日志(30 min+)
|
APM 拓扑 + Trace(2 min)
|
|
扩容时间
|
手动(15 min)
|
自动(1 min)
|
五、生产避坑清单
❌ 常见错误
- CSE 版本与 Spring Cloud 版本不匹配:启动直接报错,务必查官方配套表
- AK/SK 权限过大:给了
AdministratorAccess,应只给 CSE 相关权限 - 配置中心存敏感信息明文:数据库密码应走密钥管理(KMS)或 CSE 配置加密
- 熔断阈值设太低:正常波动就触发熔断,反而降低可用性
- APM Agent 内存不够:Java Agent 本身占 100-200MB,容器内存限制要留余量
- 服务名用下划线:CSE 服务名不支持
_,用-分隔 - 没配优雅停机:Pod 被杀死时正在处理的请求直接中断
✅ 正确姿势
- 认证最小化:创建 IAM 子账号,只授权
CSE FullAccess+APM FullAccess - 配置分层:公共配置放
common.yaml,服务独有配置放{service-name}.yaml - 熔断参数渐进:先观察一周错误率,再定阈值(建议初始 50% / 20次)
- APM 采样率:生产环境采样率设 10%-20%,全量采集性能开销大
- 优雅停机:Spring Boot 配置
server.shutdown=graceful,等待 30s 再 SIGTERM - 多环境隔离:CSE 引擎按环境创建独立实例(test / staging / prod)
六、总结与扩展
这次改造把微服务治理从「手工+经验」升级到「平台+数据」:
- 注册发现:从自建 Eureka 到 CSE 托管,可用性从 99% 到 99.95%
- 配置管理:从配置文件到动态配置中心,变更从分钟级到秒级
- 可观测性:从翻日志到拓扑+链路+指标三位一体
- 故障防护:从裸奔到熔断+限流+降级三层保护
后续演进方向:
- 灰度发布:ServiceStage 支持金丝雀发布,按 Header/权重路由
- 多AZ 容灾:CSE 引擎跨 AZ 部署,服务实例分布在多个可用区
- Mesh 演进:当团队和规模都上来后,平滑迁移到 ASM(应用服务网格)
- 全链路压测:结合 APM 和性能测试服务 CPTS,做生产环境压测
- 安全治理:服务间 mTLS 通信,结合 IAM 做细粒度访问控制
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)