高可用返利机器人服务的容器化部署:Docker + Kubernetes 基础架构配置
·
高可用返利机器人服务的容器化部署: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 研发团队,转载请注明出处!
更多推荐



所有评论(0)