同步操作将从 dromara/open-capacity-platform 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
[TOC]
open-capacity-platform(以下简称:OCP)项目是dromara开源组织推出的一个基于Spring Cloud的企业级微服务框架。包含用户权限管理,配置中心管理,运维管理等功能模块。该项目设计目的是分离前后端,帮助企业快速开发部署,提供快速接入核心接口的能力。
OCP的定位是基于Spring Cloud的企业级微服务框架,目的是帮助开发者在应用开发过程中集中精力到业务开发上。就针对OCP而言,提供了基本的日志中心微服务,并用到了普罗米修斯和Zipkin等做监控管理,这些运维、日志相关的服务本身还是需要人工运维,同样会消耗开发者精力。其次,OCP项目提供了部署在服务器和容器的方式,这种部署方式在实际企业开发应用中,需要企业去预估业务量去配置资源,但这种预判过于依赖经验,不可避免会出现采购成本过高或者服器资源不足的情况,并且灵活性和可扩展性不高。
结合对OCP项目的分析,使用云上组件替换原架构的思路进行改造:将OCP用的注册中心从Eureka替换成CSE;使用RDS+DCS实现数据库上云;改用OBS实现原应用中文件上传;使用CodeHub+CloudBuild进行编译构建+制作docker镜像;使用k8s+容器基础设施承载应用;使用APM+AOM+LTS替换原有的运维+日志。
OCP上云后,所有的服务可以在华为云控制台统一进行管理,打通了开发--测试--部署--运维全生命周期管理,并与其它产品预集成,开箱即用,简化应用云上开发,云上部署,简化部署、发布,简化应用上云。运维能力转到了华为云侧,不需要开发者再去维护运维服务,只需要使用运维服务即可.云原生运维提供了自动化运维和告警降噪等能力。全容器化的架构设计,任务调度更灵活,执行效率更高。利用云计算的灵活性、数据安全性、可扩展性,也可以帮助企业节省成本。
主流程 |
子任务 |
操作指导 |
---|---|---|
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中负载运行正常; 用户业务访问成功; |
[结果验证](# 六、实现效果) |
华为云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 | 了解 |
相关实验
实验内容 |
实验地址 |
建议 |
---|---|---|
使用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 |
华为云环境:
注册云账号,并完成实名认证,具体服务可在具体用到时再创建,避免资源浪费。
*如果直接推到远程仓库CodeHub上,再在代码仓里直接做修改也可以,那就不用在本地创建环境了,这样不能在本地进行调试,有利有弊。如果不想在本地部署运行,可以不安装MySQL、Redis,步骤3.中可以暂不修改数据库配置,并跳过4.5.两步
想要保存项目的文件夹下,邮件打开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登录,登录后再在系统中修改。
使用云上微服务引擎CSE替换原有的注册中心
登录华为云账号,进入控制台;
左侧服务列表中搜索服务CSE,点击进入,弹出授权,点击确认,IAM子账号可能会授权失败,但不影响,切到旧版界面,旧版提供了一个专业版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 |
对于涉及注册中心的服务,修改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步确定
操作流程:
购买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打印到OCP日志中,并通过LTS根据链路ID过滤日志,查询具体链路ID相关的日志。
代码改造:创建MdcKey类记录映射关系,并修改内部工具inner-intergration中日志模块log-spring-boot-starter的logback配置文件,即resources下的logback-spring.xml,将链路ID添加到日志格式中。
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";
}
<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}" />
代码上传CodeHub,进行代码托管。代码上云后,可在云端仓库直接修改,也可以先在本地开发调测,成功后再同步到云端仓库
克隆新建仓库到本地,拿到.git文件夹,并将该文件夹复制到ocp项目父目录下,并在此目录右键打开Git Bash Here
使用git将ocp代码推送到CodeHub远程仓库
RDS+DCS替换原项目中的Mysql和Redis
华为云控制台左侧服务列表搜索RDS,进入RDS首页,点击购买,配置可参考购买RDS fro MySQL(只看步骤1即可)
使用云上DAS服务连接登录数据库
查看RDS的连接信息
通过DAS导入项目目录下的sql文件,初始化RDS数据库
华为云控制台左侧服务列表搜索DCS,进入DCS首页,点击购买,配置可参考购买Redis实例
获取redis连接信息
*编译构建和打包镜像报错请仔细阅读报错信息后参考该文档中[七、问题记录](# 七、问题记录)
**需要制作镜像的服务有:**file-center、generator-center、new-api-gateway、job-admin、auth-server、auth-sso、back-senter、user-center。其中前端服务back-center可以先不制作镜像,因为只用配置的路由地址需要路由服务在CCE中部署之后才能确定;job-admin也先不制作镜像,后面要改造成华为云OBS。
使用云容器引擎CCE对项目进行容器化部署+管理
控制台搜CCE,进入CCE控制首页,点击购买CCE集群
集群配置,可参考以下配置参数,区域跟之前服务保持一致。
插件配置、规格确认
集群创建成功后,回到集群管理,点击进如具体的集群中,点击左侧菜单中节点管理,点击界面右上创建节点
配置节点,可参考以下配置
点击所建集群进入集群详细操作界面,如下,创建无状态负载
创建负载配置,包含接入APM
接入APM验证,控制台搜索APM,使用新版控制台,点击应用监控—>应用列表
**根据以上创建负载流程,为以下服务创建负载:**file-center、generator-center、new-api-gateway、job-admin、auth-server、auth-sso、back-senter、user-center、workflow-center。
负载创建完成后,可在CSE控制台查看需要注册的服务是否注册成功。
注册中CSE的服务可以通过路由跳转,不需要配置服务发现。需要配置服务发现的微服务有:new-api-gateway、back-center、job-admin。
创建负载均衡ELB,控制台搜索ELB,点击右上购买,购买完成后可查看该ELB绑定的公网IP。
这里可以先跳到8、DNS实现通过域名访问应用
点击进入具体负载详情界面,点击访问方式,创建serviceELB服务
负载均衡的服务发现创建完成后,就可以通过之前ELB绑定的公网IP+9200 在公网环境下访问到new-api-gateway服务。
back-center镜像重新制作:前端服务back-center中有配置路由的地址,前端服务后面可定是要通过外网访问,所以这里前端服务中的路由地址也要修改为公网地址。可以用上面为new-api-gateway创建服务发现后的外网访问方式;配置位置如下:
修改后重新制作back-center镜像,步骤参考5、CloudBuild进行编译构建,构建docker镜像并推送到SWR
为back-center创建负载均衡类型的服务发现,步骤同为new-api-gateway创建服务发现一样,端口与服务配置文件端口保持一致:8066。
为了支撑运营相关工作,降低业务操作风险,提升生产操作质量,急需建设统一的调度系统,job-admin为调度系统中的执行器,负责接收调度请求并执行任务逻辑,接收“调度中心”的执行请求、终止请求和日志请求等。
为job-admin创建负载均衡类型的服务发现,步骤同为new-api-gateway创建服务发现一样,端口与服务配置文件端口保持一致:8888。
修改数据库中job-admin的三个接口对应的访问路径:在user-center库中的sys_memu表。
至此,基于CCE+CSE服务部署基本完成。
选择日志流
安装日志采集组件:确认安装完毕
选择主机组
采集配置
接入完成,查看日志流中收集到的日志
域名注册:注册地址
服务注册到CSE,为用户提供注册发现、服务治理、配置管理等高性能和高韧性的企业级云服务能力;CSE可无缝兼容Spring Cloud、ServiceComb等开源生态;用户也可结合其他云服务,快速构建云原生微服务体系,实现微服务应用的快速开发和高可用运维。
CCE中负载运行正常,CCE基于业界主流的Docker和Kubernetes开源技术构建的容器服务,提供众多契合企业大规模容器集群场景的功能,在系统可靠性、高性能、开源社区兼容性等多个方面具有独特的优势,满足企业在构建容器云方面的各种需求。
OCP应用基础功能使用正常
使用公网域名访问8066端口,登录admin:admin
LTS中使用APM链路ID查询次链路链路ID相关的日志。APM提供实时监控并管理企业应用性能和故障的云服务,帮助企业快速解决分布式架构下问题定位和性能瓶颈分析难题,改善用户体验。LTS提供一站式日志采集、秒级搜索、海量存储、结构化处理、转储和可视化图表等功能,满足应用运维、网络日志可视化分析、等保合规和运营分析等应用场景。
APM告警使用:告警是指接入APM Agent的服务在触发告警条件时上报的信息,以便您在第一时间获取到服务的异常状况,进而迅速处理故障,避免造成业务损失。
由于之前的一些配置都写死在了代码中,如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中是否有上传图片信息
模块在进行版本更新时,需要再次进行编译构建,创建镜像,手动在CCE进行镜像升级,频繁的版本更新操作比较麻烦、耗时,可以使用流水线CloudPipeline实现可视化、可定制的持续交付服务,实现缩短交付周期和提升交付质量的效果。
创建流水线,以user-center微服务为例,操作流程如下:
在CodeArts首页顶部菜单栏选择“服务”下的“流水线”;在流水线列表点击“新建流水线”;配置OCP项目所在的仓库信息;选择空白模板;
在流水线配置页面执行:“基本信息”中修改名称;“参数设置”中配置版本参数;“执行计划”中配置触发;“工作流”中配置代码检查、构建、部署任务;
保存流水线,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端口。 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。