作者:开发者架构进阶班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 | 自动化构建与发布 |
架构拓扑图(简化):
依赖引入(pom.xml):
<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 配置:
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启动类启用服务发现:
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}Nacos 配置中心可实时推送配置变更,无需重启服务。下面是一个动态切换日志级别的例子:
@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,接口立即返回新值,适用于运维调优场景。
Spring Cloud Gateway 配置路由规则,并统一添加请求头(如 X-Source):
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自定义全局过滤器,用于记录请求耗时:
@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;
}
}在服务调用方(订单服务调用用户服务)引入 Resilience4j 实现超时和熔断:
@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:
resilience4j.circuitbreaker:
instances:
userBreaker:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10s每个微服务项目根目录准备 Dockerfile,采用多阶段构建优化镜像体积:
# 构建阶段
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"]Deployment 示例(user-service):
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: 5Service(ClusterIP):
apiVersion: v1
kind: Service
metadata:
name: user-service
namespace: prod
spec:
selector:
app: user-service
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIPIngress(使用腾讯云 CLB 做七层转发):
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 中,Nacos 部署为 StatefulSet,使用 Headless Service 实现 DNS 解析。务必在服务 bootstrap.yml 中配置 ${NACOS_SERVER_ADDR} 为 nacos-headless.nacos-ns.svc.cluster.local:8848,避免 Pod 重启后 IP 变化导致注册失败。
logtail 组件。-javaagent:/opt/skywalking/agent/skywalking-agent.jar
-Dskywalking.collector.backend_service=apm-collector.tke:11800
-Dskywalking.agent.service_name=user-service利用 TKE 的 HPA(Horizontal Pod Autoscaler)基于 CPU 或自定义指标(如 QPS)自动扩缩容:
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: 70SPRING_PROFILES_ACTIVE,Nacos 根据 profile 拉取对应配置。我们在 GitLab CI 中实现自动化构建、推送镜像并触发 TKE 滚动更新:
# .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 上。核心收益包括:
当然,架构演进永无止境。未来我们计划引入 Service Mesh(Istio) 实现更细粒度的流量治理,以及 GitOps(ArgoCD) 实现声明式持续交付。希望本文的实践细节能为你提供有价值的参考,也欢迎在评论区交流探讨。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。