Spring Boot + Kubernetes Redis Cluster 示例项目

下面是一个完整的 Spring Boot + Kubernetes Redis Cluster 示例项目,包含:

  • ✅ Spring Boot 应用(使用 Redisson 连接 Redis Cluster)
  • ✅ Dockerfile(多阶段构建,轻量镜像)
  • ✅ Kubernetes Deployment + Service(应用部署)
  • ✅ Redis Cluster 部署(基于 Bitnami Helm)
  • ✅ 端到端测试方法

你可以直接克隆、构建、部署到你的 K8s 集群。


📁 项目结构

复制代码
springboot-redis-cluster-k8s/
├── src/
│   └── main/
│       ├── java/com/example/redlock/
│       │   ├── RedlockApplication.java
│       │   ├── config/RedissonConfig.java
│       │   ├── controller/OrderController.java
│       │   └── service/impl/OrderServiceImpl.java
│       └── resources/
│           ├── application.yml
│           └── bootstrap.yml (可选)
├── Dockerfile
├── k8s/
│   ├── app-deployment.yaml
│   └── app-service.yaml
├── redis-cluster-values.yaml
└── README.md

1️⃣ Spring Boot 应用代码

pom.xml(关键依赖)

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson-spring-boot-starter</artifactId>
        <version>3.25.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

application.yml

yaml 复制代码
spring:
  application:
    name: springboot-redis-cluster-app

# Redis Cluster 配置(通过环境变量覆盖)
redisson:
  cluster-servers-config:
    node-addresses:
      - "redis://redis-cluster-0.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
      - "redis://redis-cluster-1.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
      - "redis://redis-cluster-2.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
      - "redis://redis-cluster-3.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
      - "redis://redis-cluster-4.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
      - "redis://redis-cluster-5.redis-cluster-headless.redis-cluster.svc.cluster.local:6379"
    password: ${REDIS_PASSWORD:MySecureRedisPass123!}
    connect-timeout: 10000
    timeout: 3000
    retry-attempts: 3
    retry-interval: 1500

server:
  port: 8080

management:
  endpoints:
    web:
      exposure:
        include: health,info
  endpoint:
    health:
      show-details: always

💡 说明

  • 使用 redis:// 协议(非 rediss://,除非启用 TLS)
  • 密码通过 REDIS_PASSWORD 环境变量注入(安全)

业务代码(略,参考前文 OrderServiceImpl


2️⃣ Dockerfile(多阶段构建)

dockerfile 复制代码
# springboot-redis-cluster-k8s/Dockerfile
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

FROM eclipse-temurin:17-jre-alpine
RUN addgroup -g 1001 -S app && adduser -u 1001 -S app -G app
USER app
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

✅ 镜像大小约 200MB,安全无 root 用户


3️⃣ 构建并推送镜像(示例)

bash 复制代码
# 构建
docker build -t your-registry/springboot-redis-cluster-app:v1.0 .

# 推送(替换为你的 registry)
docker push your-registry/springboot-redis-cluster-app:v1.0

🔁 如果使用 Minikube,可直接加载:

bash 复制代码
minikube image load springboot-redis-cluster-app:v1.0

4️⃣ Kubernetes 应用部署文件

k8s/app-deployment.yaml

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-redis-app
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot-redis-app
  template:
    metadata:
      labels:
        app: springboot-redis-app
    spec:
      containers:
      - name: app
        image: your-registry/springboot-redis-cluster-app:v1.0
        ports:
        - containerPort: 8080
        env:
        - name: REDIS_PASSWORD
          valueFrom:
            secretKeyRef:
              name: redis-secret
              key: password
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "500m"

k8s/app-service.yaml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: springboot-redis-app-svc
  namespace: default
spec:
  selector:
    app: springboot-redis-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP  # 或 LoadBalancer(云环境)

5️⃣ 创建 Redis 密码 Secret

bash 复制代码
# 创建 Secret(与 Redis Cluster 密码一致)
kubectl create secret generic redis-secret \
  --from-literal=password='MySecureRedisPass123!' \
  -n default

⚠️ 必须与 redis-cluster-values.yaml 中的密码相同


6️⃣ 部署 Redis Cluster(使用 Helm)

bash 复制代码
# 创建命名空间
kubectl create namespace redis-cluster

# 安装 Redis Cluster(使用前文的 redis-cluster-values.yaml)
helm install redis-cluster bitnami/redis-cluster \
  -n redis-cluster \
  -f redis-cluster-values.yaml

✅ 确保 redis-cluster-values.yamlauth.password 与 Secret 一致


7️⃣ 部署 Spring Boot 应用

bash 复制代码
# 应用部署
kubectl apply -f k8s/app-deployment.yaml
kubectl apply -f k8s/app-service.yaml

# 查看状态
kubectl get pods
kubectl get svc springboot-redis-app-svc

8️⃣ 端到端测试

方法 1:通过 Service 访问

bash 复制代码
# 获取 Service IP(或使用 NodePort/Ingress)
APP_IP=$(kubectl get svc springboot-redis-app-svc -o jsonpath='{.spec.clusterIP}')

# 发起请求(模拟并发)
for i in {1..5}; do
  curl "http://$APP_IP/create-order?userId=U1&orderId=O1001" &
done

方法 2:查看日志(验证分布式锁)

bash 复制代码
kubectl logs -l app=springboot-redis-app --tail=50

预期日志(串行执行):

复制代码
线程 http-nio-8080-exec-1 获取锁成功...
订单 O1001 创建成功
线程 http-nio-8080-exec-2 获取锁成功...  # 下一个请求

🔒 安全与生产建议

项目 建议
镜像仓库 使用私有 Registry(如 Harbor、ECR)
Secret 管理 集成 Vault 或 Sealed Secrets
网络策略 限制只有 app Pod 能访问 redis-cluster
资源配额 为 namespace 设置 ResourceQuota
监控 启用 Prometheus + Grafana 监控 Redis 和应用

🧪 故障排查命令

bash 复制代码
# 检查 Redis Cluster 状态
kubectl exec -it redis-cluster-0 -n redis-cluster -- redis-cli -a MySecureRedisPass123! CLUSTER INFO

# 检查应用能否解析 Redis Headless Service
kubectl exec -it <app-pod> -- nslookup redis-cluster-headless.redis-cluster

# 查看应用连接错误
kubectl logs <app-pod> | grep -i redis

📦 一键部署脚本(可选)

创建 deploy-all.sh

bash 复制代码
#!/bin/bash
# 1. 部署 Redis Cluster
helm install redis-cluster bitnami/redis-cluster -n redis-cluster -f redis-cluster-values.yaml

# 2. 创建 Secret
kubectl create secret generic redis-secret --from-literal=password='MySecureRedisPass123!'

# 3. 部署应用
kubectl apply -f k8s/

至此,你已拥有一个完整的、生产就绪的 Spring Boot + Redis Cluster on K8s 解决方案!

相关推荐
mounter6252 小时前
MACsec 全景解析:从技术演进、核心架构到 DPU 硬件卸载与 K8s 大规模调度实战
linux·kubernetes·linux kernel·kernel·macsec
2601_963870186 小时前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
皮皮蟹虾饺7 小时前
NCCL 源码解析:通信器从出生到消亡的完整一生
linux·人工智能·ubuntu·语言模型·kubernetes
凤山老林9 小时前
高保真集成测试:Spring Boot 结合 Testcontainers 的工程落地
spring boot·后端·集成测试
RuoyiOffice9 小时前
SpringBoot3+Vue3 接口访问日志实战:@ApiAccessLog 慢接口、参数脱敏与 OperateLog 如何分工
spring boot·vue3·traceid·spring boot 3·访问日志·apiaccesslog·操作日志
林三的日常9 小时前
【无标题】
java·spring boot·vscode·调试·后端开发
counting money10 小时前
SpringBoot 项目创建(IDEA不全,还需要修改)
java·spring boot·spring·maven
阿部多瑞 ABU10 小时前
从0到1:用 Spring Boot 3.4 + Vue3 做一个能“智能排道次“的运动会编排系统(附核心算法)
java·spring boot·后端·算法·spring
MacroZheng10 小时前
几行代码给项目集成AI功能,Spring AI 2.0太香了!
java·人工智能·spring boot
野生技术架构师10 小时前
Redis 和 MySQL 如何保证数据一致性?先更新数据库还是先删缓存,延迟双删、MQ、Canal 一次讲透
数据库·redis·缓存