
作者:[你的名字]|Java 工程师|专注云原生微服务架构 关键词:Spring Cloud、TSF、TKE、服务治理、K8s HPA、跨可用区容灾
在真实的金融业务场景中,SLA 99.99% 不是PPT上的数字,而是每次发布、每次扩容、每次网络抖动的生死考验。我们的核心风控系统原本部署在自建IDC,迁移至腾讯云后,我们面临三个硬骨头:
本次实战选用 TSF(腾讯微服务平台) 治理注册与配置,TKE(容器服务) 承载计算节点,利用 跨可用区(AZ) 部署实现机房级容灾。
┌─────────────────────────────────────────────────────┐
│ CLB (公网/内网) │
└─────────────────┬───────────────────────────────────┘
│
┌───────────┼───────────┐
│ │ │
┌─────▼─────┐ ┌───▼─────┐ ┌──▼─────┐
│ API网关 │ │ 风控核心 │ │ 数据中台│
│ (Spring │ │ (Java) │ │ (Java) │
│ Cloud) │ │ │ │ │
└─────┬─────┘ └───┬─────┘ └──┬─────┘
│ │ │
└───────────┼───────────┘
│
┌────────▼────────┐
│ TSF 注册中心 │
│ (Polaris 内核) │
└────────┬────────┘
│
┌────────▼────────┐
│ TKE 集群 │
│ (3 AZ × 2 节点) │
└─────────────────┘关键设计决策:
TSF 的 Spring Cloud Tencent 组件提供了 零代码侵入 的接入方式:
<!-- 替换原有 spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
<version>1.12.0-2022.0.5</version>
</dependency>迁移踩坑:旧服务使用了 Eureka 的 eureka.instance.lease-renewal-interval-in-seconds 自定义心跳,迁移后需改为 Polaris 的 spring.cloud.polaris.discovery.heartbeat-interval。TSF 控制台提供 服务治理迁移工具,可灰度切流。
为避免跨 AZ 调用带来的延迟和费用,我们在 TSF 中定义 路由规则:
az: ap-guangzhou-3 / az: ap-guangzhou-4;# TSF 路由规则(YAML 描述)
- name: "az-first-route"
conditions:
- type: "metadata"
key: "az"
operator: "=="
value: "${local.az}"
weight: 100
fallback: true通过 TSF 的 全链路灰度 能力,我们还能按 userId 哈希将测试流量路由到灰度版本,实现 细粒度发布。
TSF 集成了 Sentinel,我们在网关层配置了 QPS 限流(阈值 5000)和 慢调用熔断(RT > 500ms 且比例 > 30% 则熔断 10s)。关键代码:
@PostConstruct
public void initFlowRule() {
FlowRule rule = new FlowRule();
rule.setResource("gateway_api");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(5000);
FlowRuleManager.loadRules(Collections.singletonList(rule));
}apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: risk-engine-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: risk-engine
minReplicas: 3
maxReplicas: 15
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60金融业务有明显的早高峰(9:00-10:00)和月末结算(20:00-22:00)。我们使用 TKE 的 CronHPA 提前 5 分钟扩容:
apiVersion: autoscaling.tencent.com/v1
kind: CronHPA
metadata:
name: risk-engine-cron
spec:
scaleTarget:
apiVersion: apps/v1
kind: Deployment
name: risk-engine
crons:
- schedule: "0 8 * * *" # 每天8:00扩容
targetReplicas: 10
- schedule: "0 19 * * *" # 每天19:00扩容
targetReplicas: 12注意:CronHPA 与 HPA 同时使用时,TKE 会取 较大值,避免互相覆盖。
Java 应用在 TKE 上扩容慢的主要原因是 JVM 启动和类加载。我们做了三处优化:
-XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=80.0;@PostConstruct 中提前执行 2 次健康检查接口,使注册中心缓存生效。扩容时间从 8 分钟缩短至 2.5 分钟。
topologySpreadConstraints 强制跨 AZ 打散;topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: risk-engine我们通过 TKE 的 节点封锁 模拟 AZ 故障:
结果:服务调用失败率 0.2%,仅出现少量重试,RTO(恢复时间)约 110 秒。
使用 CBS 时需注意:CBS 不支持跨 AZ 挂载。因此我们:
TSF 集成了 腾讯云应用性能观测(TAM),无需额外埋点即可采集调用链。我们自定义了三个核心指标:
risk_engine_qps:按接口维度;risk_engine_rt:P99 延迟;risk_engine_error_rate:业务异常率。告警规则:当 error_rate > 1% 且持续 2 分钟,触发企业微信 + 短信告警。同时我们利用 TSF 的 事件中心 联动 SCF(云函数) 自动扩容。
问题现象 | 根因 | 解决方案 |
|---|---|---|
Pod 频繁重启 | JVM 内存超容器限制 | 设置 -XX:MaxRAMPercentage=80.0 |
TSF 服务列表显示异常 | 实例元数据 zone 标签未传递 | 在 Deployment 中通过 env 注入 POD_NAMESPACE 等 |
CronHPA 未生效 | 未安装 TKE 扩展组件 | 集群内安装 cron-hpa-controller |
跨 AZ 调用延迟突增 | 未启用 TSF 就近路由 | 在控制台开启“就近路由”策略 |
本次实践证明了 TSF + TKE 的组合在 Java 微服务场景下,既能提供企业级的服务治理能力,又能充分利用 K8s 的弹性与容灾特性。技术选型没有银弹,但腾讯云提供的 云原生套件 让我们少走了许多弯路。
给后来者的建议:先做好服务拆分与接口契约,再上治理平台;优先用 TSF 的托管组件,把精力放在业务逻辑上。
所有配置均已脱敏,完整代码和 Terraform 脚本已上传至 [GitHub - 你的仓库](示例链接)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。