当前位置: 首页 > news >正文

华为云CCE实战:从零到一,手把手教你部署SpringBoot+MySQL+Redis微服务项目

华为云CCE实战:SpringBoot+MySQL+Redis微服务云端部署全指南

引言

在数字化转型浪潮中,将传统SpringBoot应用迁移至云端已成为开发者必备技能。华为云容器引擎CCE作为企业级Kubernetes服务,为微服务部署提供了稳定高效的运行环境。本文将带您完成一个典型SpringBoot应用(含MySQL和Redis依赖)从本地开发到云端部署的全流程,重点解决三个核心问题:

  1. 如何正确处理Docker镜像中的中文字符集等细节问题
  2. 如何实现云上数据库初始化与数据迁移
  3. 如何配置服务发现实现微服务间安全通信

不同于简单的"Hello World"示例,我们模拟真实业务场景,涵盖镜像构建优化、持久化存储配置、服务网格集成等进阶内容。适合已有Docker和Kubernetes基础,希望提升云原生实践能力的开发者。

1. 环境准备与架构设计

1.1 华为云资源规划

在开始部署前,需要合理规划云资源。以下是推荐的基础配置:

资源类型规格建议数量备注
CCE集群虚拟机节点/50节点1选择与业务匹配的节点规格
节点规格4核8GB/通用计算型2开发环境可适当降低配置
弹性IP按需计费1用于外部访问
云硬盘高性能SSD/100GB2分别用于MySQL和Redis数据持久化
容器镜像仓库SWR标准版1建议与集群同区域

提示:生产环境建议启用多可用区部署,并配置自动伸缩策略。测试环境可使用小规格资源降低成本。

1.2 本地开发环境检查

确保本地环境满足以下要求:

  • JDK 8+(推荐Amazon Corretto 11)
  • Maven 3.6+
  • Docker Desktop 4.12+
  • IntelliJ IDEA(社区版即可)
  • MySQL Workbench(可选)
  • Redis Desktop Manager(可选)

验证环境是否就绪:

# 检查Java版本 java -version # 检查Maven mvn -v # 检查Docker docker --version

2. 应用容器化与镜像优化

2.1 SpringBoot应用Dockerfile深度优化

标准Dockerfile往往忽略中文字符集、时区等细节问题。以下是经过生产验证的优化版本:

# 使用官方镜像作为基础 FROM eclipse-temurin:11-jre-jammy # 设置时区与字符集 ENV TZ=Asia/Shanghai \ LANG=C.UTF-8 # 安装中文字体(解决验证码等问题) RUN apt-get update && \ apt-get install -y --no-install-recommends \ fonts-wqy-microhei \ fonts-wqy-zenhei \ ttf-mscorefonts-installer && \ rm -rf /var/lib/apt/lists/* # 创建应用目录 RUN mkdir -p /app/logs WORKDIR /app # 复制JAR文件(Maven打包后的产物) COPY target/your-app-*.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令(考虑JVM参数优化) ENTRYPOINT ["java", \ "-server", \ "-XX:+UseG1GC", \ "-XX:MaxRAMPercentage=75.0", \ "-Djava.security.egd=file:/dev/./urandom", \ "-jar", \ "app.jar"]

关键优化点:

  • 使用eclipse-temurin替代openjdk,获得更好的许可证支持
  • 显式设置时区和UTF-8字符集
  • 预装常用中文字体
  • 合理的JVM内存配置(自动适应容器内存限制)

2.2 多阶段构建与镜像瘦身

对于生产环境,推荐使用多阶段构建减少镜像体积:

# 构建阶段 FROM maven:3.8.6-eclipse-temurin-11 AS build WORKDIR /workspace COPY pom.xml . RUN mvn dependency:go-offline COPY src src RUN mvn package -DskipTests # 运行时阶段 FROM eclipse-temurin:11-jre-jammy # ...(保持之前的优化配置) COPY --from=build /workspace/target/*.jar app.jar # ...(其余配置不变)

这种构建方式可以将典型SpringBoot应用镜像从300MB+缩减到150MB左右。

3. 华为云CCE集群配置

3.1 创建Kubernetes集群

在华为云控制台完成CCE集群创建:

  1. 登录华为云控制台,进入CCE服务
  2. 选择"购买集群",填写基本信息:
    • 集群名称:dev-cluster
    • 版本:选择最新稳定版(如v1.25)
    • 网络模型:VPC网络
    • 容器网络:选择与VPC不冲突的CIDR
  3. 添加节点:
    • 选择"虚拟机节点"
    • 规格:s6.large.2(2核4GB)
    • 系统盘:高IO/100GB
    • 数量:2
  4. 高级设置:
    • 启用自动修复
    • 配置SSH密钥对
  5. 确认配置并创建(约5-10分钟)

注意:生产环境建议至少3个节点,并启用多可用区部署。

3.2 配置kubectl访问

安装最新版kubectl后,获取集群连接信息:

# 下载集群配置文件 curl -O https://my-cluster.cce.cn-north-4.myhuaweicloud.com/config # 设置KUBECONFIG环境变量 export KUBECONFIG=./config # 验证连接 kubectl get nodes

预期输出应显示2个Ready状态的节点。

4. 数据库服务部署

4.1 MySQL有状态部署

使用StatefulSet确保数据库稳定运行:

# mysql-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "your-strong-password" - name: MYSQL_DATABASE value: "app_db" ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "csi-disk" resources: requests: storage: 100Gi

应用配置并验证:

kubectl apply -f mysql-statefulset.yaml kubectl get pods -l app=mysql

4.2 数据初始化技巧

将本地SQL文件导入云上MySQL:

# 将SQL文件拷贝到集群节点 scp -i your-key.pem init.sql root@node-ip:/tmp/ # 获取MySQL Pod名称 MYSQL_POD=$(kubectl get pods -l app=mysql -o jsonpath='{.items[0].metadata.name}') # 拷贝到容器内 kubectl cp /tmp/init.sql $MYSQL_POD:/tmp/ # 执行导入 kubectl exec $MYSQL_POD -- \ mysql -uroot -p"your-strong-password" app_db < /tmp/init.sql

5. 应用部署与服务暴露

5.1 部署SpringBoot应用

创建Deployment和Service:

# springboot-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: springboot-app spec: replicas: 2 selector: matchLabels: app: springboot-app template: metadata: labels: app: springboot-app spec: containers: - name: app image: swr.cn-north-4.myhuaweicloud.com/your-namespace/your-app:v1.0 ports: - containerPort: 8080 env: - name: SPRING_DATASOURCE_URL value: "jdbc:mysql://mysql:3306/app_db?useSSL=false" - name: SPRING_DATASOURCE_USERNAME value: "root" - name: SPRING_DATASOURCE_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password - name: SPRING_REDIS_HOST value: "redis" --- apiVersion: v1 kind: Service metadata: name: springboot-app spec: selector: app: springboot-app ports: - protocol: TCP port: 80 targetPort: 8080

5.2 配置Ingress实现外部访问

# ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: springboot-app port: number: 80

应用配置后,可通过域名访问您的应用。

6. 运维与监控配置

6.1 日志收集方案

配置Fluent Bit实现日志集中收集:

# fluent-bit-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config data: fluent-bit.conf: | [SERVICE] Flush 5 Daemon Off Log_Level info [INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.* Refresh_Interval 5 [OUTPUT] Name es Match * Host elasticsearch Port 9200 Logstash_Format On Logstash_Prefix logstash

6.2 基础监控告警

使用华为云AOM服务监控关键指标:

  1. 容器CPU使用率 > 70%持续5分钟
  2. 内存使用率 > 80%持续5分钟
  3. Pod重启次数 > 3次/小时
  4. 磁盘使用率 > 85%

7. 安全加固实践

7.1 网络策略配置

限制数据库仅允许应用访问:

# network-policy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: mysql-allow-only-app spec: podSelector: matchLabels: app: mysql policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: springboot-app ports: - protocol: TCP port: 3306

7.2 敏感信息管理

使用Kubernetes Secrets管理数据库密码:

# 创建Secret kubectl create secret generic db-secret \ --from-literal=password='your-strong-password'

在Deployment中通过secretKeyRef引用。

8. 性能调优技巧

8.1 JVM参数优化

根据容器内存限制动态配置JVM:

env: - name: JAVA_OPTS value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"

8.2 连接池配置

优化HikariCP连接池:

# application-prod.properties spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.connection-timeout=30000

9. 常见问题排查

9.1 容器启动失败诊断

# 查看Pod详情 kubectl describe pod <pod-name> # 查看容器日志 kubectl logs <pod-name> -c <container-name> # 进入运行中的容器 kubectl exec -it <pod-name> -- /bin/bash

9.2 网络连接问题

检查服务发现:

# 查看Service的ClusterIP kubectl get svc mysql # 从应用Pod测试连接 kubectl exec <app-pod> -- curl -v http://mysql:3306

10. 成本优化建议

  1. 使用弹性伸缩(HPA)根据负载自动调整副本数
  2. 设置Pod资源请求和限制避免资源浪费
  3. 非生产环境可启用定时伸缩(CronHPA)
  4. 使用Spot实例运行可中断的工作负载
  5. 定期清理未使用的镜像和存储卷
http://www.jsqmd.com/news/559316/

相关文章:

  • 想以好状态享受生活:NMN十大品牌排行榜,NMN效果最好的品牌,中产家庭用它维持好体感 - 资讯焦点
  • 聊聊酒店雪茄品鉴房整屋定制雪茄柜推荐,好用的品牌有啥? - 工业推荐榜
  • Janus-Pro-7B赋能AI编程:智能代码补全与函数生成插件开发
  • 当AI开始帮你写RTL,芯片工程师的饭碗真的变了
  • 从田间到云端:用Python构建符合GB/T 37028-2018标准的农业物联网平台(国家认证数据上报协议逆向解析版)
  • 性价比最高的抗衰产品推荐,最值得入手的NMN品牌,中年人职场抗衰必备 - 资讯焦点
  • Windows 11终极优化指南:用Win11Debloat免费提升51%系统性能
  • 使用UltrISO将gho文件集成到PE系统ISO的完整指南
  • DeepSeek-Coder-V2技术深度解析:从Mixture-of-Experts架构到企业级部署
  • 南京定制假发品牌推荐 量身定制选购指南 - 资讯焦点
  • 攻克B站字幕提取难题 BiliBiliCCSubtitle实现高效字幕资源管理
  • 用STC89C52单片机+ADC0832做个智能台灯:从光敏电阻采集到PWM调光的保姆级教程
  • 别再手动读写DB块了!用C#和S7.Net Plus库高效操作西门子S7-1500 PLC数据
  • 告别‘小爱同学’:用ESP32-S3和esp-sr SDK,从零打造一个离线语音助手(含完整代码)
  • 2026年定制衣柜哪家专业,梵木里深耕十年服务北京及环京 - mypinpai
  • 2026年GEO预算指南:从万元级到数十万,如何匹配企业真实需求 - 品牌2025
  • 逆向工程实战:从零拆解二进制炸弹的闯关之旅
  • 智能AI识别之集装箱缺陷识别 集装箱数据集 集装箱缺陷数据集 集装箱凹陷数据集 集装箱锈蚀孔洞图像数据集 yolo数据集地10624期
  • 分析廊坊玻璃衣柜定制,梵木里全屋定制性价比如何? - myqiye
  • cloud-nuke高级用法:150+资源类型精准控制与批量删除
  • VCS仿真加速:选择性dump模块优化波形生成,详解VCD/FSDB/SHM/VPD方法
  • Loop:Mac窗口管理的优雅革命,开源免费的全新体验
  • 5分钟搞定!用Python快速对接Google Nano-Banana图像生成API(附完整代码)
  • 【实战】从入门到精通:泛微E10 eBuilder低代码平台全链路开发指南(附核心源码解析)
  • 机械臂控制实战:如何用哈密顿原理简化动力学方程(ROS+Gazebo案例)
  • 131.计网---第五章
  • 计算机网络(八)-- 网络层 | 路由器
  • 数据治理软件 Top10 榜单:功能对比、适用场景与实施成本全解析
  • Umi-OCR插件技术指南:从零构建专业离线文字识别系统
  • 【C++ 面试突击 · 07】大厂高频面试题:从菱形继承到const与constexpr的博弈深度解析