简称ocp是基于Spring Cloud的企业级微服务框架(用户权限管理,配置中心管理,应用管理,....),其核心的设计目标是分离前后端,快速开发部署,学习简单,功能强大,提供快速接入核心接口能力,其目标是帮助企业搭建一套类似百度能力开放平台的微服务框架;
open-capaciry-platform云原生改造与开源for Huawei Cloud
[TOC]
*改造基于开源项目: open-capacity-platform
一、背景介绍
1、open-capacity-platform
open-capacity-platform(以下简称:OCP)项目是dromara开源组织推出的一个基于Spring Cloud的企业级微服务框架。包含用户权限管理,配置中心管理,运维管理等功能模块。该项目设计目的是分离前后端,帮助企业快速开发部署,提供快速接入核心接口的能力。
2、项目分析
OCP的定位是基于Spring Cloud的企业级微服务框架,目的是帮助开发者在应用开发过程中集中精力到业务开发上。就针对OCP而言,提供了基本的日志中心微服务,并用到了普罗米修斯和Zipkin等做监控管理,这些运维、日志相关的服务本身还是需要人工运维,同样会消耗开发者精力。其次,OCP项目提供了部署在服务器和容器的方式,这种部署方式在实际企业开发应用中,需要企业去预估业务量去配置资源,但这种预判过于依赖经验,不可避免会出现采购成本过高或者服器资源不足的情况,并且灵活性和可扩展性不高。

二、方案设计
结合对OCP项目的分析,使用云上组件替换原架构的思路进行改造:将OCP用的注册中心从Eureka替换成CSE;使用RDS+DCS实现数据库上云;改用OBS实现原应用中文件上传;使用CodeHub+CloudBuild进行编译构建+制作docker镜像;使用k8s+容器基础设施承载应用;使用APM+AOM+LTS替换原有的运维+日志。
1、方案架构图

2、方案优势
OCP上云后,所有的服务可以在华为云控制台统一进行管理,打通了开发--测试--部署--运维全生命周期管理,并与其它产品预集成,开箱即用,简化应用云上开发,云上部署,简化部署、发布,简化应用上云。运维能力转到了华为云侧,不需要开发者再去维护运维服务,只需要使用运维服务即可.云原生运维提供了自动化运维和告警降噪等能力。全容器化的架构设计,任务调度更灵活,执行效率更高。利用云计算的灵活性、数据安全性、可扩展性,也可以帮助企业节省成本。
3、流程介绍
主流程 |
子任务 |
操作指导 |
|---|---|---|
| 1.准备工作 | 熟悉了解开源项目open-capacity-platform; 根据该文档中:三、云服务介绍 学习云服务; |
开源项目 [云服务介绍](# 三、云服务介绍) |
| 2.本地改造 | 开发基于本地代码进行改造,CSE替换Eureka; 使用华为云OBS替换掉原调其他厂商的对象存储服务; |
[OCP接入CSE](# 2、OCP接入CSE) [使用OBS改造file-center](# 特殊服务改造file-center) |
| 3.数据集成 | RDS 数据库初始化数据库表; 使用RDS 地址替换数据库地址; 使用DCS 地址替换数据库地址; |
[集成RDS+DCS](# 4、RDS+DCS替换原项目中的Mysql和Redis) |
| 4.镜像制作 | 代码上传CodeHub,进行代码托管; 基于云上的编译构建能力,构建docker镜像并推送到SWR; SWR中存储部署需要用到的docker镜像; |
[代码上传CodeHub](# 3、代码上传CodeHub,进行代码托管) [CoudBuild制作镜像](# 5、CloudBuild进行编译构建,构建docker镜像并推送到SWR) |
| 5.云上部署 | CCE中创建无状态负载,创建过程中关联APM; 部署完成后查看CSE中服务注册情况; CCE 创建service-ELB 方式暴露服务; 公网域名申请; 创建域名并记录解析到ELB公网IP; |
[创建负载](# 创建负载并关联APM) [创建service-ELB类型服务](# 创建service-ELB访问方式暴露服务) [实现域名访问应用](# 8、DNS实现通过域名访问应用) |
| 6.运维集成 | 部署完成后LTS配置容器日志采集; APM查看性能指标,调用链等; AOM查看容器标准日志,容器性能监控; LTS查看容器业务日志; |
[LTS日志采集](# 7、CCE接入LTS云日志) APM-调用链 AOM查看日志文件 [LTS云日志](# 7、CCE接入LTS云日志) |
| 7.结果验证 | CCE中负载运行正常; 用户业务访问成功; |
[结果验证](# 六、实现效果) |
三、云服务介绍
1、涉及云服务介绍
华为云CSE:微服务引擎(Cloud Service Engine)是用于微服务应用的云中间件,为用户提供注册发现、服务治理、配置管理等高性能和高韧性的企业级云服务能力;CSE可无缝兼容SpringCloud、ServiceComb等开源生态;用户也可结合其他云服务,快速构建云原生微服务体系,实现微服务应用的快速开发和高可用运维。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| CSE | 查看服务注册 | https://support.huaweicloud.com/usermanual-cse/cse_usermanual_0019.html | 了解 |
| CSE | 本地代码改造 | https://support.huaweicloud.com/qs-cse/cse_qs_0002.html | 操作 |
| CSE | 本地代码改造 | https://support.huaweicloud.com/devg-cse/cse_devg_0037.html#cse_devg_0037__section56161456192411 | 了解 |
| CSE | 本地代码改造 | https://support.huaweicloud.com/devg-cse/cse_devg_0010.html | 操作 |
| CSE | 基于本地安装CSE | https://support.huaweicloud.com/devg-cse/cse_devg_0036.html | 操作 |
华为云CodeHub:代码托管(CodeHub)源自华为千亿级代码管理经验,基于Git,提供企业代码托管的全方位服务,为软件开发者提供基于Git的在线代码托管服务,包括代码克隆/下载/提交/推送/比较/合并/分支/Code Review等功能。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| CodeHub | 创建代码仓 | https://support.huaweicloud.com/usermanual-codehub/devcloud_hlp_00035.html | 操作 |
| CodeHub | 创建并配置秘钥 | https://support.huaweicloud.com/usermanual-codehub/devcloud_hlp_00083.html | 了解 |
| CodeHub | Git的代码托管入门 | https://support.huaweicloud.com/qs-codehub/codehub_qs_1000.html | 了解 |
华为云CloudBuild:编译构建(CloudBuild)基于云端大规模并发加速,为客户提供高速、低成本、配置简单的混合语言构建能力,帮助客户缩短构建时间,提升构建效率。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| CloudBuild | 创建编译任务 | https://support.huaweicloud.com/codeci_faq/codeci_faq_1045.html | 操作 |
| CloudBuild | Maven构建 | https://support.huaweicloud.com/qs-codeci/codeci_qs_2001.html | 操作 |
| CloudBuild | 镜像推送到SWR | https://support.huaweicloud.com/usermanual-codeci/codeci_ug_0013.html | 操作 |
华为云SWR:容器镜像服务(SoftWare Repository for Container)是一种支持容器镜像全生命周期管理的服务, 提供简单易用、安全可靠的镜像管理功能,帮助用户快速部署容器化服务。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| SWR | SWR创建镜像组织 | https://support.huaweicloud.com/usermanual-swr/swr_01_0014.html | 了解 |
| SWR | 镜像同步 | https://support.huaweicloud.com/usermanual-swr/swr_01_0101.html | 了解 |
| SWR | 镜像同步 | https://support.huaweicloud.com/swr_faq/swr_faq_0022.html | 了解 |
华为云CCE:云容器引擎(Cloud Container Engine,简称CCE)提供高度可扩展的、高性能的企业级Kubernetes集群,支持运行Docker容器。借助云容器引擎,您可以在云上轻松部署、管理和扩展容器化应用程序。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| CCE | 创建CCE集群 | https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html | 了解 |
| CCE | 创建CCE集群 | https://support.huaweicloud.com/usermanual-cce/cce_10_0363.html | 了解 |
| CCE | 负载创建 | https://support.huaweicloud.com/usermanual-cce/cce_10_0006.html | 操作 |
| CCE | 负载创建 | https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html | 操作 |
| CCE | 创建service | https://support.huaweicloud.com/usermanual-cce/cce_10_0249.html | 操作 |
| CCE | 创建service | https://support.huaweicloud.com/usermanual-cce/cce_10_0011.html | 操作 |
| CCE | service-ELB创建 | https://support.huaweicloud.com/usermanual-cce/cce_10_0014.html | 精读 |
| CCE | 监控概述 | https://support.huaweicloud.com/usermanual-cce/cce_10_0182.html | 了解 |
华为云RDS:云数据库RDS(Relational Database Service,简称RDS)是一种基于云计算平台的稳定可靠、弹性伸缩、便捷管理的在线云数据库服务。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| RDS | 购买RDS | https://support.huaweicloud.com/qs-rds/rds_02_0008.html | 了解 |
| RDS | 连接实例 | https://support.huaweicloud.com/usermanual-rds/rds_mysql_connect_02.html | 了解 |
| RDS | 创建数据库 | https://support.huaweicloud.com/usermanual-das/das_04_0042.html | 操作 |
华为云DCS:分布式缓存服务(Distributed Cache Service,简称DCS)是华为云提供的一款内存数据库服务,兼容了Redis和Memcached两种内存数据库引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| DCS | 购买DCS | https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713002.html | 了解 |
| DCS | 修改库安全组规则 | https://support.huaweicloud.com/dcs_faq/dcs-faq-0713002.html | 精读 |
| DCS | 连接Redis | https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713005.html | 操作 |
华为云OBS: 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,使用时无需考虑容量限制,并且提供多种存储类型供选择,满足客户各类业务场景诉求。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| OBS | 创建桶 | https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html | 了解 |
| OBS | Java SDK | https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0001.html | 操作 |
| OBS | 快速入门-Java | https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0101.html | 操作 |
华为云ELB:华为云弹性负载均衡( Elastic Load Balance)将访问流量自动分发到多台云服务器,扩展应用系统对外的服务能力,实现更高水平的应用容错。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| ELB | 创建负载 | https://support.huaweicloud.com/usermanual-elb/zh-cn_topic_0015479967.html | 操作 |
| ELB | 绑定公网IP | https://support.huaweicloud.com/usermanual-elb/elb_ug_fz_0009.html | 操作 |
华为云DNS:云解析服务(Domain Name Service)提供高可用,高扩展的权威DNS服务和DNS管理服务,帮助您将域名或应用资源转换成用于计算机连接的IP地址,从而将最终用户路由到相应的应用资源上。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| DNS | 创建公网域名 | https://support.huaweicloud.com/usermanual-dns/zh-cn_topic_0035467702.html | 了解 |
| DNS | 添加域名解析 | https://support.huaweicloud.com/usermanual-dns/dns_usermanual_06012.html | 操作 |
华为云APM:应用性能管理(Application Performance Management)是实时监控并管理企业应用性能和故障的云服务,帮助企业快速解决分布式架构下问题定位和性能瓶颈分析难题,改善用户体验。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| APM | CCE接入APM | https://support.huaweicloud.com/apm_faq/apm_03_0018.html | 操作 |
| APM | 查看应用指标 | https://support.huaweicloud.com/usermanual-apm2/apm_07_0007.html | 了解 |
| APM | 查看应用调用链 | https://support.huaweicloud.com/usermanual-apm2/apm_07_0018.html | 了解 |
| APM | 查看应用拓扑 | https://support.huaweicloud.com/usermanual-apm2/apm_07_0019.html | 了解 |
华为云AOM:应用运维管理(Application Operations Management)是云上应用的一站式立体化运维管理平台,实时监控应用及云资源,采集各项指标、日志及事件等数据分析应用健康状态,提供告警及数据可视化功能,帮助您及时发现故障,全面掌握应用、资源及业务的实时运行状况。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| AOM | 开通AOM2.0 | https://support.huaweicloud.com/usermanual-aom2/agent_01_0013.html | 了解 |
| AOM | 查看容器标准日志 | https://support.huaweicloud.com/usermanual-aom2/mon_01_0045.html | 了解 |
| AOM | 查看容器性能指标 | https://support.huaweicloud.com/usermanual-aom2/mon_01_0025.html | 了解 |
华为云LTS:云日志服务(Log Tank Service)提供一站式日志采集、秒级搜索、海量存储、结构化处理、转储和可视化图表等功能,满足应用运维、网络日志可视化分析、等保合规和运营分析等应用场景。帮助文档
云服务 |
功能模块文档 |
文档地址 |
建议掌握程度 (了解-操作-精读) |
|---|---|---|---|
| LTS | 创建容器主机组 | https://support.huaweicloud.com/usermanual-lts/lts_04_0511.html | 精读 |
| LTS | 应用日志查看 | https://support.huaweicloud.com/usermanual-lts/lts_05_0005.html | 了解 |
2、云服务学习
相关实验
实验内容 |
实验地址 |
建议 |
|---|---|---|
| 使用ServiceStage托管和治理天气预报应用 | https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXPX003+Self-paced/about | 必做 |
| 数据库服务实践 | https://lab.huaweicloud.com/testdetail_520 | 熟悉 |
| 云容器快速搭建网站 | https://lab.huaweicloud.com/testdetail_1931 | 熟悉 |
视频课程
四、环境准备
-
开发环境:
环境Windows 版本2019 JDK 1.8 Maven 3.6.3 SpringBoot 2.1.16.RELEASE SpringCloud Greenwich.SR6 SpringCloudHuawei 1.6.1-Greenwich IDEA 社区版-2022.1.3 Windows 2019 -
华为云环境:
注册云账号,并完成实名认证,具体服务可在具体用到时再创建,避免资源浪费。
五、开发流程
1、OCP本地部署运行
*如果直接推到远程仓库CodeHub上,再在代码仓里直接做修改也可以,那就不用在本地创建环境了,这样不能在本地进行调试,有利有弊。如果不想在本地部署运行,可以不安装MySQL、Redis,步骤3.中可以暂不修改数据库配置,并跳过4.5.两步
-
本地环境准备:
- 安装数据库MySQL、Redis、Git
- 参考文档:MySQL8.x安装、Redis安装、Git安装
-
克隆开源项目open-capacity-platform到本地,拉取的是2.0.1分支下的代码,可参考以下步骤:
-
想要保存项目的文件夹下,邮件打开Git Bash Here,输入克隆指令:
git clone -b 2.0.1 https://gitee.com/dromara/open-capacity-platform.git
-
-
本地部署运行验证项目可行性
-
IDEA导入解压好的项目,执行mvn clean清理一下目标缓存;
-
模块处理:
(1)本次改造因为使用云上的运维管理+日志服务,删除监控中心monitor-center;
(2)有两个网关:api-gateway使用的是zuul网关、new-api-gateway使用的是gateway网关,本次改造选用的是new-api-gateway;
(3)其中tuning-center属于调测中心,是对单独模块接口进行调测使用的, 也删掉;
(4)要删掉的模块在总的open-capacity-platform的pom.xml文件中,注释掉对应的,并删除对应模块的文件包,避免后面使用DevCloud进行编译构建时在这些服务上报错。

-
找到sql文件夹,利用文件夹中的sql文件初始化数据库;
-
删除没有用到的模块后,修改项目中微服务模块中的resources中的配置文件,修改mysql和redis配置参数,本地部署的话,需要修改redis地址,端口没改动的话还是6379;MySQL需修改url地址,端口没改动的话还是3306,修改用户名和密码。
(如果mysql安装是8.x版本,需要修改url,添加参数配置时区,如serverTimezone=UTC,也可以设置成其他时区)
-
-
本地运行测试:
先启动Eureka注册中心register-center/eureka-center,该服务多环境配置指定的是的application-slave0.yml配置,所以默认端口是1111,随后启动最小启动(eureka-center、new-api-gateway、auth-server、user-center、back-center)的其他微服务,浏览器访问本地1111端口,查看服务是否注册成功。
-
服务使用测试:
访问前端服务,8066端口,使用管理员账号admin登录,密码admin。如果使用其他账号登录,需要将sys_user表中其他用户对应的enabled字段修改为1,可以将admin的密码复制给其他用户,其他用户可以先用密码admin登录,登录后再在系统中修改。

2、OCP代码改造
使用云上微服务引擎CSE替换原有的注册中心
-
为华为云账号新增访问密钥AK/AK,记得保存.csv文件,操作指导。
-
拿到CSE注册中心和配置中心地址:
-
登录华为云账号,进入控制台;
-
左侧服务列表中搜索服务CSE,点击进入,弹出授权,点击确认,IAM子账号可能会授权失败,但不影响,切到旧版界面,旧版提供了一个专业版CSE可以免费使用。
***注意:**本次改造所用的华为云服务需要都在同一区域下,这里是在广州,也可以选择其他区域,所有服务保持一致即可。

-
在旧版界面拿到注册中心和配置中心地址

-
-
替换依赖Eureka-->CSE:
-
修改服务中的pom文件,将Eureka依赖换成spring-cloud-huawei的依赖,版本需要对照,修改如下:
<!--选用eureka时打开--> <!--< dependency > <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency >--> <dependency> <groupId>com.huaweicloud</groupId> <artifactId>spring-cloud-starter-huawei-service-engine-gateway</artifactId> <version>1.6.1-Greenwich</version> <!--项目中已有引入swagger依赖,这里剔除防止依赖冲突--> <exclusions> <exclusion> <groupId>com.huaweicloud</groupId> <artifactId>spring-cloud-starter-huawei-swagger</artifactId> </exclusion> </exclusions> </dependency> -
支持版本对照表:
Branch Spring Cloud Huawei Latest Version Compiled Spring Cloud Version Compiled Spring Boot Version master 1.10.5-2021.0.x 2021.0.3 2.6.7 2020.0.x 1.10.5-2020.0.x 2020.0.5 2.5.12 Hoxton 1.9.3-Hoxton Hoxton.SR9 2.3.5.RELEASE Greenwich 1.6.1-Greenwich Greenwich.SR6 2.1.6-RELEASE Finchley 1.6.1-Finchley 2.0.4.RELEASE 2.0.9.RELEASE Edgware 1.2.0-Edgware 1.3.6.RELEASE 1.5.22.RELEASE
-
-
修改配置文件bootstrap,配置CSE:
-
对于涉及注册中心的服务,修改resources目录下的bootstrap或application配置文件,删除Euraka配置,新增CSE配置,CSE配置如下:
spring: cloud: servicecomb: discovery: enabled: true watch: false address: https://xxxxxxx #替换成第2步拿到的CSE服务注册中心地址 appName: OCP-application #应用名,可自定义,所有服务要保持统一 serviceName: ${spring.application.name} version: 0.0.1 healthCheckInterval: 30 config: serverAddr: https://xxxxxxx #替换成第2步拿到的CSE配置中心地址 serverType: config-center credentials: enabled: true accessKey: 你的AK #替换成第1步拿到的Ak值 secretKey: 你的SK #替换成第1步拿到的Sk值 akskCustomCipher: default project: cn-south-1 #替换成你的CSE服务所在区域,由第1步确定
-
-
CSE接入效果:
-
file-center微服务改造:
操作流程:
购买OBS--->添加Maven依赖--->配置文件配置OBS参数--->创建OBS客户端bean--->
编写OBS对象操作业务层方法--->文件操作类型枚举中添加华为云--->修改Controller中接口方法中默认的枚举类型为华为云
-
file-center服务改造——对象存储使用华为云OBS:
-
购买OBS:控制台搜OBS,进入OBS首页界面点击右上购买即可,参数可参考以下配置。

-
添加依赖:在file-center服务的pom文件中,集成华为OBS的SDK。
<dependency> <groupId>com.huaweicloud</groupId> <artifactId>esdk-obs-java-bundle</artifactId> <version>3.21.11</version> </dependency> -
修改配置文件:在file-center服务的application.yml文件中增加OBS配置,可参考以下配置。
-

-
具体配置
obs: endPoint: //服务所在区域对应的终端节点 ak: //你的ak sk: //你的sk bucketName: //桶名称 domain: //https://访问域名 访问域名可在OBS桶的“概览”中找到,其值实际就是:桶名称.终端节点
-
创建OBS配置类
-
按照file-center服务中原有的代码逻辑,为OBS客户端类创建配置类,配置Bean。在config目录下创建HuaweiOSSConfig配置类,配置类中代码如下:
package com.open.capacity.oss.config; import com.obs.services.ObsClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 华为云配置 */ @Configuration public class HuaweiOSSConfig { @Value("${obs.endpoint}") private String endpoint; @Value("${obs.ak}") private String accessKeyId; @Value("${obs.sk}") private String accessKeySecret; /** * 华为云文件存储client */ @Bean @ConditionalOnProperty(name = "obs.ak", matchIfMissing = true) public ObsClient ossClient() { ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endpoint); return obsClient; } }
-
-
创建华为与OBS服务层实现类
-
创建文件服务FileService接口的华为云OBS实现类,如HuaweiOssServiceImpl,具体代码如下:
package com.open.capacity.oss.service.impl; import com.obs.services.ObsClient; import com.open.capacity.oss.dao.FileDao; import com.open.capacity.oss.model.FileInfo; import com.open.capacity.oss.model.FileType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** * 华为云obs存储文件 */ @Service("huaweiOssServiceImpl") @Slf4j public class HuaweiOssServiceImpl extends AbstractFileService { @Autowired private FileDao fileDao; @Override protected FileDao getFileDao() { return fileDao; } @Override protected FileType fileType() { return FileType.HUAWEI; } @Autowired private ObsClient obsClient; @Value("${obs.bucketName}") private String bucketName; @Value("${obs.domain}") private String domain; @Override protected void uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception { obsClient.putObject(bucketName, fileInfo.getName(), file.getInputStream()); fileInfo.setUrl(domain + "/" + fileInfo.getName()); } @Override protected boolean deleteFile(FileInfo fileInfo) { obsClient.deleteObject(bucketName, fileInfo.getName()); return true; } /** * 上传大文件,分片上传 每片一个临时文件,待实现 */ @Override protected void chunkFile(String guid, Integer chunk, MultipartFile file, Integer chunks, String filePath) throws Exception { } /** * 合并分片文件,每一个小片合并一个完整文件,待实现 */ @Override protected FileInfo mergeFile(String guid, String fileName, String filePath) throws Exception { return null; } }
-
-
添加枚举、修改OssServiceFactory、修改FileController
-
model目录下的枚举FileType中添加华为枚举,HUAWEI
-
config目录下的OssServiceFactory类中添加华为云的FileService实现类,添加以下代码:
//类中添加属性: @Autowored private FileService huaweiOssServiceImpl; //init方法中添加: map.put(FileType.HUAWEI,huaweiOssServiceImpl); -
controller目录下的FileController中,将所有的FileType.XXX枚举都改为FileType.HUAWEI
-
-
file-center服务中其他云服务厂商的对象存储可以不删,但要想有效使用,需要去其官网开通服务,修改配置。如要删除,可按照以上引入华为云OBS的流程去删除对应内容即可。
-
-
-
APM链路ID集成到日志:
将APM中的每次请求对应的链路ID打印到OCP日志中,并通过LTS根据链路ID过滤日志,查询具体链路ID相关的日志。
代码改造:创建MdcKey类记录映射关系,并修改内部工具inner-intergration中日志模块log-spring-boot-starter的logback配置文件,即resources下的logback-spring.xml,将链路ID添加到日志格式中。
- MdcKey类
public class MdcKeyTest { public final static String TRACE_ID_KEY = "apm-traceid"; //只有被采样的数据才有apm-traceId public final static String GTRACE_ID_KEY = "apm-gtraceid"; //所有包括未采样的调用链都有apm-gtraceId public final static String SPAN_ID_KEY = "apm-spanid"; }- logback-spring.xml文件修改日志格式,添加APM的链路ID:traceID:%X{apm-traceid}
<property name="CONSOLE_LOG_PATTERN" value="[${APP_NAME}:${ServerIP}:${ServerPort}] [ traceId: %X{apm-traceid} ] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" /> <property name="CONSOLE_LOG_PATTERN_NO_COLOR" value="[${APP_NAME}:${ServerIP}:${ServerPort}] [ traceId: %X{apm-traceid} ] %d{yyyy-MM-dd HH:mm:ss.SSS} %level ${PID} [%thread] %logger %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />
3、代码托管
代码上传CodeHub,进行代码托管。代码上云后,可在云端仓库直接修改,也可以先在本地开发调测,成功后再同步到云端仓库
-
在CodeHub创建仓库。
-
代码上云:
-
克隆新建仓库到本地,拿到.git文件夹,并将该文件夹复制到ocp项目父目录下,并在此目录右键打开Git Bash Here

-
使用git将ocp代码推送到CodeHub远程仓库

-
4、数据库配置
RDS+DCS替换原项目中的Mysql和Redis
-
购买RDS:
-
华为云控制台左侧服务列表搜索RDS,进入RDS首页,点击购买,配置可参考购买RDS fro MySQL(只看步骤1即可)

-
使用云上DAS服务连接登录数据库

-
查看RDS的连接信息

-
通过DAS导入项目目录下的sql文件,初始化RDS数据库

-
-
购买DCS:
-
华为云控制台左侧服务列表搜索DCS,进入DCS首页,点击购买,配置可参考购买Redis实例
-


-
获取redis连接信息

-
-
修改数据库配置,修改CodeHub代码仓中微服务的MySQL和Redis配置。也可以在本地修改,再推到CodeHub远程仓库,需要注意以下几点:
- MySQL和Redis配置端口,要根据再购买RDS和DCS配置的端口对照,不一定是3306和6379;
- 如果RDS购买的是8.0版本的MySQL,再数据库配置中,url中要配置时区参数,如serverTimezone=UTC;
6、CloudBuild编译构建
-
登录华为云,进入控制台,搜索进入DevCloud首页,点击左侧菜单栏中的“代码托管”,选择自己的仓库。

-
点击“设置构建”进入新建构建任务:代码源—>构建模板


-
构建配置+制作镜像并推送到SWR配置


-
执行编译构建任务,并查看结果

-
注意:auth-sso、generator-center没有Dockerfile文件,需要自己的添加,如auth-sso中:

-
*编译构建和打包镜像报错请仔细阅读报错信息后参考该文档中[七、问题记录](# 七、问题记录)
-
**需要制作镜像的服务有:**file-center、generator-center、new-api-gateway、job-admin、auth-server、auth-sso、back-senter、user-center。其中前端服务back-center可以先不制作镜像,因为只用配置的路由地址需要路由服务在CCE中部署之后才能确定;job-admin也先不制作镜像,后面要改造成华为云OBS。
7、应用部署
使用云容器引擎CCE对项目进行容器化部署+管理
-
购买CCE集群
-
控制台搜CCE,进入CCE控制首页,点击购买CCE集群

-
集群配置,可参考以下配置参数,区域跟之前服务保持一致。

-
插件配置、规格确认

-
集群创建成功后,回到集群管理,点击进如具体的集群中,点击左侧菜单中节点管理,点击界面右上创建节点

-
配置节点,可参考以下配置


-
-
创建负载并关联APM
-
点击所建集群进入集群详细操作界面,如下,创建无状态负载

-
创建负载配置,包含接入APM


-
接入APM验证,控制台搜索APM,使用新版控制台,点击应用监控—>应用列表

-
**根据以上创建负载流程,为以下服务创建负载:**file-center、generator-center、new-api-gateway、job-admin、auth-server、auth-sso、back-senter、user-center、workflow-center。
-
负载创建完成后,可在CSE控制台查看需要注册的服务是否注册成功。
-
-
创建service-ELB访问方式暴露服务
-
注册中CSE的服务可以通过路由跳转,不需要配置服务发现。需要配置服务发现的微服务有:new-api-gateway、back-center、job-admin。
-
创建负载均衡ELB,控制台搜索ELB,点击右上购买,购买完成后可查看该ELB绑定的公网IP。


-
这里可以先跳到8、DNS实现通过域名访问应用
-
-
为new-api-gateway服务创建负载均衡访问。
-
点击进入具体负载详情界面,点击访问方式,创建serviceELB服务

-
负载均衡的服务发现创建完成后,就可以通过之前ELB绑定的公网IP+9200 在公网环境下访问到new-api-gateway服务。
-
-
为back-center服务创建负载均衡访问。
-
back-center镜像重新制作:前端服务back-center中有配置路由的地址,前端服务后面可定是要通过外网访问,所以这里前端服务中的路由地址也要修改为公网地址。可以用上面为new-api-gateway创建服务发现后的外网访问方式;配置位置如下:

-
修改后重新制作back-center镜像,步骤参考5、CloudBuild进行编译构建,构建docker镜像并推送到SWR
-
为back-center创建负载均衡类型的服务发现,步骤同为new-api-gateway创建服务发现一样,端口与服务配置文件端口保持一致:8066。
-
-
为job-admin服务创建负载均衡访问。
为了支撑运营相关工作,降低业务操作风险,提升生产操作质量,急需建设统一的调度系统,job-admin为调度系统中的执行器,负责接收调度请求并执行任务逻辑,接收“调度中心”的执行请求、终止请求和日志请求等。
-
为job-admin创建负载均衡类型的服务发现,步骤同为new-api-gateway创建服务发现一样,端口与服务配置文件端口保持一致:8888。
-
修改数据库中job-admin的三个接口对应的访问路径:在user-center库中的sys_memu表。

-
-
至此,基于CCE+CSE服务部署基本完成。
8、接入LTS云日志
-
控制台进入LTS首页界面,创建日志组和主机组,使用其自动创建。

-
CCE日志接入,LTS首页选择日志接入,点击云容器引擎CCE-应用日志

-
接入日志配置
-
选择日志流

-
安装日志采集组件:确认安装完毕
-
选择主机组

-
采集配置

-
接入完成,查看日志流中收集到的日志

-
-
CCE接入LTS完成。
9、配置DNS
-
域名注册:注册地址

-
创建公网域名

-
点击刚刚创建的公网域名,进入域名详情页,点击右上“添加记录集”

-
再次点公网域名,查看解析记录,找到对应域名,便可使用该域名去访问OCP系统。

10、OCP业务访问
六、实现效果
1、效果
-
服务注册到CSE,为用户提供注册发现、服务治理、配置管理等高性能和高韧性的企业级云服务能力;CSE可无缝兼容Spring Cloud、ServiceComb等开源生态;用户也可结合其他云服务,快速构建云原生微服务体系,实现微服务应用的快速开发和高可用运维。

-
CCE中负载运行正常,CCE基于业界主流的Docker和Kubernetes开源技术构建的容器服务,提供众多契合企业大规模容器集群场景的功能,在系统可靠性、高性能、开源社区兼容性等多个方面具有独特的优势,满足企业在构建容器云方面的各种需求。

-
OCP应用基础功能使用正常
-
使用公网域名访问8066端口,登录admin:admin

-
-
LTS中使用APM链路ID查询次链路链路ID相关的日志。APM提供实时监控并管理企业应用性能和故障的云服务,帮助企业快速解决分布式架构下问题定位和性能瓶颈分析难题,改善用户体验。LTS提供一站式日志采集、秒级搜索、海量存储、结构化处理、转储和可视化图表等功能,满足应用运维、网络日志可视化分析、等保合规和运营分析等应用场景。
-
APM告警使用:告警是指接入APM Agent的服务在触发告警条件时上报的信息,以便您在第一时间获取到服务的异常状况,进而迅速处理故障,避免造成业务损失。
2、优化方案
* 使用环境变量灵活配置
由于之前的一些配置都写死在了代码中,如mysql的配置,如后期mysql服务器地址出现变动,还要修改源码后重新编译构建、制作镜像;这里CCE提供的环境变量来配置mysql参数等,后期对应配置参数出现变动,直接在CCE中对应的负载中修改其环境变量中的值即可,不需要再重新编译构建代码。
-
使用CCE创建负载时的环境变量替换掉写在代码里的数据库配置,以file-center服务为例:
-
修改配置文件
-
修改application.yml中mysql、redis的相关配置:这里是修改了mysql的主机ip和用户名密码、redis的主机ip

-
-
重新制作file-center镜像
配置文件修改后push到远程仓库CodeHub中,之后编译构建,构建file-center新的镜像即可。流程参考[制作镜像](# 5、CloudBuild进行编译构建,构建docker镜像并推送到SWR)。
-
升级负载
-
负载升级入口

-
升级项1:升级镜像版本

-
升级项2:配置环境变量

-
-
业务使用测试-文件上传
-
使用OCP系统,上传图片

-
查看RDS中是否有上传图片信息

-
-
* 使用流水线(CodeArts Pipeline)实现持续交付
模块在进行版本更新时,需要再次进行编译构建,创建镜像,手动在CCE进行镜像升级,频繁的版本更新操作比较麻烦、耗时,可以使用流水线CloudPipeline实现可视化、可定制的持续交付服务,实现缩短交付周期和提升交付质量的效果。
-
创建流水线,以user-center微服务为例,操作流程如下:
-
在CodeArts首页顶部菜单栏选择“服务”下的“流水线”;在流水线列表点击“新建流水线”;配置OCP项目所在的仓库信息;选择空白模板;
-
在流水线配置页面执行:“基本信息”中修改名称;“参数设置”中配置版本参数;“执行计划”中配置触发;“工作流”中配置代码检查、构建、部署任务;


- 添加代码检查任务:新建代码检查;在OCP对应仓库明后,点击创建;流水线配置选择对应代码检查任务;检查模式选择Full。
- 添加构建任务:新建构建;选择Maven-容器模板;配置“制作镜像并推送到SWR仓库”。



- 添加部署任务:新建部署任务;自定义应用名;部署模板选择“Kubernetes快速部署(CCE集群)”;配置任务;选择“保存”。


-
保存流水线,Push更新内容到user-center模块。可以看到流水线被触发执行。

-
七、问题记录
| 序号 | 问题 | 主要报错信息 | 解决方法 |
|---|---|---|---|
| 1 | 项目启动失败,报数据库链接失败或时区问题 | connection failed或time zone error | 将配置文件中的数据库配置参数修改为自己的;MySQL8.x需要指定时区,如serverTimezone=UTC |
| 2 | wrokflow-center启动失败 | ![]() |
该项目中使用的flowable工作流引擎,其中application配置文件中,将database-schema-update参数值修改为true,即会对所有表进行更新,表不存在的话则自动建表,开发时常用该值。首次启动表创建好后可以还该回false,false标识表不存在或版本不匹配则抛出异常。 |
| 3 | 编译构建失败 | Error: org/springframework/boot/maven/RepackageMojo has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0 | pom文件中指定spring-boot-maven-plugin插件的版本,可设置成桶springBoot同一版本:2.1.16.RELEASE |
| 4 | 打包镜像失败:基础镜像找不到 | 执行docker命令失败,错误信息为:Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/c2/c2274a1a0e2786ee9101b08f76111f9ab8019e368dce1e325d3c284a0ca33397/data?verify=1668599680-s2lXdeatlphUqV3wNPTNXpoTExE%3D: net/http: TLS handshake timeout | 可以修改基础镜像为java:8 |
| 5 | 打包镜像失败:提示xxx.jar包找不到 | [ERROR] [制作镜像并推送到SWR仓库:external_docker_builder] : 执行docker命令失败,错误信息为:ADD failed: stat /var/lib/docker/tmp/docker-builder507223225/user-center: no such file or directory | 1、jar包命名是否正确,是否带jar后缀;2、pom文件中标签中是否配置为${project.artifactId},该值也该是跟Dockerfile中的jar包名一致 |
| 6 | 验证码生成失败,浏览器不是500 | 当为前端服务创建service_ELB服务发现后用域名或公网ip访问前端时,验证法获取失败。浏览器查看状态码不是500,证明不是后端服务出错 | 前端服务中view.static.module.config.js中的base_server,该值是配的路由服务地址,由于前端是从公网访问,所以路由地址也要配成公网地址 |
| 7 | 验证码生成失败,浏览器是500 | 当为前端服务创建service_ELB服务发现后用域名或公网ip访问前端时,验证法获取失败。浏览器查看状态码是500,证明是后端服务报错。查看日志,发现没有走到auth-server,卡在了路由服务。 | 错误原因:gateway默认使用的是webFlux,而Tomcat使用的是netty,项目中不应引入Tomcat-embed-core依赖。解决办法:在gateway项目pom依赖中使用标签去除Tomcat-embed-core或spring-boot-starter-tomcat依赖。 |
| 8 | 部署到CCE后负载运行报错,链接RDS失败 | 负载创建后,状态为“运行中”但CSE中却没有实例信息,且负载的日志中报错**:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.**连接数据库失败。 | RDS使用的安全组没有对容器网段(CCE容器的集群信息页面可以看到容器网段)放开3306端口,添加对应安全组的入口规则,对容器网段放开3306端口。 |
Introduction
简称ocp是基于Spring Cloud的企业级微服务框架(用户权限管理,配置中心管理,应用管理,....),其核心的设计目标是分离前后端,快速开发部署,学习简单,功能强大,提供快速接入核心接口能力,其目标是帮助企业搭建一套类似百度能力开放平台的微服务框架;
Customize my domain














