• 沒有找到結果。

使用ServiceStage托管天气预报微服务应用_应用管理与运维平台 ServiceStage_最佳实践_华为云

N/A
N/A
Protected

Academic year: 2022

Share "使用ServiceStage托管天气预报微服务应用_应用管理与运维平台 ServiceStage_最佳实践_华为云"

Copied!
194
0
0

加載中.... (立即查看全文)

全文

(1)

ServiceStage

最佳实践

文档版本 01

发布日期 2021-12-28

(2)

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 i

(3)

目 录

1 使用 ServiceStage 托管天气预报微服务应用... 1

1.1 概述... 1

1.2 使用前准备... 2

1.3 微服务构建... 8

1.4 微服务部署... 15

1.5 微服务日常运维... 33

1.6 灰度发布... 35

1.7 微服务治理... 43

1.8 常见问题... 47

1.8.1 如何处理当前环境下已存在同名的天气预报微服务应用?...47

2 使用 DTM 保证银行转账业务数据一致性... 49

2.1 概述... 49

2.2 环境准备... 49

2.2.1 开发环境简介... 49

2.2.2 导入样例工程... 50

2.2.3 准备客户端配置文件... 50

2.2.4 初始化客户端数据库... 51

2.3 非侵入模式接入... 52

2.3.1 非微服务框架代码接入 DTM 样例指南...52

2.3.2 Spring Cloud 接入 DTM 样例指南... 57

2.3.3 Spring Cloud Huawei 接入 DTM 样例指南...65

2.3.4 ServiceComb 接入 DTM 样例指南... 73

2.3.5 Dubbo 接入 DTM 样例指南... 79

2.3.6 Dubbo ServiceComb 接入 DTM 样例指南... 87

2.4 TCC 模式接入... 94

2.4.1 非微服务框架代码接入 DTM 样例指南...94

2.4.2 Spring Cloud 接入 DTM 样例指南... 99

2.4.3 Spring Cloud Huawei 接入 DTM 样例指南... 106

2.4.4 ServiceComb 接入 DTM 样例指南...114

2.4.5 Dubbo 接入 DTM 样例指南...121

2.4.6 Dubbo ServiceComb 接入 DTM 样例指南... 128

2.5 MQ 消息接入 DTM 事务... 136

2.5.1 Spring Cloud 接入 DTM 样例指南...136

最佳实践 目 录

(4)

2.5.2 Spring Cloud Huawei 接入 DTM 样例指南... 147

2.5.3 ServiceComb 接入 DTM 样例指南...157

2.5.4 Dubbo 接入 DTM 样例指南...165

2.5.5 Dubbo ServiceComb 接入 DTM 样例指南... 175

2.6 DTM 事务管理... 184

2.7 DTM 参数配置... 185

2.8 DTM 锁管理...185

2.9 FAQ... 186

2.9.1 下载安装 ZooKeeper... 186

2.9.2 RocketMQ 安装和启动... 186

3 微服务引擎仪表盘中的数据通过 ServiceStage 对接到 AOM... 188

4 附录... 190

4.1 AK/SK 获取方法...190

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 iii

(5)

1 使用 ServiceStage 托管天气预报微服务应用

概述 使用前准备 微服务构建 微服务部署 微服务日常运维 灰度发布 微服务治理 常见问题

1.1 概述

天气预报微服务应用提供天气预报、紫外线和天气湿度展示等功能。本文通过天气预 报应用,展示了微服务架构设计理念的应用场景,以及使用ServiceStage管理运行环 境、搭建流水线和治理微服务的最佳实践。

天气预报由前端应用和后端应用组成。前端应用weathermapweb采用Node.js进行开 发,通过Mesher技术接入微服务引擎,实现前端应用发现后端应用。

后端应用采用Java微服务开发框架实现,包括fusionweather、forecast、weather、

weather-beta等微服务。其中:

● fusionweather是一个聚合微服务,通过访问weather和forecast服务,提供全方 位的天气预报功能。

● forecast实现未来几天天气预报查询功能。

● weather实现天气湿度查询功能。

● weather-beta微服务是weather微服务的新版本,新增了查询指定城市紫外线情 况的功能。

天气预报源码仓库地址:https://github.com/servicestage-demo/

weathermap.git。各个组件使用的技术如下:

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(6)

1-1 天气预报组件列表

仓库分支 组件名称 采用技术

master weathermapweb Node.js fusionweather ServiceComb forecast ServiceComb weather ServiceComb

天气预报的逻辑组网和调用关系图如下:

1.2 使用前准备

资源准备

为了方便后续的操作,需要您提前准备好如下资源:

1. 注册华为云帐号,并登录成功。

2. 已获取AK/SK,请参考AK/SK获取方法。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 2

(7)

说明

● 如果使用微服务引擎专业版,需要配置AK/SK(本最佳实践使用微服务引擎专业版)。

● 如果使用微服务引擎专享版,不需要配置AK/SK。需要先创建一个未开启安全认证的微 服务引擎专享版,请参考创建微服务引擎专享版。

3. 创建一个虚拟私有云,请参考创建虚拟私有云和子网。

4. 创建一个CCE集群(如果只是试用场景,“集群管理规模”选择“50节点”,

“控制节点数”选择“1”即可)。

集群中至少包含1个规格为8vCPUs、16GB内存或者2个规格为4vCPUs、8GB内存 的ECS节点,并且绑定弹性公网IP,请参考购买CCE集群。

创建环境

步骤1 登录ServiceStage控制台,选择“环境管理”,单击“创建环境”。

1-1 创建环境

步骤2 设置环境信息。

1. “环境名称”:输入环境名称,例如:test-env。

2. “虚拟私有云(VPC)”:选择资源准备时创建的虚拟私有云。

3. “基础资源”:选择资源准备时创建的虚拟私有云下的CCE集群。

4. “可选资源”:选择资源准备时创建的虚拟私有云下的可用的微服务引擎。

说明

选定虚拟私有云后,会加载该虚拟私有云下的基础资源和可选资源供选择,不在该虚拟私有云下 的资源无法选择。

步骤3 单击“立即创建”,完成环境创建。

环境创建成功后,可以在“环境管理”页的资源卡片查看环境信息。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(8)

1-2 设置环境信息

----结束

创建应用

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击“创建应用”,设置应用基本信息。

1. “应用名称”:填写weathermap。

说明

如果应用列表中存在同名应用,请参考如何处理当前环境下已存在同名的天气预报微服务 应用?处理。

2. “企业项目”:使用默认default(开通企业项目后才显示该参数)。

3. “描述”:(可选)输入应用描述。

步骤3 单击“确定”,完成应用创建。

1-3 新建应用

----结束

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 4

(9)

创建密钥

本操作的主要目的是给基于Mesher框架的前端应用组件weathermapweb准备密钥。

组件部署运行后,Mesher会自动读取密钥信息。

● 仅当使用微服务引擎专业版时需要创建密钥。

● 如果使用微服务引擎专享版,无需执行本操作。

步骤1 对资源准备时获取的AK/SK分别进行base64编码。

在本地Linux环境下,使用echo -n ' 编码内容 ' | base64命令。示例如下:

root@ubuntu:~# echo -n '3306' | base64 MzMwNg==

其中,3306为编码内容。

步骤2 登录ServiceStage控制台,选择“应用管理 > 应用配置 > 密钥 > 创建密钥”。

1-4 创建密钥

步骤3 “创建方式”选择“可视化”。

步骤4 “密钥名称”填写为“mesher-secret”。

步骤5 “所在集群”和“命名空间”选择部署应用的集群和命名空间(命名空间默认为 default)。

步骤6 “密钥类型”选择“Opaque”。

步骤7 “密钥数据”请参考表1-2填写。

1-2 密钥数据

键 值

cse_credentials_accessKey 已进行了Base64编码的AK 值。

cse_credentials_secretKey 已进行了Base64编码的SK值。

步骤8 单击“创建”,完成密钥创建。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(10)

1-5 设置密钥数据

----结束

Fork 天气预报源码

登录您的GitHub帐号,并Fork天气预报源码。源码地址:https://github.com/

servicestage-demo/weathermap.git。

设置 GitHub 仓库授权

设置GitHub仓库授权,使构建工程、应用组件等可以使用授权信息访问GitHub源码仓 库。

步骤1 登录ServiceStage控制台,选择“持续交付 > 仓库授权 > 新建授权”。

1-6 新建仓库授权

步骤2 参考下表配置授权信息。参数前面带*号的是必须设置的参数。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 6

(11)

1-3 授权参数说明

参数 说明

*授权名称 授权名称,创建之后不可更改。

*仓库类型 选择GitHub。

“授权方式”:支持OAuth/私人令牌。

1-7 设置授权参数

步骤3 单击“ 创建”,完成GitHub仓库授权创建。

1-8 授权成功

----结束

创建组织

步骤1 登录ServiceStage控制台,选择“软件中心 > 组织管理”。

步骤2 单击“创建组织”,在弹出的页面中填写“组织名称”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(12)

步骤3 单击“确定”。

1-9 创建组织

----结束

1.3 微服务构建

业务场景

ServiceStage提供一键式应用交付流水线的能力,并支持灵活定制,您可以基于源码、

软件包的方式进行打包构建,使用流水线工程实现“源码拉取->编译->打包->归档->

部署”的全流程自动化。在实际的场景中,能够帮助您缩短企业业务上线周期,快速 占领市场高地。

ServiceStage提供对接Devcloud、GitHub、Gitee、Bitbucket、GitLab等源码仓库拉取 源码。

用户故事

在本实践中,用户可以基于源码的方式在ServiceStage上创建一个构建任务拉取 GitHub上的weathermap源码,编译打包成镜像后归档到镜像仓库中。

在构建之前,您需要:

1. 登录GitHub并fork weathermap源码。

2. 创建一个组织用于归档镜像。

Fork 源码

登录个人GitHub帐号,并fork天气预报源码。源码地址:https://github.com/

servicestage-demo/weathermap.git。

创建后台应用构建任务

步骤1 登录ServiceStage控制台,选择“持续交付 > 构建”,单击“基于源码构建”。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 8

(13)

1-10 创建基于源码构建任务

步骤2 在新页面填写参数。

1. “名称”:设置为“weathermap”。

2. “企业项目”:使用默认。

3. “代码源来源”:选择“GitHub”。

4. “授权信息”:设置授权信息。

5. “用户名/组织”:选择您的GitHub帐号。

6. “仓库名称”:选择“weathermap”。

7. “分支”:选择“master”。

8. “构建集群”:选择资源准备创建的CCE集群用于构建。

1-11 设置构建工程参数

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(14)

步骤3 单击“下一步”,构建模板选择“自定义”。

步骤4 单击“高级配置”,并在环境设置页面进行以下设置。

1. 在“编译”栏中,单击“添加插件”,选择“Build Common Cmd”,“语言”

选择“Java”。

1-12 设置通用命令行插件参数

2. 在“编译”栏中,单击“添加插件”,选择“Docker”,分别添加四条构建任 务,参数设置如表1-4所示。

1-4 构建任务参数

Dockerfile路径 镜像名称 ./weather/ weather ./weather-beta/ weather-beta ./forecast/ forecast ./fusionweather/ fusionweather

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 10

(15)

1-13 设置 Docker 插件参数

3. 在“归档”栏中,单击“添加插件”,选择“Publish Build Image”,“归档镜 像”分别选择构建任务中的镜像名称,“仓库组织”选择创建组织创建的组织名 称。

其他参数无需修改。该任务成功后,镜像包会自动归档到镜像仓库,供后续步骤 使用。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(16)

1-14 设置归档镜像参数

步骤5 单击“构建”,启动构建任务。

----结束

创建前台应用构建任务

步骤1 登录ServiceStage控制台,选择“持续交付 > 构建”,单击“基于源码构建”。

1-15 创建基于源码构建任务

步骤2 在新页面填写参数。

1. “名称”:设置为“weathermapweb”。

2. “企业项目”:使用默认。

3. “代码源来源”:选择“GitHub”。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 12

(17)

4. “授权信息”:设置授权信息。

5. “用户名/组织”:选择您的GitHub帐号。

6. “仓库名称”:选择weathermap。

7. “分支”:选择“master”。

8. “构建集群”:选择资源准备创建的CCE集群用于构建。

1-16 设置构建工程参数

步骤3 单击“下一步”,选择Docker构建模板,并在必填项参数配置进行以下设置。

1. 编译Docker,添加一条构建任务,参数设置如下。

Dockerfile路径 镜像名称

./weathermapweb/ weathermapweb

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(18)

1-17 设置 Docker 构建参数

2. 设置镜像归档。

“仓库组织”选择创建组织创建的组织名称。其他参数无需修改。该任务成功 后,镜像包会自动归档到镜像仓库,供后续步骤使用。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 14

(19)

1-18 设置镜像归档参数

步骤4 单击“构建”,启动构建任务。

----结束

构建结果

应用构建成功,如下图所示。

1-19 构建结果

1.4 微服务部署

业务场景

基于ServiceStage可以方便快捷的将微服务部署到容器(如CCE)、虚拟机(如ECS)

或无服务器(如CCI),同时支持源码部署、jar/war包部署或docker镜像包部署。同 时,ServiceStage支持 Java、PHP、Node.js、Go、Python 多种编程语言应用的完全 托管,包括部署、升级、回滚、启停和删除等。

本实践中使用了Java开发的后台组件和Node.js开发的前台组件。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(20)

用户故事

在本实践中,您可以通过容器部署的方式部署应用并将微服务实例注册到微服务引擎 CSE中,weathermap应用需要创建以下组件:

1. 前台组件:weathermapweb,基于Node.js语言开发的界面。

2. 后台组件:weather、forecast、fusionweather,基于Java语言开发。

创建并部署后台应用组件

此处需要创建3个应用组件,对应后台构建任务生成的3个软件包:weather、

forecast、fusionweather。

这里以weather包为例介绍操作步骤,其余应用组件的具体步骤不再详述。

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击创建应用时创建的应用名称(例如weathermap)“操作”栏的“新增组件”。

1-20 新增组件

步骤3 “配置方式”选择“自定义配置”,“选择组件类型”选择“微服务”,单击“下一 步”。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 16

(21)

1-21 选择配置方式及组件类型

步骤4 “选择运行时”选择“Docker”,单击“下一步”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(22)

1-22 选择运行时

步骤5 选择Java Chassis框架/服务网格。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 18

(23)

1-23 选择框架/服务网格

步骤6 设置组件信息,“组件名称”输入weather。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(24)

1-24 设置组件信息

步骤7 单击“创建并部署”,部署组件。

1. “环境”:选择创建环境时创建的环境(例如test-env)。

2. “部署版本”:输入1.0.0。

3. “部署系统”:选择“云容器引擎”。

4. “实例数量”:设置为1。

5. 其他参数使用默认。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 20

(25)

1-25 设置基本配置参数

步骤8 单击“下一步 组件配置”,进行组件配置。

1. “镜像”:单击“选择镜像”,在“我的镜像”页签搜索“weather”,选择创建 组织创建的组织名称下的weather镜像包及其版本号,单击“确定”。

2. “微服务引擎”:默认选择创建环境时选择的微服务引擎。

说明

– 应用组件部署以后,微服务会注册到设置的微服务引擎。

– 所有应用组件需要注册到同一个微服务引擎,才能互相发现。

3. 其他参数使用默认。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(26)

1-26 选择镜像

步骤9 设置环境变量。

选择“高级设置 > 组件配置”,进入“环境变量”,单击“添加环境变量”,添加如 下环境变量。

类 型

变量名 变量/变量引用

手 动 添 加

MOCK_ENABLED ● true:资源准备时创建的CCE集 群中的ECS节点如果没有绑定 弹性公网IP或者不能访问公网 时,需设置该参数值为true。

则应用所用到的天气数据为模 拟数据。

● false:资源准备时创建的CCE 集群中的ECS节点如果已绑定 弹性公网IP且能访问公网时,

需设置该参数值为false或者不 设置该参数。则应用所用到的 天气数据为实时数据。

servicecomb_credentials_accessKey 资源准备时获取的AK。

说明

● 仅当使用微服务引擎专业版时需 要配置。

● 如果使用微服务引擎专享版,无 需配置。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 22

(27)

类 型

变量名 变量/变量引用

servicecomb_credentials_secretKey 资源准备时获取的SK。

说明

● 仅当使用微服务引擎专业版时需 要配置。

● 如果使用微服务引擎专享版,无 需配置。

1-27 设置环境变量

步骤10 单击“下一步 规格确认”,确认规格。

步骤11 单击“部署”,部署组件。

步骤12 参考以上步骤,创建并部署forecast和fusionweather组件,需要设置的参数如下表所 示。

组件名称 选择镜像 环境变量

forecast forecast ● 变量名称:MOCK_ENABLED

● 变量/变量引用:

– true:资源准备时创建的CCE集群中的ECS 节点如果没有绑定弹性公网IP或者不能访问 公网时,需设置该参数值为true。则应用所 用到的天气数据为模拟数据。

– false:资源准备时创建的CCE集群中的ECS 节点如果已绑定弹性公网IP且能访问公网 时,需设置该参数值为false或者不设置该 参数。则应用所用到的天气数据为实时数 据。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(28)

组件名称 选择镜像 环境变量

● 变量名称:

servicecomb_credentials_accessKey

● 变量/变量引用:资源准备时获取的AK。

说明

– 仅当使用微服务引擎专业版时需要配置。

– 如果使用微服务引擎专享版,无需配置。

● 变量名称:

servicecomb_credentials_secretKey

● 变量/变量引用:资源准备时获取的SK。

说明

– 仅当使用微服务引擎专业版时需要配置。

– 如果使用微服务引擎专享版,无需配置。

fusionweather fusionweather ● 变量名称:

servicecomb_credentials_accessKey

● 变量/变量引用:资源准备时获取的AK。

说明

– 仅当使用微服务引擎专业版时需要配置。

– 如果使用微服务引擎专享版,无需配置。

● 变量名称:

servicecomb_credentials_secretKey

● 变量/变量引用:资源准备时获取的SK。

说明

– 仅当使用微服务引擎专业版时需要配置。

– 如果使用微服务引擎专享版,无需配置。

----结束

创建并部署前台应用组件

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击创建应用时创建的应用名称(例如weathermap)“操作”栏的“新增组件”。

1-28 新增组件

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 24

(29)

步骤3 “配置方式”选择“自定义配置”。组件类型选择“微服务”,单击“下一步”。

1-29 选择配置方式及组件类型

步骤4 “选择运行时”选择“Docker”,单击“下一步”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(30)

1-30 选择运行时

步骤5 “框架/服务网格”选择Mesher,单击“下一步”。

1-31 选择框架/服务网格

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 26

(31)

步骤6 设置组件信息,“组件名称”输入weathermapweb。

1-32 设置组件信息

步骤7 单击“创建并部署”,部署组件。

1. “环境”:选择创建环境时创建的环境(例如test-env)。

2. “部署版本”:输入1.0.0。

3. “部署系统”:选择“云容器引擎”。

4. “实例数量”:设置为1。

5. 其他参数使用默认。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(32)

1-33 设置组件基本配置

步骤8 单击“下一步 组件配置”,进行组件配置。

1. “镜像”:单击“选择镜像”,在“我的镜像”页签搜索“weathermapweb”,

选择创建组织创建的组织名称下的weathermapweb镜像包及其版本号,单击“确 定”。

2. “微服务引擎”:默认选择创建环境时选择的微服务引擎。

说明

– 应用组件部署以后,微服务会注册到设置的微服务引擎。

– 所有应用组件需要注册到同一个微服务引擎,才能互相发现。

3. 其他参数使用默认配置。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 28

(33)

1-34 设置组件配置

步骤9 单击“下一步 规格确认”,确认规格。

步骤10 单击“部署”,部署组件。

----结束

确认部署结果

步骤1 登录ServiceStage控制台,选择“基础设施 > 微服务引擎 CSE”。

1-35 进入微服务引擎实例列表

步骤2 选择创建环境时选择的微服务引擎,单击“查看控制台”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(34)

1-36 查看控制台

步骤3 选择“服务目录 > 微服务列表”,在“全部应用”下拉列表中选择创建应用时创建的 应用名称(例如weathermap)。

如果存在如下已部署的微服务,且各微服务实例数不为0,则部署成功。

● forecast

● fusionweather

● weather

● weathermapweb 图 1-37 查看微服务实例数

----结束

添加访问方式

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击创建应用时创建的应用名称(例如weathermap),进入应用“概览”页。

1-38 进入应用概览页

步骤3 在“环境视图”页签,“环境”选择创建环境时创建的环境(例如test-env),查看已 经部署的应用组件。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 30

(35)

步骤4 单击weathermapweb应用组件名称,进入“概览”页面。

1-39 进入应用组件概览页

步骤5 单击“访问方式”。

步骤6 单击“TCP/UDP路由配置”区域的“添加服务”,参考下表设置参数。

参数 说明

服务名称 填写weathermapweb。

访问方式 选择“公网访问”。

访问类型 选择“弹性IP”。

服务亲和 选择默认设置。

协议 选择TCP。

容器端口 填写3000。

访问端口 选择“自动生成”。

1-40 设置公网访问参数

步骤7 单击“确定”,生成访问地址。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(36)

1-41 访问地址

----结束

访问应用

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击创建应用时创建的应用名称(例如weathermap),进入应用“概览”页。

1-42 进入应用概览页

步骤3 在“环境视图”页签,“环境”选择创建环境时创建的环境(例如test-env),查看已 经部署的应用组件。

步骤4 选择weathermapweb应用组件,单击“外部访问地址”后的链接。

1-43 访问应用

出现以下页面表明应用部署成功。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 32

(37)

1-44 应用部署成功

说明

首次访问应用时,weather系统就绪需要一段时间。如果如上图所示页面没有出现,请持续刷新 页面。

----结束

1.5 微服务日常运维

业务场景

ServiceStage支持应用监控、事件、告警、日志和调用链诊断,内置AI能力,实现轻松 运维。

用户故事

在实际的使用场景中,用户可以通过图形化指标数据和阈值告警等能力,实时监控应 用运行情况,同时结合性能管理与日志策略,快速定位应用的运行问题,分析性能瓶 颈等。

操作步骤

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(38)

步骤2 单击创建应用时创建的应用名称(例如weathermap),进入应用“概览”页。

1-45 进入应用概览页

步骤3 在“环境视图”页签,“环境”选择创建环境时创建的环境(例如test-env),查看已 经部署的应用组件。

1-46 查看部署组件

步骤4 选择应用组件(以weathermapweb为例),并单击其名称进入组件“概览”页面。

如下图所示,左侧导航菜单以及详细信息页面的右上角,有相关操作菜单/按钮。

1-47 组件概览页面

----结束

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 34

(39)

1.6 灰度发布

weather-beta是weather的新版本,提供了紫外线查询功能。升级weather-beta,需 要先将少部分请求引流到新版本做功能验证,功能验证正常的情况下,再下线老版 本。在升级过程中,需要保证客户的请求不能出现中断,在部署新版本的过程中不给 新版本导流,在下线老版本前已经将老版本的流量全部切走。

ServiceStage提供了灰度发布功能,可以达到上述目的。

本章节演示通过使用ServiceStage的灰度发布功能部署weather服务的新版本weather- beta。

说明

灰度发布暂只支持“华东-上海二”、“华北-北京四”。

步骤1 登录ServiceStage控制台,选择“应用管理 > 应用列表”。

步骤2 单击创建应用时创建的应用名称(例如weathermap),进入应用“概览”页。

1-48 进入应用概览页

步骤3 选择“灰度发布”,在“发布任务”页签,单击“发布任务”。

1-49 进入灰度发布

步骤4 选择“微服务灰度发布”,单击“新建任务”。

1-50 新建微服务灰度发布任务

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(40)

步骤5 部署灰度版本:

1. “任务名称”:输入灰度发布任务名称,例如:ab-test。

2. “发布环境”:选择创建环境时创建的环境(例如test-env)。

3. “微服务引擎”:默认选择“发布环境”下的微服务引擎。

4. “实例配置”:单击“选择组件”,选择weather组件,单击“确定”。

1-51 部署灰度版本

步骤6 设置“当前版本配置”参数:

1. “微服务环境”:选择“<空>”。

2. “微服务应用名”:选择微服务应用名(例如weathermap)。

3. “微服务”:选择weather微服务,微服务版本号选择0.0.2。

说明

“微服务环境”、“微服务应用名”、“微服务”是开发微服务应用过程中在yaml配置文件中 配置的相关参数,其中:

● “微服务环境”默认为“”。

● “微服务应用名”默认为“default”。

● “微服务”是必须配置的参数,由您自定义。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 36

(41)

1-52 设置当前版本配置参数

步骤7 设置“灰度版本配置”参数:

1. “微服务”:版本号输入0.0.3。

2. “组件版本”:输入0.0.3。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(42)

1-53 设置微服务和组件版本号

步骤8 单击“更换”。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 38

(43)

1-54 更换镜像

步骤9 在“我的镜像”列表选择创建的组织名称下的weather-beta及其版本号,单击“确 定”。

1-55 选择镜像

步骤10 单击“部署灰度版本”。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(44)

1-56 部署灰度版本

步骤11 进入“查看灰度状态”,可以查看灰度状态。

1-57 查看灰度状态

步骤12 单击“下一步 查看配置灰度策略”,设置灰度策略。

1. 选择“基于流量比例发布”。

2. 设置“灰度版本流量”为80。

1-58 设置灰度策略

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 40

(45)

步骤13 单击“灰度策略全部下发”,进入“监测灰度运行状态”界面,可以查看现有版本列 表、流量监控、健康监控等相关内容。

1-59 监测灰度运行状态

步骤14 确认灰度版本工作正常。

访问应用,多次刷新天气预报页面,可以看到界面会根据灰度策略,周期性的显示灰 度界面和当前版本界面。

1-60 当前版本界面

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(46)

1-61 灰度界面

步骤15 在创建应用时创建的应用(例如weathermap)“灰度发布”页,单击“正式发布灰度 版本”,在弹出对话框单击“确认”,完成灰度发布。

操作完成,会删除灰度策略和下线当前版本,灰度版本变成当前版本。

1-62 正式发布灰度版本

----结束

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 42

(47)

1.7 微服务治理

业务场景

微服务引擎提供负载均衡、降级、限流、容错、熔断、错误注入、黑白名单等治理策 略。

用户故事

用户可以根据实际的业务场景提前配置相应的治理策略,灵活应对业务需求变化,保 障应用的稳定运行。

降级:在本实践中,假设前台请求剧增,导致系统响应缓慢甚至可能崩溃,在这样的 场景下,我们可以在fusionweather对forecast使用降级策略,对forecast 进行降级处 理,只请求比较重要的实时天气weather的数据,保障重要业务功能的正常运行,等流 量洪峰过去再进行复原。

体验微服务降级

ServiceStage支持从界面上设置按微服务或接口粒度降级。

以对forecast微服务降级为例,操作步骤如下。

步骤1 登录ServiceStage控制台,选择“基础设施 > 微服务引擎 CSE”。

1-63 进入微服务引擎实例列表

步骤2 选择创建环境时选择的微服务引擎,单击“查看控制台”。

1-64 查看控制台

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(48)

步骤3 单击“服务治理”。

1-65 进入服务治理页面

步骤4 单击创建应用时创建的应用名称(例如weathermap)。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 44

(49)

1-66 进入应用服务治理

步骤5 配置降级策略。

1. 选择fusionweather微服务。

2. 选择“降级”。

3. 单击“新增”。

4. “降级对象”选择“forecast”和“所有方法”。

5. “降级策略”设置为“开启”。

6. 单击“确定”。

步骤6 查看效果。

访问应用,右侧天气预测部分显示空白。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(50)

1-67 微服务降级后服务应用结果

步骤7 单击 ,删除降级策略,以免对后续体验造成影响。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 46

(51)

----结束

1.8 常见问题

1.8.1 如何处理当前环境下已存在同名的天气预报微服务应用?

问题描述

登录ServiceStage控制台,创建指定名称的天气预报应用(例如:weathermap)时,

因为应用列表中已存在同名应用,系统报“SVCSTG.00100458: 应用名已经被使用”

错误提示。

解决方法

步骤1 创建应用时,“应用名称”输入唯一的应用名称,例如:jack_weathermap。

步骤2 设置应用环境变量,保证部署到微服务引擎的应用名称和创建的应用名称一致。

1. 在ServiceStage控制台,选择“应用管理 > 应用列表” 。

2. 单击已创建的天气预报应用名称,例如:jack_weathermap,进入应用“概览”

页。

3. 选择“环境变量”页签,在“环境”下拉列表选择创建环境时创建的环境(例如 test-env)。

4. 单击“添加环境变量”,根据选择的代码仓库分支设置环境变量。

最佳实践 1 使用 ServiceStage 托管天气预报微服务应用

(52)

“Key”设置为servicecomb_service_application,“Value”设置为创建应用时 输入的应用名称,例如:jack_weathermap。

5. 单击“提交”,完成应用环境变量的设置。

----结束

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 48

(53)

2 使用 DTM 保证银行转账业务数据一致性

概述 环境准备 非侵入模式接入 TCC模式接入

MQ消息接入DTM事务 DTM事务管理

DTM参数配置 DTM锁管理 FAQ

2.1 概述

本文通过一个银行转账的样例来演示DTM的分布式事务处理能力。其中,样例包括:

● 未使用框架的非微服务框架代码

● 微服务框架的Spring Cloud代码

● 微服务框架的Spring Cloud Huawei代码

● 微服务框架的ServiceComb代码

● 微服务框架的Dubbo、Dubbo ServiceComb代码

同时演示了用户如何在分布式事务管理前台实现事务管理、参数配置以及锁管理的功 能。

2.2 环境准备

2.2.1 开发环境简介

在进行应用开发时,准备环境包括如表2-1所示任务。

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(54)

2-1 准备开发环境

准备项 说明

准备操作系统 Windows系统,推荐Windows 7及以上版本。

安装JDK JDK版本要求:1.8版本。

安装Maven DTM使用Maven获取项目版本,可以直接使用dtm-demo 目录下的settings文件。

Maven版本要求:3.3.0及以上。

安装和配置IntelliJ

IDEA IntelliJ IDEA使用15.0及以上版本,用于开发Demo程序的 工具。

创建分布式事务引擎 请参考创建分布式事务引擎。

创建弹性云服务器 创建Linux弹性云服务器,请参考快速购买弹性云服务器。

Linux弹性云服务器需和分布式事务引擎在同一个VPC内。

创建MySQL 5.0或以

上版本数据库 在Linux弹性云服务器部署MySQL数据库,同时保存数据库 地址、帐号和密码。Linux弹性云服务器需和分布式事务引 擎在同一个VPC内。

2.2.2 导入样例工程

步骤1 下载github的dtm-demo样例工程到本地。

步骤2 解压样例工程,并导入到IntelliJ IDEA开发环境,解压文件包含如下样例:

● dtm-origin,非微服务框架样例。

● dtm-springcloud,Spring Cloud框架样例。

● dtm-springcloud-hw,Spring Cloud Huawei框架样例。

● dtm-servicecomb,ServiceComb框架样例。

● dtm-dubbo,Dubbo框架样例。

● dtm-dubbo-servicecomb,Dubbo ServiceComb框架样例。

步骤3 使用样例工程中的settings文件,配置maven信息获取DTM的软件开发工具包。

----结束

2.2.3 准备客户端配置文件

准备DTM的客户端配置文件,新建dtm-config文件夹,并在dtm-config文件夹中添加 配置文件dtmClientConfig.properties。配置文件内容如下:

auto-create-table-dtm-tran-info=on dtm-app-name=xxxx

sc-server-address=xxxx rpc-ssl-switch=off

配置项说明如表2-2所示。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 50

(55)

2-2 dtmClientConfig.properties 配置文件参数详解

参数 说明

auto-create-table-

dtm-tran-info 是否自动创建DTM事务表dtm_tran_info,用来记录事务信 息。

● on:自动创建事务表,可跳过初始化客户端数据库步骤 二。

● off:手动创建事务表,可参考初始化客户端数据库步 骤二中方式二。

dtm-app-name 应用名称,该配置项可从“应用管理与运维平台”控制台

“分布式事务管理 DTM > 引擎实例”界面中得到。

sc-server-address 服务中心地址,该配置项可从“应用管理与运维平台”控 制台“分布式事务管理 DTM > 引擎实例”界面中得到。

rpc-ssl-switch SSL开关,该配置项可从“应用管理与运维平台”控制台

“分布式事务管理 DTM > 引擎实例”界面中得到。

● on:开启SSL

● off:关闭SSL

2-1 DTM 引擎实例

2.2.4 初始化客户端数据库

步骤1 数据库中执行以下SQL,建立业务数据库banka和bankb(模拟客户自己的业务数据 库)。

CREATE DATABASE banka;

CREATE DATABASE bankb;

步骤2 在业务库中创建DTM事务表dtm_tran_info,用来记录事务信息。创建有以下两种方 式,推荐通过修改DTM配置信息,自动创建DTM事务表。

● 方式一:自动创建,修改dtm配置文件dtmClientConfig.properties中auto-create- table-dtm-tran-info参数为on,开启自动创建。

auto-create-table-dtm-tran-info=on

● 方式二:手动创建,执行如下SQL,分别在banka和bankb业务数据库创建事务表 dtm_tran_info。

a. 如果数据库使用MySQL或GaussDB(for MySQL),执行下面的SQL:

CREATE TABLE dtm_tran_info ( branch_id bigint(20) NOT NULL, global_id bigint(20) NOT NULL, tran_info longblob NOT NULL, info_status int(11) NOT NULL, info_created datetime(0) NOT NULL,

ext varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(56)

NULL,

PRIMARY KEY (branch_id) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 3571 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

b. 如果数据库使用PostgreSQL或GaussDB(openGauss),执行下面的SQL:

CREATE TABLE dtm_tran_info (

branch_id bigint NOT NULL primary key , global_id bigint NOT NULL,

tran_info text NOT NULL, info_status int NOT NULL,

info_created timestamp NOT NULL, ext varchar(100)

)

c. 如果数据库使用Oracle,执行下面的SQL:

CREATE TABLE dtm_tran_info (

branch_id NUMBER(20, 0) PRIMARY KEY, global_id NUMBER(20, 0) NOT NULL, tran_info BLOB NOT NULL,

info_status NUMBER(11, 0) NOT NULL,

info_created TIMESTAMP(6) DEFAULT SYSDATE, ext VARCHAR2(100)

)

----结束

2.3 非侵入模式接入

2.3.1 非微服务框架代码接入 DTM 样例指南

本章节以未使用DTM和使用DTM进行银行转帐进行比较,来演示DTM提供的高可靠分 布式事务处理能力。

其中,使用到的非微服务框架代码样例在导入样例工程过程中准备的dtm-demo的 dtm-origin项目中。

样例设计

非微服务框架代码样例中没有使用任何框架,样例流程如图2-2所示。

● 组成:bankA服务、bankB服务、bankCenter服务。

● 功能:bankCenter服务调用bankA和bankB服务进行初始化和转账等操作。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 52

(57)

2-2 非侵入样例代码设计流程

业务流程分析

● 正常场景:BankA转入100,BankB转出100,两银行金额之和保持1,000,000,000 不变。

● 异常场景:BankA转入100,发生异常情况,bankB转出失败。DTM会回滚bankA 的数据,两银行金额之和保持1,000,000,000不变。

DTM 全局事务发起者

定义非侵入样例本地场景事务发起端,调用bankA转入服务和bankB转出服务,同时概 率抛出异常。

// com.huawei.dtm.client.service.TransferService.java

@DTMTxBegin(appName = "transfer-local") public void transferLocal(int userId, int money) { bankAService.transferIn(userId, money);

ExceptionUtils.addRuntimeException(50);

bankBService.transferOut(userId, money);

}

样例中同时提供未使用DTM注解@DTMTxBegin的方法,代码如下所示。

// com.huawei.dtm.client.service.TransferService.java public void transferLocalUnable(int userId, int money) { bankAService.transferIn(userId, money);

ExceptionUtils.addRuntimeException(50);

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(58)

bankBService.transferOut(userId, money);

}

bankA 服务

● 增加数据源DTMDataSource

// com.huawei.dtm.client.config.ClientConfig.java;

@Bean(name = "bankADataSource")

@ConfigurationProperties(prefix = "spring.datasource.banka") public DataSource bankADataSource() {

return new DTMDataSource(datasource);

}@Bean(name = "bankAJdbcTemplate")

public JdbcTemplate bankAJdbcTemplate(@Qualifier("bankADataSource") DataSource dataSource) {

return new JdbcTemplate(dataSource);

}

● 实现转入业务逻辑

// com.huawei.common.impl.BankAService.java public void transferIn(int id, int money) {

jdbcTemplate.update(DtmConst.TransferSql.TRANSFER_IN_SQL, money, id);

}

bankB 服务

● 增加数据源DTMDataSource

// com.huawei.dtm.client.config.ClientConfig.java;

@Bean(name = "bankBDataSource")

@ConfigurationProperties(prefix = "spring.datasource.bankb") public DataSource bankDataSource() {

return new DTMDataSource(datasource);

}@Bean(name = "bankBJdbcTemplate")

public JdbcTemplate bankJdbcTemplate(@Qualifier("bankBDataSource") DataSource dataSource) {

return new JdbcTemplate(dataSource);

}

● 实现转出业务逻辑

// com.huawei.common.impl.BankBService.java public void transferOut(int id, int money) {

jdbcTemplate.update(DtmConst.TransferSql.TRANSFER_OUT_SQL, money, id);

}

准备配置文件

配置dtm-client所需配置文件。

步骤1 通过Maven执行clean、install,将工程进行打包,生成client服务的jar包。

步骤2 登录创建好的弹性云服务器,将dtm-origin-client.jar包上传至弹性云服务器上,并在 测试样例dtm-origin-client.jar包同级目录下新建“application.yaml”文件和“dtm- config”文件夹。

步骤3 把下列配置拷贝到“application.yaml”文件中,参考表2-3,修改username、

password和url为您创建好的数据库用户名、密码和地址,拷贝完成后保存退出。

server:

port: 8012 spring:

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 54

(59)

application:

name: dtm-client datasource:

bankb:

username: ${db_user_name}

password: ${db_user_pwd}

url: jdbc:mysql://${db_ip}:3306/bankb?

verifyServerCertificate=false&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver

banka:

username: ${db_user_name}

password: ${db_user_pwd}

url: jdbc:mysql://${db_ip}:3306/banka?

verifyServerCertificate=false&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver

2-3 application.yaml 配置文件参数详解

参数 说明

db_user_name 客户端MySQL数据库用户名。

db_user_pwd 客户端MySQL数据库的密码。

db_ip 客户端MySQL数据库业务数据库地址,

分别为banka和bankb的地址。

步骤4 在新建目录“dtm-config”下,新建配置文件“dtmClientConfig.properties”,将下 列配置拷贝到配置文件“dtmClientConfig.properties”中,参考表2-4, 按实际修改 auto-create-table-dtm-tran-info、dtm-app-name、sc-server-address和rpc-ssl- switch。

auto-create-table-dtm-tran-info=on dtm-app-name=xxxx

sc-server-address=xxxx rpc-ssl-switch=off

2-4 dtmClientConfig.properties 配置文件参数详解

参数 说明

auto-create-table-

dtm-tran-info 是否自动创建DTM事务表dtm_tran_info,用来记录事务信 息。

● on:自动创建

● off:手动创建

dtm-app-name 应用名称,该配置项可从“应用管理与运维平台”控制台

“分布式事务管理 DTM > 引擎实例”界面中得到。

sc-server-address 服务中心地址,该配置项可从“应用管理与运维平台”控 制台“分布式事务管理 DTM > 引擎实例”界面中得到。

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(60)

参数 说明

rpc-ssl-switch SSL开关,该配置项可从“应用管理与运维平台”控制台

“分布式事务管理 DTM > 引擎实例”界面中得到。

● on:开启SSL

● off:关闭SSL

2-3 DTM 引擎实例

----结束

启动测试样例

步骤1 登录ECS,在dtm-origin-client.jar包同级目录下,执行java -Dfile.encoding=utf-8 - jar dtm-origin-client.jar启动client服务。

[0] 初始化数据库, 重置账号资金;

[1] 查询 Bank A 和 Bank B 余额;

[2] 非侵入用例 -> 不使用DTM事务 本地场景验证;

[3] 非侵入用例 -> DTM 事务 本地场景验证;

[4] TCC用例 -> DTM 事务 本地场景调用;

[5] EXIT;

请输入命令执行操作:

步骤2 输入命令0,初始化数据库。

2021-03-23 11:28:44.676 [main] INFO c.h.d.c.service.TransferService - Init bankA initB success

步骤3 输入命令1,查询帐号余额,结果如下图所示,两银行余额都是1000000。

|--- userId ---|--- bankA-money ---|--- bankB-money ---|---- sum ----|

| 0| 1000000| 1000000| 2000000|

| 1| 1000000| 1000000| 2000000|

| 2| 1000000| 1000000| 2000000|

| 3| 1000000| 1000000| 2000000|

| 4| 1000000| 1000000| 2000000|

...

| 496| 1000000| 1000000| 2000000|

| 497| 1000000| 1000000| 2000000|

| 498| 1000000| 1000000| 2000000|

| 499| 1000000| 1000000| 2000000|

2021-03-23 11:30:36.985 [main] INFO c.h.d.c.service.TransferService - Run finish. total a 500000000,total b 500000000,sum 1000000000

步骤4 输入命令2,执行非侵入样例不使用DTM事务的本地场景验证。

步骤5 可选: 输入运行的线程数量、每个线程的事务数量以及发生异常的概率值,输入格式为

“线程数量:单线程事务数量:异常概率”,结果如下图所示,出现数据不一致的情况。

|--- userId ---|--- bankA-money ---|--- bankB-money ---|---- sum ----|

| 0| 1000000| 1000000| 2000000|

| 1| 1000000| 1000000| 2000000|

[ERROR] user id: 2, bankA: 1000100, bankB: 1000000, total: 2000100 [ERROR] user id: 3, bankA: 1000100, bankB: 1000000, total: 2000100

| 4| 1000100| 999900| 2000000|

...

| 496| 1000100| 999900| 2000000|

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 56

(61)

| 497| 1000000| 1000000| 2000000|

[ERROR] user id: 498, bankA: 1000100, bankB: 1000000, total: 2000100

| 499| 1000000| 1000000| 2000000|

2021-03-23 11:39:33.290 [main] INFO c.h.d.c.service.TransferService - Run finish. total a 500030000,total b 499985800,sum 1000015800

步骤6 输入命令0初始化数据库后再输入命令3,执行非侵入样例使用DTM事务的本地场景验 证。

步骤7 输入运行的线程数量、每个线程的事务数量以及发生异常的概率值,输入格式为“线 程数量:单线程事务数量:异常概率”,结果如下图所示,可以发现数据保持一致。

|--- userId ---|--- bankA-money ---|--- bankB-money ---|---- sum ----|

| 0| 1000000| 1000000| 2000000|

| 1| 1000000| 1000000| 2000000|

| 2| 1000100| 999900| 2000000|

| 3| 1000100| 999900| 2000000|

| 4| 1000100| 999900| 2000000|

...

| 496| 1000100| 999900| 2000000|

| 497| 1000000| 1000000| 2000000|

| 498| 1000000| 1000000| 2000000|

| 499| 1000000| 1000000| 2000000|

2021-03-23 11:42:45.033 [main] INFO c.h.d.c.service.TransferService - Run finish. total a 500015200,total b 499984800,sum 1000000000

步骤8 输入命令5,退出执行程序。

----结束

2.3.2 Spring Cloud 接入 DTM 样例指南

本章节介绍Spring Cloud 框架下DTM使用的demo,使得Spring Cloud框架下的项目可 以通过非侵入模式快速接入DTM。

其中,Spring Cloud的样例代码在导入样例工程过程中准备的dtm-demo的dtm- springcloud项目中。

样例设计

Spring Cloud样例中使用Spring Cloud框架,样例流程如图2-4所示。

● 组成:bankA服务、bankB服务、bankCenter服务。

● 功能:bankCenter服务调用bankA和bankB服务进行初始化和转账等操作。

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(62)

2-4 非侵入样例代码设计流程

业务流程分析

● 正常场景:BankA转入100,BankB转出100,两银行金额之和保持1,000,000,000 不变。

● 异常场景:BankA转入100,发生异常情况,bankB转出失败,DTM会帮助回滚 bankA的数据,两银行金额之和保持1,000,000,000不变。

DTM 全局事务发起者

定义非侵入样例微服务场景事务发起端,通过微服务接口调用bankA转入服务和bankB 转出服务,同时概率抛出异常。

// com.huawei.bankcenter.controller.BankCenterController.java

@GetMapping(value = "transfer")

@DTMTxBegin(appName = "noninvasive-transfer-SpringCloud")

public String transfer(@RequestParam(value = "id") int id, @RequestParam(value = "money") int money,

@RequestParam(value = "errRate") int errRate) {

LOGGER.info("Bank-center start invoke bankA and bankB");

bankOperator.transfer(id, money, errRate);

return "ok";

}// bankOperator 有两个实现类,下面以 FeignOpImpl 的实现类为例 // com.huawei.bankcenter.impl.FeignOpImpl.java

public String transfer(int userId, int money, int errRate) { LOGGER.info("Start transfer---feign");

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 58

(63)

bankAIntf.transfer(userId, money, errRate);

bankBIntf.transfer(userId, money, errRate);

return "ok";

}

bankA 服务

● 增加数据源DTMDataSource

// com.huawei.banka.config.WebConfig.java;

@Bean(name = "bankDataSource")

@ConfigurationProperties(prefix = "spring.datasource.bank") public DataSource bankDataSource() {

return new DTMDataSource(datasource);

}@Bean(name = "bankJdbcTemplate")

public JdbcTemplate bankJdbcTemplate(@Qualifier("bankDataSource") DataSource dataSource) {

return new JdbcTemplate(dataSource);

}

● 实现转入业务逻辑

// com.huawei.banka.controller.BankAController.java

@GetMapping(value = "transfer")

public String transfer(@RequestParam(value = "id") int id, @RequestParam(value =

"money") int money, @RequestParam(value = "errRate") int errRate) { LOGGER.info("global tx id:{}, transfer in",

DTMContext.getDTMContext().getGlobalTxId());

bankAService.transferIn(id, money);

return "ok";

}// com.huawei.common.impl.BankAService.java public void transferIn(int id, int money) { LOGGER.info("BankA transfer in");

jdbcTemplate.update(DtmConst.TransferSql.TRANSFER_IN_SQL, money, id);

}

bankB 服务

● 增加数据源DTMDataSource

// com.huawei.bankb.config.WebConfig.java

@Bean(name = "bankDataSource")

@ConfigurationProperties(prefix = "spring.datasource.bank") public DataSource bankDataSource() {

return new DTMDataSource(datasource);

}@Bean(name = "bankJdbcTemplate")

public JdbcTemplate bankJdbcTemplate(@Qualifier("bankDataSource") DataSource dataSource) {

return new JdbcTemplate(dataSource);

}

● 实现转出业务逻辑

// com.huawei.bankb.controller.BankBController.java

@GetMapping(value = "transfer")

public String transfer(@RequestParam(value = "id") int id, @RequestParam(value =

"money") int money, @RequestParam(value = "errRate") int errRate) { LOGGER.info("global tx id:{}, transfer out",

DTMContext.getDTMContext().getGlobalTxId());

try {

Thread.sleep(sleepMs);

} catch (Throwable e) { //ignore

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(64)

}

ExceptionUtils.addRuntimeException(errRate);

bankBService.transferOut(id, money);

return "ok";

}// com.huawei.common.impl.BankBService.java public void transferOut(int id, int money) { LOGGER.info("BankB transfer out");

jdbcTemplate.update(DtmConst.TransferSql.TRANSFER_OUT_SQL, money, id);

}

准备配置文件

步骤1 通过Maven执行clean、install,将工程进行打包,生成bankA、bankB、

bankCenter、invoke以及eureka服务的jar包。

步骤2 配置bankA-service所需配置文件。

1. 登录创建好的弹性云服务器,将bankA-service-springcloud.jar包上传至弹性云服 务器的bankA目录,并在bankA-service-springcloud.jar包同级目录下新建

“application.yaml”文件和“dtm-config”目录。

2. 把下列配置拷贝到“application.yaml”文件中,参考表2-5,修改username、

password和url为您创建好的bankA数据库用户名、密码和地址,同时修改eureka 服务的地址为实际ip地址,拷贝完成后保存退出。

server:

port: 8102 spring:

application:

name: dtm-banka main:

allow-bean-definition-overriding: true datasource:

bank:

username: ${db_user_name}

password: ${db_user_pwd}

url: jdbc:mysql://${db_ip}/banka?

verifyServerCertificate=false&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=

UTC driver-class-name: com.mysql.cj.jdbc.Driver eureka:

client:

serviceUrl:

defaultZone: http://${eureka_ip}:8761/eureka/

instance:

prefer-ip-address: true

2-5 bankA application.yaml 配置文件参数详解

参数 说明

db_user_name 客户端MySQL数据库用户名。

db_user_pwd 客户端MySQL数据库的密码。

db_ip 客户端MySQL数据库业务数据库地

址,分别为banka和bankb的地址,根 据实际情况修改。

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 60

(65)

参数 说明

eureka_ip eureka服务的地址,即启动eureka服 务的ip地址,根据实际情况修改。

3. 在新建目录“dtm-config”下,新建配置文件“dtmClientConfig.properties”,

把下列配置拷贝到配置文件

“dtmClientConfig.properties”中, 参考表2-6,按实际修改auto-create-table- dtm-tran-info、dtm-app-name、sc-server-address和rpc-ssl-switch。

auto-create-table-dtm-tran-info=on dtm-app-name=xxxx

sc-server-address=xxxx rpc-ssl-switch=off

2-6 dtmClientConfig.properties 配置文件参数详解

参数 说明

auto-create-table-

dtm-tran-info 是否自动创建DTM事务表dtm_tran_info,用来记录事 务信息。

– on:自动创建 – off:手动创建

dtm-app-name 应用名称,该配置项可从“应用管理与运维平台”控制 台“分布式事务管理 DTM > 引擎实例”界面中得到。

sc-server-address 服务中心地址,该配置项可从“应用管理与运维平台”

控制台“分布式事务管理 DTM > 引擎实例”界面中得 到。

rpc-ssl-switch SSL开关,该配置项可从“应用管理与运维平台”控制 台“分布式事务管理 DTM > 引擎实例”界面中得到。

– on:开启SSL – off:关闭SSL

2-5 DTM 引擎实例

步骤3 配置bankB-service所需配置文件。

1. 登录创建好的弹性云服务器,将bankB-service-springcloud.jar包上传至弹性云服 务器的bankB目录,并在bankB-service-springcloud.jar包同级目录下新建

“application.yaml”文件和“dtm-config”目录。

2. 把下列配置拷贝到“application.yaml”文件中,参考表2-5,修改username、

password和url为您创建好的bankB数据库用户名、密码和地址,同时修改eureka 服务的地址为实际ip地址,拷贝完成后保存退出。

server:

port: 8021

最佳实践 2 使用 DTM 保证银行转账业务数据一致性

(66)

spring:

application:

name: dtm-bankb main:

allow-bean-definition-overriding: true datasource:

bank:

username: ${db_user_name}

password: ${db_user_pwd}

url: jdbc:mysql://${db_ip}/bankb?

verifyServerCertificate=false&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=

UTC driver-class-name: com.mysql.cj.jdbc.Driver eureka:

client:

serviceUrl:

defaultZone: http://${eureka_ip}:8761/eureka/

instance:

prefer-ip-address: true

3. 在新建目录“dtm-config”下,新建配置文件“dtmClientConfig.properties”,

把下列配置拷贝到配置文件“dtmClientConfig.properties”中, 参考表2-6,按 实际修改auto-create-table-dtm-tran-info、dtm-app-name、sc-server-address 和rpc-ssl-switch。

auto-create-table-dtm-tran-info=on dtm-app-name=xxxx

sc-server-address=xxxx rpc-ssl-switch=off

步骤4 配置bankCenter-service所需配置文件。

1. 登录创建好的弹性云服务器,将bank-center-springcloud.jar包上传至弹性云服务 器的bankCenter目录,并在bank-center-springcloud.jar包同级目录下新建

“application.yaml”文件和“dtm-config”目录。

2. 把下列配置拷贝到“application.yaml”文件中,参考表2-7,修改eureka服务的 地址为实际ip地址,同时修改服务的调用方式。

server:

port: 8321 dtm: invoke:

mode: ${invoke_mode}

spring:

application:

name: dtm-bankcenter main:

allow-bean-definition-overriding: true eureka:

client:

serviceUrl:

defaultZone: http://${eureka_ip}:8761/eureka/

instance:

prefer-ip-address: true

文档版本 01 (2021-12-28) 版权所有 © 华为技术有限公司 62

數據

表 1-1 天气预报组件列表
表 1-3 授权参数说明 参数 说明 *授权名称 授权名称,创建之后不可更改。 *仓库类型 选择GitHub。 “授权方式”:支持OAuth/私人令牌。 图 1-7 设置授权参数 步骤3 单击“ 创建”,完成GitHub仓库授权创建。 图 1-8 授权成功 ----结束 创建组织 步骤1 登录ServiceStage控制台,选择“软件中心 &gt; 组织管理”。 步骤2 单击“创建组织”,在弹出的页面中填写“组织名称”。最佳实践 1 使用 ServiceStage 托管天气预报微服务应用
表 2-1 准备开发环境 准备项 说明 准备操作系统 Windows系统,推荐Windows 7及以上版本。 安装JDK JDK版本要求:1.8版本。 安装Maven DTM使用Maven获取项目版本,可以直接使用dtm-demo 目录下的settings文件。 Maven版本要求:3.3.0及以上。 安装和配置IntelliJ
表 2-2 dtmClientConfig.properties 配置文件参数详解 参数 说明  auto-create-table-dtm-tran-info 是否自动创建DTM事务表dtm_tran_info,用来记录事务信息。 ● on:自动创建事务表,可跳过初始化客户端数据库步骤 二。 ● off:手动创建事务表,可参考初始化客户端数据库步 骤二中方式二。 dtm-app-name 应用名称,该配置项可从“应用管理与运维平台”控制台 “分布式事务管理 DTM &gt; 引擎实例”界面中得到。 sc-
+7

參考文獻

相關文件

備註:地下配電線路裝 置、施工標準,在國家 標準未頒布前,暫依台 灣電力公司所訂之地下 配電線路設計、施工及

能夠按圖說進行裝 配、拆卸及維修基本 電子儀表裝置之零 組件,而且不損壞零

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系 統環境下,將給與的紙本或電子檔(如 excel

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系統環境 下,將給與的紙本或電子檔(如 excel

(B)可使用 object pool 重複利用已經初始化且可使用的物件,以避免經常銷毀再重新配置。(C) 可利用遊戲空檔(如暫停、切景時)主動呼叫 GC,以增進遊戲體驗。(D)在

2.核對該場地懸掛之評鑑合格崗位 數證明文件,如發現場地、崗位 數或崗位配置不符時,應立即反

Shift +a 新增方塊物件→使用 Scale 來調整物 件的大小→Translate 來調整方塊的位置→排 列成樓梯的形狀.. 使用 import 匯入躺椅的

利用 Microsoft Access 資料庫管理軟體,在 PC Windows 作業系 統環境下,將給與的紙本或電子檔(如 excel