首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从零到一构建高可用微服务架构:基于 Spring Cloud 与腾讯云 TKE 的实战总结

从零到一构建高可用微服务架构:基于 Spring Cloud 与腾讯云 TKE 的实战总结

原创
作者头像
用户12658083
发布2026-08-01 11:21:10
发布2026-08-01 11:21:10
1350
举报

从零到一构建高可用微服务架构:基于 Spring Cloud 与腾讯云 TKE 的实战总结

作者:开发者架构进阶班18班学员 关键词:微服务、Spring Cloud、Kubernetes、TKE、服务治理、容器化


一、为什么需要云原生微服务架构?

在数字化转型的浪潮中,业务系统面临着高并发、快速迭代、弹性伸缩等刚性需求。传统的单体架构已难以支撑现代互联网应用的交付效率与稳定性要求。微服务架构将单一应用拆分为一组小型、自治的服务,每个服务围绕业务能力构建,可独立部署、扩展和演进。

但微服务并非银弹——它引入了服务发现、配置管理、负载均衡、熔断降级、分布式事务等新的复杂性。云原生理念与容器编排平台(如 Kubernetes)的结合,为这些挑战提供了标准化的基础设施底座。

本文基于 开发者架构进阶班18班 的集体实践,分享一套 Spring Cloud + 腾讯云 TKE(Tencent Kubernetes Engine) 的微服务落地方案,涵盖从本地开发到云端部署的全链路,并附关键代码与配置,希望能为正在探索云原生架构的你提供可复用的参考。


二、整体技术选型与架构视图

组件

选型

作用

服务框架

Spring Boot 2.7 + Spring Cloud 2021.x

提供微服务核心能力

服务注册与发现

Nacos(双注册模式)

服务治理与元数据管理

配置中心

Nacos Config

动态配置推送

API 网关

Spring Cloud Gateway

路由、认证、限流

熔断降级

Resilience4j + Sentinel(可选)

故障隔离与流量控制

链路追踪

SkyWalking(接入腾讯云 APM)

全链路可观测性

容器编排

腾讯云 TKE (Kubernetes 1.24+)

弹性调度、服务编排

CI/CD

GitLab CI + 腾讯云容器镜像服务 TCR

自动化构建与发布

架构拓扑图(简化)


三、关键代码与配置详解

3.1 服务注册与发现(Nacos)

依赖引入(pom.xml)

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.5.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2021.0.5.0</version>
</dependency>

bootstrap.yml 配置

代码语言:javascript
复制
spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
        namespace: ${NACOS_NAMESPACE:public}
      config:
        server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
        file-extension: yaml
        refresh-enabled: true

启动类启用服务发现

代码语言:javascript
复制
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

3.2 动态配置刷新示例

Nacos 配置中心可实时推送配置变更,无需重启服务。下面是一个动态切换日志级别的例子:

代码语言:javascript
复制
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${log.level:INFO}")
    private String logLevel;

    @GetMapping("/log-level")
    public String getLogLevel() {
        return "Current log level: " + logLevel;
    }
}

在 Nacos 控制台修改 log.level=DEBUG,接口立即返回新值,适用于运维调优场景。

3.3 API 网关路由与过滤器

Spring Cloud Gateway 配置路由规则,并统一添加请求头(如 X-Source):

代码语言:javascript
复制
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service   # 与 Nacos 服务名对应
          predicates:
            - Path=/api/user/**
          filters:
            - name: RequestHeader
              args:
                header: X-Source
                value: gateway
            - name: CircuitBreaker
              args:
                name: userCB
                fallbackUri: forward:/fallback/user

自定义全局过滤器,用于记录请求耗时:

代码语言:javascript
复制
@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {
    private static final Logger log = LoggerFactory.getLogger(LoggingGlobalFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        long start = System.currentTimeMillis();
        return chain.filter(exchange).then(
            Mono.fromRunnable(() -> {
                long cost = System.currentTimeMillis() - start;
                String path = exchange.getRequest().getURI().getPath();
                log.info("Request to {} cost {} ms", path, cost);
            })
        );
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

3.4 熔断降级(Resilience4j)

在服务调用方(订单服务调用用户服务)引入 Resilience4j 实现超时和熔断:

代码语言:javascript
复制
@Service
public class OrderService {

    @Autowired
    private UserClient userClient;

    @CircuitBreaker(name = "userBreaker", fallbackMethod = "getDefaultUser")
    public User getUserInfo(Long userId) {
        return userClient.getUserById(userId);
    }

    public User getDefaultUser(Long userId, Throwable t) {
        log.warn("Fallback triggered for userId: {}", userId, t);
        return new User(userId, "default", "unknown@default.com");
    }
}

配置文件 application.yml

代码语言:javascript
复制
resilience4j.circuitbreaker:
  instances:
    userBreaker:
      slidingWindowSize: 10
      failureRateThreshold: 50
      waitDurationInOpenState: 10s

3.5 容器化构建(Dockerfile)

每个微服务项目根目录准备 Dockerfile,采用多阶段构建优化镜像体积:

代码语言:javascript
复制
# 构建阶段
FROM maven:3.8.6-openjdk-11-slim AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

3.6 TKE 部署描述(Deployment + Service + Ingress)

Deployment 示例(user-service)

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
  namespace: prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: ccr.ccs.tencentyun.com/myproject/user-service:latest
        ports:
        - containerPort: 8080
        env:
        - name: NACOS_SERVER_ADDR
          value: "nacos-headless:8848"
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 20
          periodSeconds: 5

Service(ClusterIP)

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: user-service
  namespace: prod
spec:
  selector:
    app: user-service
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
  type: ClusterIP

Ingress(使用腾讯云 CLB 做七层转发)

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gateway-ingress
  namespace: prod
  annotations:
    kubernetes.io/ingress.class: "qcloud"
    qcloud.com/tke-deploy: "true"
spec:
  rules:
  - host: api.myapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: gateway-service
            port:
              number: 8080

四、腾讯云 TKE 实践踩坑与调优

4.1 服务发现地址问题

在 TKE 中,Nacos 部署为 StatefulSet,使用 Headless Service 实现 DNS 解析。务必在服务 bootstrap.yml 中配置 ${NACOS_SERVER_ADDR}nacos-headless.nacos-ns.svc.cluster.local:8848,避免 Pod 重启后 IP 变化导致注册失败。

4.2 日志与监控集成

  • 通过腾讯云 CLS(日志服务) 采集容器 stdout 日志,使用 logtail 组件。
  • 集成 腾讯云 APM,在启动参数添加 Javaagent:

代码语言:javascript
复制
-javaagent:/opt/skywalking/agent/skywalking-agent.jar
-Dskywalking.collector.backend_service=apm-collector.tke:11800
-Dskywalking.agent.service_name=user-service

4.3 弹性伸缩策略

利用 TKE 的 HPA(Horizontal Pod Autoscaler)基于 CPU 或自定义指标(如 QPS)自动扩缩容:

代码语言:javascript
复制
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: user-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

4.4 配置管理最佳实践

  • 敏感信息(数据库密码、API Key)使用 TKE 的 Secret 挂载,而非写在 Nacos 配置中。
  • 环境差异(dev/test/prod)通过 K8s ConfigMap 注入 SPRING_PROFILES_ACTIVE,Nacos 根据 profile 拉取对应配置。

五、CI/CD 流水线关键步骤

我们在 GitLab CI 中实现自动化构建、推送镜像并触发 TKE 滚动更新:

代码语言:javascript
复制
# .gitlab-ci.yml
stages:
  - build
  - deploy

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  TCR_REGISTRY: ccr.ccs.tencentyun.com

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker tag $IMAGE_TAG $TCR_REGISTRY/myapp/user-service:$CI_COMMIT_SHORT_SHA
    - docker push $TCR_REGISTRY/myapp/user-service:$CI_COMMIT_SHORT_SHA
  only:
    - main

deploy:
  stage: deploy
  script:
    - kubectl set image deployment/user-service user-service=$TCR_REGISTRY/myapp/user-service:$CI_COMMIT_SHORT_SHA -n prod
    - kubectl rollout status deployment/user-service -n prod
  only:
    - main

六、总结与展望

通过本次 开发者架构进阶班18班 的联合攻坚,我们成功构建了一套 云原生微服务样板工程,并稳定运行在腾讯云 TKE 上。核心收益包括:

  • 弹性:基于 HPA 和 TKE 节点池,从容应对流量洪峰;
  • 可观测性:链路追踪、监控告警、日志查询三位一体;
  • 交付效率:容器化 + CI/CD 使发布周期从小时级缩短到分钟级;
  • 容错能力:熔断、重试、降级策略保障核心业务高可用。

当然,架构演进永无止境。未来我们计划引入 Service Mesh(Istio) 实现更细粒度的流量治理,以及 GitOps(ArgoCD) 实现声明式持续交付。希望本文的实践细节能为你提供有价值的参考,也欢迎在评论区交流探讨。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 从零到一构建高可用微服务架构:基于 Spring Cloud 与腾讯云 TKE 的实战总结
    • 一、为什么需要云原生微服务架构?
    • 二、整体技术选型与架构视图
    • 三、关键代码与配置详解
      • 3.1 服务注册与发现(Nacos)
      • 3.2 动态配置刷新示例
      • 3.3 API 网关路由与过滤器
      • 3.4 熔断降级(Resilience4j)
      • 3.5 容器化构建(Dockerfile)
      • 3.6 TKE 部署描述(Deployment + Service + Ingress)
    • 四、腾讯云 TKE 实践踩坑与调优
      • 4.1 服务发现地址问题
      • 4.2 日志与监控集成
      • 4.3 弹性伸缩策略
      • 4.4 配置管理最佳实践
    • 五、CI/CD 流水线关键步骤
    • 六、总结与展望
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档