高可用返利机器人服务的容器化部署:Docker + Kubernetes 基础架构配置
大家好,我是 微赚淘客系统3.0 的研发者省赚客!
为支撑日均百万级用户消息请求与毫秒级响应要求,微赚淘客系统3.0 的返利机器人服务已全面容器化,基于 Docker 构建镜像,并通过 Kubernetes(K8s)实现弹性伸缩、故障自愈与滚动发布。本文详解核心配置与部署实践。
一、Dockerfile 编写规范
服务采用 Spring Boot 2.7 开发,使用多阶段构建减小镜像体积:
# 构建阶段
FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests -q
# 运行阶段
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY –from=builder /app/target/rebate-bot-*.jar app.jar
EXPOSE 8080
HEALTHCHECK –interval=30s –timeout=5s –start-period=60s –retries=3 \\
CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-XX:+UseG1GC", "-Xms512m", "-Xmx512m", "-jar", "app.jar"]
关键点:
- 使用 slim 镜像降低攻击面;
- 启用 G1GC 优化 GC 停顿;
- 集成 Spring Boot Actuator 健康检查端点。
二、Kubernetes Deployment 配置
定义 deployment.yaml 实现无状态服务部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: rebate–bot
namespace: juwatech–prod
spec:
replicas: 6
selector:
matchLabels:
app: rebate–bot
template:
metadata:
labels:
app: rebate–bot
spec:
containers:
– name: rebate–bot
image: registry.juwatech.cn/rebate–bot:v1.2.3
ports:
– containerPort: 8080
env:
– name: SPRING_PROFILES_ACTIVE
value: "prod"
– name: TZ
value: "Asia/Shanghai"
resources:
requests:
memory: "512Mi"
cpu: "200m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 20
periodSeconds: 10
volumeMounts:
– name: logs
mountPath: /app/logs
volumes:
– name: logs
emptyDir: {}
三、Service 与 Ingress 暴露
通过 ClusterIP + Ingress 对外提供 HTTPS 访问:
apiVersion: v1
kind: Service
metadata:
name: rebate–bot–svc
namespace: juwatech–prod
spec:
selector:
app: rebate–bot
ports:
– protocol: TCP
port: 80
targetPort: 8080
—
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rebate–bot–ingress
namespace: juwatech–prod
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
spec:
tls:
– hosts:
– bot.juwatech.cn
secretName: juwatech–tls–secret
rules:
– host: bot.juwatech.cn
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: rebate–bot–svc
port:
number: 80
TLS 证书通过 Cert-Manager 自动签发,juwatech-tls-secret 由其管理。
四、ConfigMap 与 Secret 管理敏感配置
数据库密码、OAuth2 密钥等通过 Secret 注入:
apiVersion: v1
kind: Secret
metadata:
name: rebate–bot–secret
namespace: juwatech–prod
type: Opaque
data:
TAOBAO_CLIENT_SECRET: <base64–encoded>
DB_PASSWORD: <base64–encoded>
—
apiVersion: v1
kind: ConfigMap
metadata:
name: rebate–bot–config
namespace: juwatech–prod
data:
application-prod.yml: |
spring:
datasource:
url: jdbc:mysql://mysql.juwatech-prod.svc.cluster.local:3306/rebate_db
username: rebate_user
password: ${DB_PASSWORD}
redis:
host: redis.juwatech-prod.svc.cluster.local
在 Deployment 中挂载:
env:
– name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: rebate–bot–secret
key: DB_PASSWORD
volumeMounts:
– name: config–volume
mountPath: /app/config
volumes:
– name: config–volume
configMap:
name: rebate–bot–config
应用启动时加载 /app/config/application-prod.yml。
五、HPA 自动扩缩容
基于 CPU 与内存使用率动态调整副本数:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: rebate–bot–hpa
namespace: juwatech–prod
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: rebate–bot
minReplicas: 3
maxReplicas: 20
metrics:
– type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
– type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 75
在大促期间,Pod 数可自动从 6 扩展至 18,保障服务稳定性。
六、Java 应用适配 K8s 环境
服务需监听 0.0.0.0 并支持优雅停机:
package juwatech.cn.bot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class RebateBotApplication {
public static void main(String[] args) {
// 确保绑定到所有网络接口
System.setProperty("server.address", "0.0.0.0");
SpringApplication.run(RebateBotApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://bot.juwatech.cn")
.allowedMethods("GET", "POST");
}
};
}
}
同时,在 application.yml 中启用优雅关闭:
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s
配合 K8s Pod 的 terminationGracePeriodSeconds: 45,确保正在处理的微信消息完成后再终止。
七、日志与监控集成
- 日志输出至 stdout,由 Fluentd 收集至 ELK;
- 暴露 /actuator/prometheus 端点,被 Prometheus 抓取;
- Grafana 面板监控 QPS、错误率、JVM 堆内存。
通过上述配置,返利机器人服务在 K8s 集群中实现 99.99% 可用性,单集群支持 5000+ TPS。
本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!





