开发指南
文档版本 01
发布日期 2022-01-20
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。
商标声明
和其他华为商标均为华为技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
华为技术有限公司
地址: 深圳市龙岗区坂田华为总部办公楼 邮编:518129
网址: https://www.huawei.com
客户服务邮箱:[email protected] 客户服务电话:4008302118
目 录
1 微服务开发指南... 1
1.1 概述... 1
1.1.1 开发简介... 1
1.1.2 常用概念... 3
1.1.3 开发流程... 4
1.2 开发微服务应用...6
1.3 准备环境...7
1.4 对接微服务应用... 10
1.4.1 Spring Cloud 接入 CSE...10
1.4.2 Java Chassis 接入 CSE... 14
1.4.3 Go Chassis 接入 CSE... 18
1.4.4 Dubbo 接入 CSE... 19
1.4.5 Mesher 接入 CSE... 22
1.4.5.1 Mesher 简介... 22
1.4.5.2 接入说明... 24
1.4.5.3 .Net core 接入服务网格...24
1.5 部署微服务应用... 27
1.6 使用微服务引擎功能... 27
1.6.1 使用服务注册... 27
1.6.2 使用配置中心... 30
1.6.2.1 配置中心概述...30
1.6.2.2 Java Chassis 使用配置中心...31
1.6.2.3 Spring Cloud 使用配置中心... 33
1.6.2.4 Dubbo 使用配置中心... 34
1.6.3 使用服务治理... 35
1.6.3.1 服务治理概述...35
1.6.3.2 基于动态配置的流量特征治理介绍...36
1.6.3.3 基于动态配置的流量特征治理开发...39
1.6.4 使用灰度发布... 42
1.6.5 使用 AZ 亲和... 44
1.6.6 使用仪表盘... 45
1.6.7 使用安全认证... 45
1.6.7.1 安全认证概述...46
1.6.7.2 创建安全认证帐号名和密码...46
1.6.7.3 配置微服务安全认证的帐号名和密码... 46
1.7 附录... 48
1.7.1 Java Chassis 版本升级参考... 48
1.7.2 AK/SK 认证方式排查与切换指导... 49
1.7.3 为微服务应用配置 AK/SK... 49
1.7.3.1 Java Chassis... 49
1.7.3.2 Go Chassis...50
1.7.3.3 Spring Cloud... 50
1.7.3.4 Mesher... 51
1.7.4 获取 AK/SK 与项目名称... 52
1.7.5 本地开发工具说明... 53
2 分布式事务管理开发指南... 54
2.1 概述... 54
2.1.1 开发简介... 54
2.1.2 常用概念... 55
2.1.3 开发流程... 56
2.2 使用非侵入模式接入 DTM... 57
2.2.1 非微服务框架代码接入 DTM... 57
2.2.1.1 版本获取及引入依赖...57
2.2.1.2 数据源配置... 58
2.2.1.3 添加客户端配置文件...58
2.2.1.4 业务库中创建事务表...59
2.2.1.5 定义全局事务发起者...59
2.2.2 Spring Cloud 接入 DTM... 60
2.2.2.1 版本获取及引入依赖...60
2.2.2.2 数据源配置... 60
2.2.2.3 添加客户端配置文件...61
2.2.2.4 业务库中创建事务表...61
2.2.2.5 定义全局事务发起者...62
2.2.3 Spring Cloud Huawei 接入 DTM... 63
2.2.3.1 版本获取及引入依赖...63
2.2.3.2 数据源配置... 63
2.2.3.3 添加客户端配置文件...63
2.2.3.4 业务库中创建事务表...64
2.2.3.5 定义全局事务发起者...65
2.2.4 ServiceComb 接入 DTM... 65
2.2.4.1 版本获取及引入依赖...65
2.2.4.2 ServiceComb handler 链中添加 DTM... 66
2.2.4.3 数据源配置... 66
2.2.4.4 添加客户端配置文件...66
2.2.4.5 业务库中创建事务表...67
2.2.4.6 定义全局事务发起者...68
2.2.5 Dubbo 接入 DTM...68
2.2.5.1 版本获取及引入依赖...68
2.2.5.2 数据源配置... 68
2.2.5.3 添加客户端配置文件...69
2.2.5.4 业务库中创建事务表...70
2.2.5.5 定义全局事务发起者...70
2.2.6 Dubbo ServiceComb 接入 DTM... 71
2.2.6.1 版本获取及引入依赖...71
2.2.6.2 数据源配置... 71
2.2.6.3 添加客户端配置文件...71
2.2.6.4 业务库中创建事务表...72
2.2.6.5 定义全局事务发起者...73
2.2.7 非侵入注解参数项... 73
2.3 使用 TCC 模式接入 DTM... 74
2.3.1 非微服务框架代码接入 DTM 样例指南...74
2.3.1.1 版本获取及引入依赖...74
2.3.1.2 数据源配置... 74
2.3.1.3 添加客户端配置文件...75
2.3.1.4 业务库中创建事务表...75
2.3.1.5 定义全局事务和分支事务... 76
2.3.2 Spring Cloud 接入 DTM... 77
2.3.2.1 版本获取及引入依赖...77
2.3.2.2 数据源配置... 78
2.3.2.3 添加客户端配置文件...78
2.3.2.4 业务库中创建事务表...79
2.3.2.5 定义全局事务和分支事务... 79
2.3.3 Spring Cloud Huawei 接入 DTM... 81
2.3.3.1 版本获取及引入依赖...81
2.3.3.2 数据源配置... 81
2.3.3.3 添加客户端配置文件...82
2.3.3.4 业务库中创建事务表...82
2.3.3.5 定义全局事务和分支事务... 83
2.3.4 ServiceComb 接入 DTM... 84
2.3.4.1 版本获取及引入依赖...84
2.3.4.2 ServiceComb handler 链中添加 DTM... 85
2.3.4.3 数据源配置... 85
2.3.4.4 添加客户端配置文件...85
2.3.4.5 业务库中创建事务表...86
2.3.4.6 定义全局事务和分支事务... 87
2.3.5 Dubbo 接入 DTM...88
2.3.5.1 版本获取及引入依赖...88
2.3.5.2 数据源配置... 88
2.3.5.3 添加客户端配置文件...89
2.3.5.4 业务库中创建事务表...89
2.3.5.5 定义全局事务和分支事务... 90
2.3.6 Dubbo ServiceComb 接入 DTM... 91
2.3.6.1 版本获取及引入依赖...91
2.3.6.2 数据源配置... 92
2.3.6.3 添加客户端配置文件...92
2.3.6.4 业务库中创建事务表...93
2.3.6.5 定义全局事务和分支事务... 93
2.3.7 TCC 注解参数项...94
2.4 MQ 消息接入 DTM 事务... 95
2.4.1 版本获取及引入依赖... 95
2.4.2 添加客户端配置文件... 96
2.4.3 配置 RocketMq Producer... 96
2.5 SQL 参考... 97
2.5.1 SQL 限制... 97
2.5.2 DML 语句... 97
2.5.3 SQL 修饰... 98
2.5.4 SQL 函数... 100
1 微服务开发指南
概述
开发微服务应用 准备环境 对接微服务应用 部署微服务应用 使用微服务引擎功能 附录
1.1 概述
1.1.1 开发简介
微服务简介
随着微服务架构模式被越来越多的开发者作为应用系统构建的首选,稳定可靠的微服 务运行环境变的非常重要。
微服务引擎(CSE)是应用管理与运维平台(ServiceStage)针对微服务解决方案提供 的一站式管理平台,使用微服务引擎,开发者可以更加专注于业务开发,提升产品交 付效率和质量。微服务架构模式通常包含如下内容:
● 微服务之间的RPC通信。微服务架构模式要求微服务之间通过RPC进行通信,不采 用其他传统的通信方式,比如共享内存、管道等。常见的RPC通信协议包括 REST、gRPC、Web Service等。使用RPC通信,能够降低微服务之间的耦合,提 升系统的开放性,减少技术选型的限制。一般建议采用业界标准协议,比如 REST。对于性能要求非常高的场景,也可以考虑私有协议。
● 分布式微服务实例和服务发现。微服务架构特别强调架构的弹性,业务架构需要 支持微服务多实例部署来满足业务流量的动态变化。微服务设计一般会遵循无状 态设计原则,符合该原则的微服务扩充实例,能够带来处理性能的线性提升。当 实例数很多的时候,就需要有一个支持服务注册和发现的中间件,用于微服务之 间的调用寻址。
● 配置外置及动态、集中的配置管理。随着微服务和实例数的增加,管理微服务的 配置会变得越来越复杂。配置管理中间件给所有微服务提供统一的配置管理视 图,有效降低配置管理的复杂性。配置管理中间件搭配治理控制台,可以在微服 务运行态对微服务的行为进行调整,满足业务场景变化、不升级应用的业务诉 求。
● 提供熔断、隔离、限流、负载均衡等微服务治理能力。微服务架构存在一些常见 的故障模式,通过这些治理能力,能够减少故障对于整体业务的影响,避免雪崩 效应。
● 分布式事务管理能力。常见的分布式事务处理模式包括Saga、TCC、无侵入式 等。分布式事务管理可以降低处理分布式事务一致性问题的难度。
● 调用链、集中日志采集和检索。查看日志仍然是分析系统故障最常用的手段,调 用链信息可以帮助界定故障和分析性能瓶颈。
有很多开源框架,比如Apache ServiceComb Java Chassis(简称Java Chassis)、
Spring Cloud、Apache Dubbo(简称Dubbo)、Go Chassis等,实现了微服务架构 模式。微服务引擎支持这些开源的微服务框架接入并使用微服务架构模式的注册发 现、集中配置、服务治理、分布式事务等功能。关系如下图所示:
开发能力要求
本文档的主要目的就是说明这些开源微服务开发框架如何接入和使用微服务引擎的功 能,假设您已经熟悉和掌握如下开发能力:
● 使用Java或者Go语言进行微服务开发。假设您已经基于一种ServiceStage支持的 微服务开发框架开发了应用系统,并期望将应用系统托管在微服务引擎上运行。
本文档提供微服务应用接入微服务引擎的相关技术支持。开源微服务开发框架如 何使用不是本文档的范围,您可以通过开源社区获取相关微服务开发框架的入门 材料和开发指南。
● 理解注册中心、配置中心在微服务应用中的作用,并在项目中搭建和使用注册中 心。不同的微服务开发框架默认支持的开源注册中心会有差异,理解注册中心的 作用,可以更加容易的更换注册中心。
● 熟悉虚机或者容器环境部署应用,请参考应用组件部署。
微服务开发框架版本说明
微服务开发框架支持的版本和推荐版本如下表所示,如果您已经使用低版本的微服务 开发框架构建应用,建议升级到推荐版本,以获取最稳定和丰富的功能体验。
框架 支持版本 推荐版本 接入说明
JavaChassis 2.1.3及以上 2.3.0及以上 可以直接使用开源项目提供的软件 包接入,不需要引用其他第三方软 件包。
JavaChassis 2.0.0~2.1.2 - 可以直接接入微服务引擎专享版。
接入微服务引擎专业版,需要额外 引入由CSE SDK提供的
foundation-auth软件包。
JavaChassis 1.3.x -
GoChassis 2.x.x 2.2.0及以上 可以直接使用开源项目提供的软件 包接入,不需要引用其他第三方软 件包。
GoChassis 1.x.x - 可以直接使用开源项目提供的软件 包接入,不需要引用其他第三方软 件包。
Spring
Cloud 1.5.1-Hoxton及以 上
1.6.0- Hoxton及以 上
采用Spring Cloud Huawei项目 提供接入支持。推荐版本为Spring Cloud Huawei的版本号。
Spring
Cloud 1.5.1-Greenwich及 以上
- 采用Spring Cloud Huawei项目 提供接入支持。
Spring
Cloud 1.5.1-Finchley及以
上 - 采用Spring Cloud Huawei项目 提供接入支持。
Apache
Dubbo 1.3.x (Dubbo
2.7.x) 1.3.6及以上 采用Dubbo ServiceComb项目提 供接入支持。推荐版本为Dubbo Serivcecomb的版本号。
Apache
Dubbo 1.1.x (Dubbo
2.6.x) - 采用Dubbo ServiceComb项目提 供接入支持。
1.1.2 常用概念
微服务引擎核心概念
● 应用:可以将应用理解为完成某项完整业务场景的软件系统。应用一般由多个微 服务组成,应用里面的微服务能够相互发现和调用。
● 微服务:完成某项具体业务功能的软件系统。微服务是独立开发、部署的单元。
● 微服务实例:将微服务采用部署系统部署到运行环境,就产生了实例。可以将实 例理解为一个进程,一个微服务可以部署若干实例。
● 微服务环境:服务中心建立的一个逻辑概念,比如development、production 等。不同环境里面的微服务实例逻辑隔离、无法相互发现和调用。
ServiceStage 核心概念
ServiceStage也存在几个对应的概念,在实际使用过程中容易发生混淆,包括:
● 应用:ServiceStage的应用和微服务引擎的应用在含义上类似。ServiceStage的应 用名称是部署环节指定的,微服务引擎的应用是微服务开发环节指定的,两者没 有必然联系,可以不同。微服务开发框架都提供了环境变量映射的功能,通过环 境变量映射的功能,开发者可以使用ServiceStage的应用名称作为微服务的应用名 称。
● 组件:ServiceStage的组件对应于微服务引擎的微服务。和应用一样,名称分别是 部署环节指定和开发环节指定,通过环境变量映射,微服务引擎可以使用
ServiceStage的组件名称。
● 实例:ServiceStage的实例对应于微服务引擎的实例。只要部署成功,
ServiceStage就有实例了。微服务引擎要求必须成功注册到服务中心,才会有实 例。在服务正常注册的情况下,两者实例数是一样的,注册失败的情况下,微服 务引擎没有实例,而ServiceStage有实例。
● 环境:ServiceStage的环境和微服务引擎的环境概念不同。ServiceStage的环境是 一系列资源组成的运行环境,环境里面包含了微服务引擎、云容器引擎(CCE)等 资源。
1.1.3 开发流程
开发流程概述
开发应用和使用微服务引擎,需要经过如图1-1所示的几个阶段。
图1-1 开发流程
开发流程说明
1. 开发微服务应用
如果您已经完成了微服务应用的开发,可以跳过本流程,进入准备环境。
进行微服务应用开发,首先需要进行技术选型。技术选型是一个复杂的问题,技 术决策者需要考虑使用的技术是否容易被团队成员掌握,技术能否满足项目对于 功能、性能、可靠性方面的要求,还需要考虑商业服务等多方面的因素。本文档 不探讨技术选型,假设技术团队已经选择了适合自己的开发框架。大部分技术团 队都会选择开源框架来构建业务。
开发微服务应用的具体内容,请参考开发微服务应用。
– 使用Java Chassis,通常会使用下面的技术进行本地微服务开发:
– 使用Dubbo,通常会使用下面的技术进行本地微服务开发:
– 使用Spring Cloud,通常会使用下面的技术进行本地微服务开发:
2. 准备环境
创建云上环境,以支持微服务引擎接入调试、云上应用部署和使用微服务引擎功 能。一般情况下,会创建一个测试环境和一个生产环境。通过ServiceStage,能够 非常方便的管理云上环境,详细内容请参考准备环境。
3. 对接微服务应用
用于微服务应用对接微服务引擎,涉及到对已经开发好的应用的配置文件、构建 脚本的修改。修改完成后,需要对应用重新编译、打包,通过ServiceStage将应用 包部署到微服务引擎,详细内容请参考对接微服务应用。
4. 部署微服务应用
开发完成的微服务应用,通过ServiceStage部署到微服务引擎,详细内容请参考部 署微服务应用。
5. 使用微服务引擎功能
对于持续发展的应用系统,都会持续完善和迭代,每个迭代可能需要对微服务应 用进行更新升级,需要使用更多的微服务引擎功能。持续迭代的功能演进,会重 复上面的应用开发、编译、打包和部署环节。详细内容请参考使用微服务引擎功 能。
1.2 开发微服务应用
如您已经完成了微服务应用的开发,请跳过本章节。
开源社区提供了丰富的开发资料和帮助渠道帮助您使用微服务开发框架。如您需深入 了解具体微服务框架下的微服务应用开发,请参考本章节给出的参考资料链接。
体验微服务引擎最快捷的方式是使用“微服务引擎推荐示例”里面的例子。下载示 例,修改配置文件中的微服务引擎地址,AK/SK信息,在本地运行例子,这些例子可 以注册到微服务引擎。
● Java Chassis
源码仓库:https://github.com/apache/servicecomb-java-chassis 问题咨询:https://github.com/apache/servicecomb-java-chassis/issues 开发指南:https://servicecomb.apache.org/references/java-chassis/zh_CN/
微服务引擎推荐示例:https://github.com/apache/servicecomb-samples/
tree/master/basic
● Go Chassis
源码仓库:https://github.com/go-chassis/go-chassis 问题咨询:https://github.com/go-chassis/go-chassis/issues 开发指南:https://go-chassis.readthedocs.io/en/latest/
微服务引擎推荐示例:https://github.com/go-chassis/go-chassis/tree/
master/examples/discovery
● Spring Cloud
源码仓库:https://github.com/spring-cloud 问题咨询:参考源码仓库的各个代码仓库下的issues 开发指南:https://spring.io/projects/spring-cloud
Spring Cloud Huawei项目:https://github.com/huaweicloud/spring-cloud- huawei
微服务引擎推荐示例:https://github.com/huaweicloud/spring-cloud- huawei-samples/tree/master/basic
● Dubbo
源码仓库:https://github.com/apache/dubbo
问题咨询:https://github.com/apache/dubbo/issues 开发指南:https://dubbo.apache.org/zh/
Dubbo ServiceComb项目:https://github.com/huaweicloud/dubbo- servicecomb
微服务引擎推荐示例:https://github.com/huaweicse/dubbo-servicecomb- samples/tree/master/basic
1.3 准备环境
环境准备包括本地开发调试环境和云上环境准备。
准备本地开发调试环境
本地开发调试环境用于搭建一个简易的测试环境,可以有以下两种选择:
● 下载本地轻量化微服务引擎。
● 使用微服务引擎专业版或者使用微服务引擎专享版,并开放公网访问的IP,保证 本地环境能够访问。
准备云上环境
微服务应用部署到云上,需要先准备云上环境。准备环境一般包含如下任务:
● 获取AK/SK及项目名称,请参考获取AK/SK与项目名称。
说明
● 如果使用微服务引擎专业版,需要配置AK/SK。
● 如果使用微服务引擎专享版,不需要配置AK/SK。
● 创建微服务引擎,请参考创建微服务引擎专享版。
● 创建环境,请参考创建环境。创建的环境,需包含CCE集群、ELB及微服务引擎等 资源。
● 创建应用,请参考创建应用。
常用环境变量说明
通过ServiceStage管理环境和部署应用,能够简化用户的配置。ServiceStage会设置一 些环境变量,供应用使用,常用的环境变量包括下表所示内容:
表1-1 常用环境变量
环境变量名称 含义
PAAS_CSE_ENDP
OINT CSE注册中心、配置中心等服务的地址信息。这个环境变量在 微服务引擎专业版通过APIG访问的时候使用,上述服务的外部 访问地址是统一的域名。
说明
不建议使用这个环境变量,而是使用具体服务的环境变量,避免在微服 务引擎专享版的场景下存在歧义,需要修改应用程序。
PAAS_CSE_SC_EN
DPOINT CSE服务注册发现地址信息。
PAAS_CSE_CC_EN
DPOINT CSE配置中心地址信息。
PAAS_PROJECT_N
AME 项目名称。
CAS_APPLICATIO
N_NAME ServiceStage的应用名称。
CAS_COMPONEN
T_NAME ServiceStage的组件名称。
CAS_INSTANCE_V
ERSION ServiceStage的部署版本号。
您可以结合不同微服务开发框架的机制,比如Spring Cloud提供的Place Holder机制、
Java Chassis提供的“mapping.yaml”机制等来合理使用这些变量,减少部署需要手 工输入的内容。
ServiceStage创建应用过程中,可以绑定中间件(如DCS、RDS)。应用绑定的中间件 配置信息可以通过以下环境变量获取。
● 分布式会话
基于DCS实现的稳定可靠的会话存储,支持主流Web容器的自动注入,如tomcat context,node.js express-session,php的session handler等。
分布式会话相关环境变量说明如下表所示。
表1-2 DCS 分布式会话相关环境变量
环境变量 说明
DISTRIBUTED_SESSION_CLUSTER 实例是否是集群模式,取值true/false DISTRIBUTED_SESSION_TYPE 分布式会话实例的存储类型,当前只
支持Redis
DISTRIBUTED_SESSION_VERSION 分布式会话实例的版本号 DISTRIBUTED_SESSION_NAME 分布式会话实例的名称
环境变量 说明
DISTRIBUTED_SESSION_HOST 分布式会话实例的连接IP地址 DISTRIBUTED_SESSION_PORT 分布式会话实例的连接IP端口 DISTRIBUTED_SESSION_PASSWORD 分布式会话实例的连接密码
● 分布式缓存
分布式缓存服务(Distributed Cache Service,简称DCS)是华为云提供的一款内 存数据库服务,兼容了Redis和Memcached两种内存数据库引擎,为您提供即开 即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发 及数据快速访问的业务诉求。
分布式缓存相关环境变量如下表所示。
表1-3 DCS 分布式缓存相关环境变量
环境变量 说明
DISTRIBUTED_CACHE_CLUSTER 实例是否是集群模式,取值true/false DISTRIBUTED_CACHE_TYPE 分布式缓存实例的存储类型,当前只
支持Redis
DISTRIBUTED_CACHE_VERSION 分布式缓存实例的版本号 DISTRIBUTED_CACHE_NAME 分布式缓存实例的名称 DISTRIBUTED_CACHE_HOST 分布式缓存实例的连接IP地址 DISTRIBUTED_CACHE_PORT 分布式缓存实例的连接IP端口 DISTRIBUTED_CACHE_PASSWORD 分布式缓存实例的连接密码
● 关系型数据库
华为云关系型数据库(Relational Database Service,简称RDS)是一种基于云计 算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线关系型数据库服务。
关系型数据库相关环境变量如下表所示。
表1-4 RDS 关系型数据库相关环境变量
环境变量 说明
RELATIONAL_DATABASE_NAME 关系型数据库实例名称 RELATIONAL_DATABASE_CONNECTI
ON_TYPE 关系型数据库实例的连接类型,取值
为JNDI/
SPRING_CLOUD_CONNECTOR RELATIONAL_DATABASE_JNDI_NAM
E 关系型数据库实例的JNDI名称,如果
连接类型为JNDI
RELATIONAL_DATABASE_DB_NAME 关系型数据库实例的数据库名
环境变量 说明
RELATIONAL_DATABASE_DB_USER 关系型数据库实例的数据库用户 RELATIONAL_DATABASE_DB_TYPE 关系型数据库实例的数据库类型,当
前只支持MySQL
RELATIONAL_DATABASE_VERSION 关系型数据库实例的数据库版本 RELATIONAL_DATABASE_HOST 关系型数据库实例的数据库IP地址 RELATIONAL_DATABASE_PORT 关系型数据库实例的数据库端口 RELATIONAL_DATABASE_PASSWOR
D 关系型数据库实例的数据库密码
1.4 对接微服务应用
1.4.1 Spring Cloud 接入 CSE
本章节介绍Spring Cloud如何接入CSE,使得Spring Cloud能够对接CSE,并且方便的 使用CSE提供的最常用的功能。在使用微服务引擎功能章节,会给出具体的开发指导。
本章节介绍的开发方法,可以在Spring Cloud Huawei Samples项目中找到对应的代 码,供您在开发过程中参考。
说明
Spring Cloud接入CSE需要使用Spring Cloud Huawei,本文主要描述如何在Spring Cloud中集成 和使用Spring Cloud Huawei。
前提条件
● 已基于Spring Cloud开发好了微服务应用。
Spring Cloud微服务框架下的微服务应用开发,请参考https://spring.io/
projects/spring-cloud。
● 版本要求:Spring Cloud Huawei 1.6.0-Hoxton及以上版本。
● 本文假设您的项目使用了maven管理打包,您熟悉maven的依赖管理机制,能够 正确的修改pom.xml文件中的dependency management和dependency。
操作步骤
步骤1 在项目的“pom.xml”文件中引入依赖。
● 如果使用Spring Cloud开发微服务,引入:
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
</dependency>
● 如果使用Spring Cloud Gateway开发网关,引入:
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-service-engine-gateway</artifactId>
</dependency>
推荐使用Maven Dependency Management管理项目依赖的三方软件,在项目中 引入:
<dependencyManagement>
<dependencies>
<!-- configure user spring cloud / spring boot versions -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- configure spring cloud huawei version -->
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-huawei-bom</artifactId>
<version>${spring-cloud-huawei.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果您的项目中,已经包含了上述依赖,则不需要做任何处理。
如果您的项目中使用了其他注册发现库,比如eureka,需要对项目进行适当调整,包 括:
● 删除项目中eureka相关依赖,比如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
● 如果代码中使用了@EnableEurekaServer, 需要删除并替换为
@EnableDiscoveryClient。
说明
组件spring-cloud-starter-huawei-service-engine包含了服务注册、配置中心、服务治理、
灰度发布、契约管理等功能。其中契约管理对于Spring Cloud微服务应用的运行不是必须 的。微服务引擎对契约个数存在数量限制,当微服务应用契约个数超过限制,会注册失 败。如果遗留系统无法进行合理的拆分减少契约个数,可以排除依赖,不使用契约管理功 能。
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-service-engine</artifactId>
<exclusions>
<exclusion>
<groupId>com.huaweicloud</groupId>
<artifactId>spring-cloud-starter-huawei-swagger</artifactId>
</exclusion>
</exclusions>
</dependency>
步骤2 配置微服务信息。
在“bootstrap.yml”增加微服务描述信息。如果项目中没有“bootstrap.yml”,则创 建一个新的文件。
spring:
application:
name: basic-provider cloud:
servicecomb:
discovery:
enabled: true
address: http://127.0.0.1:30100 appName: basic-application
serviceName: ${spring.application.name}
version: 0.0.1
healthCheckInterval: 30 config:
serverAddr: http://127.0.0.1:30113 serverType: config-center
步骤3 (可选)配置AK/SK。
如果使用微服务引擎专业版,需要配置AK/SK;如果使用微服务引擎专享版,不需要 配置AK/SK,可以跳过这个步骤。
AK/SK在“bootstrap.yml”中配置,默认提供明文配置,支持用户自定义加密存储。
● 明文方法,在“bootstrap.yml”文件中增加配置。
spring:
cloud:
servicecomb:
credentials:
enabled: true accessKey: AK secretKey: SK
akskCustomCipher: default project: 项目名称
● 自定义实现
a. 首先实现接口“com.huaweicloud.common.util.Cipher”,里面有两个方 法:
▪
String name(),这个是servicecomb.credentials.akskCustomCipher的 名称定义,需要配置在配置文件中。▪
char[] decode(char[] encrypted),解密接口,对secretKey进行解密后 使用。public class CustomCipher implements Cipher
加密解密的实现需要作为BootstrapConfiguration,首先声明:
@Configuration
public class MyAkSKCipherConfiguration { @Bean
public Cipher customCipher() { return new CustomCipher();
}}
然后增加文件 “META-INF/spring.factories”定义配置:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.huaweicloud.common.transport.MyAkSKCipherConfiguration
b. 自定义完成,即可在“bootstrap.yaml”文件中使用新增加的解密算法:
spring:
cloud:
servicecomb:
credentials:
enabled: true accessKey: AK secretKey: SK
akskCustomCipher: 自定义算法名称 project: 项目名称
步骤4 (可选)配置安全认证参数。
使用微服务引擎专享版,并且启用了安全认证,需要配置,其他场景可以跳过这个步 骤。
微服务引擎开启了安全认证之后,所有调用的API都需要先获取token才能调用,认证 流程请参考服务中心RBAC说明。
使用安全认证首先需要从微服务引擎获取用户名和密码,然后在配置文件中增加如下 配置。和配置AK/SK一样,password默认明文存储,开发者可以自定义password的加 密存储算法,这里不重复描述。
● 明文方法 spring:
cloud:
servicecomb:
credentials:
account:
name:用户名 password:密码 cipher: default
● 自定义实现加密存储方法
首先实现接口com.huaweicloud.common.util.Cipher,里面有两个方法:
String name(),这个是spring.cloud.servicecomb.credentials.cipher的名称定义,需要配置在 配置文件中。
char[] decode(char[] encrypted),解密接口,对secretKey进行解密后使用。
public class CustomCipher implements Cipher
加密解密的实现需要作为BootstrapConfiguration,首先声明:
@Configuration
public class MyCipherConfiguration { @Bean
public Cipher customCipher() { return new CustomCipher();
}}
然后增加文件 META-INF/spring.factories定义配置:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.huaweicloud.common.transport.MyCipherConfiguration 自定义完成,即可在bootstrap.yaml文件中使用新增加的解密算法:
spring:
cloud:
servicecomb:
credentials:
account:
name:用户名 password:密码
cipher: 自定义算法名称 说明
使用安全认证功能,需要1.6.0-Hoxton及以上版本。
使用微服务引擎专业版,不能使用watch功能,需要在配置文件里面关闭,否则会周期性打印错 误日志。服务中心设置watch=false。1.6.0-Hoxton及以上版本默认没有开启watch功能,不需 要设置。
spring:
cloud:
servicecomb:
discovery:
watch: false ----结束
1.4.2 Java Chassis 接入 CSE
本章节介绍Java Chassis如何接入CSE,使得Java Chassis能够对接CSE,并且方便的使 用CSE提供的最常用的功能。在使用微服务引擎功能章节,会给出具体的开发指导。
本章节介绍的开发方法,可以在Apache ServiceComb Samples项目中找到对应的代 码,供您在开发过程中参考。
前提条件
● 已基于Java Chassis开发好了微服务应用。
Java Chass框架下的微服务应用开发,请参考https://servicecomb.apache.org/
references/java-chassis/zh_CN/。
● 版本要求:Java Chassis 2.3.0及以上版本。
● 本文假设您的项目使用了maven管理打包,您熟悉maven的依赖管理机制,能够 正确的修改“pom.xml”文件中的dependency management和dependency。
● Java Chassis支持和不同的技术进行组合使用,配置文件的名称和实际使用的技术 有关。如果您采用Spring方式使用Java Chassis,配置文件的名称一般为
“microservice.yaml”,如果您采用Spring Boot方式使用Java Chassis, 配置文 件名称一般为“application.yaml”。本文统一使用“microservice.yaml”表示配 置文件,请结合实际项目进行区分。
操作步骤
步骤1 在项目的“pom.xml”文件中引入依赖。
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>solution-basic</artifactId>
</dependency>
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>servicestage-environment</artifactId>
</dependency>
推荐使用Maven Dependency Management管理项目依赖的三方软件,在项目的
“pom.xml”文件中引入:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>java-chassis-dependencies</artifactId>
<version>${java-chassis.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
如果您的项目中,已经包含了上述依赖,则不需要做任何处理。
其中servicestage-environment软件包是可选的。这个软件包提供了环境变量映射的功 能,依赖这个软件包以后,当您采用ServiceStage部署应用,不用手工修改服务注册发 现地址、配置中心地址、项目名称等信息,会通过环境变量覆盖
“microservice.yaml”中的默认配置,它包含“mapping.yaml”文件,在您自己的项 目中增加“mapping.yaml”文件能够起到同样的效果。
说明
“mapping.yaml”在后续新版本可能会发生变化,以适配CSE最新的功能要求。如果期望后续 升级新版本保持稳定而不是跟随CSE演进,您可以选择不依赖servicestage-environment,而是 在您自己的项目中增加“mapping.yaml”。
PAAS_CSE_ENDPOINT:
- servicecomb.service.registry.address - servicecomb.config.client.serverUri PAAS_CSE_SC_ENDPOINT:
- servicecomb.service.registry.address PAAS_CSE_CC_ENDPOINT:
- servicecomb.config.client.serverUri PAAS_PROJECT_NAME:
- servicecomb.credentials.project
# CAS_APPLICATION_NAME:
# - servicecomb.service.application
# CAS_COMPONENT_NAME:
# - servicecomb.service.name
# CAS_INSTANCE_VERSION:
# - servicecomb.service.version
solution-basic里面引入了常用的软件包,并且提供了默认的“microservice.yaml”文 件。这个配置文件配置了常用的Handler和参数。其内容如下:
# order of this configure file servicecomb-config-order: -100
servicecomb:
# handlers handler:
chain:
Provider:
default: qps-flowcontrol-provider Consumer:
default: qps-flowcontrol-consumer,loadbalance,fault-injection-consumer
# loadbalance strategies references:
version-rule: 0 loadbalance:
retryEnabled: true retryOnNext: 1 retryOnSame: 0
# metrics and access log accesslog:
enabled: true metrics:
window_time: 60000 invocation:
latencyDistribution: 0,1,10,100,1000 Consumer.invocation.slow:
enabled: true msTime: 1000
Provider.invocation.slow:
enabled: true msTime: 1000 publisher.defaultLog:
enabled: true
endpoints.client.detail.enabled: true
“microservice.yaml”配置文件设置了servicecomb-config-order: -100 , 表示配置 文件的优先级很低(order越大,优先级越高,缺省为0),如果业务服务增加了同样 的配置项,会覆盖这里的配置。
说明
“microservice.yaml”文件在后续新版本可能会发生变化,以适配CSE最新的功能要求。如果期 望后续升级新版本保持稳定而不是跟随CSE演进,您可以考虑将配置项写到您自己的
“microservice.yaml”文件中。
步骤2 (可选)配置AK/SK。
如果使用微服务引擎专业版,需要配置AK/SK;如果使用微服务引擎专享版,不需要 配置AK/SK,可以跳过这个步骤。
AK/SK在“microservice.yaml”中配置,ServiceComb默认提供明文配置,支持用户自 定义加密存储方案。
● 明文方法,在“microservice.yaml”文件中增加配置。
servicecomb:
credentials:
accessKey: AK secretKey: SK project: 项目名称
akskCustomCipher: default
● 自定义实现,首先实现接口
“org.apache.servicecomb.foundation.auth.Cipher”,里面有两个方法:
– String name()
这个是servicecomb.credentials.akskCustomCipher的名称定义,需要配置在 配置文件中。
– char[] decode(char[] encrypted)
解密接口,对secretKey进行解密后使用。
实现类需要声明为SPI,比如:
package com.example
public class MyCipher implements Cipher
创建SPI配置文件,文件名称和路径为META-INF/serivces/
org.apache.servicecomb.foundation.auth.Cipher, 文件内容为:
com.example.MyCipher
然后在“microservice.yaml”文件中增加配置。
servicecomb:
credentials:
accessKey: AK
secretKey: SK #对应的加密后的SK project: 项目名称
akskCustomCipher: youciphername #实现类里面的name()方法返回的名称 说明
如果不想将AK/SK写入配置文件,也可以使用如下两种方法,具体操作请参考Java Chassis。
● 使用环境变量。操作系统环境变量名称不支持“.”,Java Chassis能够自动处理 servicecomb_credentials_accessKey环境变量,将其映射到
servicecomb.credentials.accessKey。
● 增加“mapping.yaml”文件,自定义环境变量名称。在步骤1介绍模块servicestage- environment的时候,已经用到了这个方法。
步骤3 (可选)配置安全认证参数。
使用微服务引擎专享版,并且启用了安全认证,需要配置,其他场景可以跳过这个步 骤。
微服务引擎开启了安全认证之后,所有调用的API都需要先获取token,才能调用,认 证流程请参考服务中心RBAC说明。
使用安全认证首先需要从微服务引擎获取用户名和密码,然后在配置文件中增加如下 配置:
servicecomb:
credentials:
rbac.enabled: true account:
name: your account name # 从微服务引擎获取的用户名 password: your password # 从微服务引擎获取的密码
cipher: default #接口org.apache.servicecomb.foundation.auth.Cipher的实现类里面的name() 方法返回的名称
其中“cipher”指定了对“password”进行加密的算法名称,默认提供明文存储。
和AK/SK认证的加密方案类似,通过实现接口
“org.apache.servicecomb.foundation.auth.Cipher”可以对密码进行加密存储。
说明
● 明文存储无法保证安全, 建议您对密码进行加密存储。
● 和配置AK/SK一样,也可以使用环境变量配置用户名和密码信息,请参考Java Chassis。
● 使用微服务引擎专业版,不能使用watch功能,需要在配置文件里面关闭,否则会周期性打 印错误日志。服务中心设置watch=false,配置中心设置refreshMode=1。
servicecomb:
service:
application: porter-application name: user-service
version: 0.0.1 registry:
address: http://localhost:30100 instance:
watch: false config:
client:
serverUri: http://localhost:30113 refreshMode: 1
----结束
1.4.3 Go Chassis 接入 CSE
本章节介绍Go Chassis如何接入CSE,使得Go Chassis能够对接CSE,并且方便的使用 CSE提供的最常用的功能。在使用微服务引擎功能章节,会给出具体的开发指导。
本章节介绍的开发方法,可以在Go Chassis Sample Discovery项目中找到对应的代 码,供您在开发过程中参考。
前提条件
● 已基于Go Chassis开发好了微服务应用。
Go Chassis微服务框架下的微服务应用开发,请参考https://go- chassis.readthedocs.io/en/latest/。
● 相关软件版本要求:
– Golang 1.14及以上版本 – Go Chassis 2.2.0及以上版本
– github.com/go-chassis/go-chassis-cloud v2.1.1及以上版本
操作步骤
步骤1 在项目的“go.mod”文件中引入依赖。
请在您的项目的“go.mod”中添加以下依赖。如果您的项目中已经包含以下依赖,则 不需要做任何处理。
github.com/go-chassis/go-chassis-cloud v2.1.1 步骤2 设置注册中心和配置中心。
在“chassis.yaml”文件中增加配置项:
servicecomb:
registry:
type: servicecenter
address: 服务注册发现地址 config:
client:
type: config-center serverUri: 配置中心地址 步骤3 (可选)配置AK/SK。
如果使用微服务引擎专业版,需要配置AK/SK;如果使用微服务引擎专享版,不需要 配置AK/SK,可以跳过这个步骤。
AK/SK在“chassis.yaml”(或“auth.yaml”)中配置,Go Chassis默认提供明文配 置,支持用户自定义加密存储方案。
● 明文方法 增加如下配置:
cse: credentials:
accessKey: AK secretKey: SK project: 项目名称
akskCustomCipher: default
● 自定义实现
Go Chassis读取“secretKey”后将使用akskCustomCipher插件进行解密,因此用 户可使用akskCustomCipher插件对“secretKey”明文进行加密后再配置。
增加如下配置:
cse: credentials:
accessKey: AK
secretKey: SK #对应的加密后的SK project: 项目名称
akskCustomCipher: yourCipher
akskCustomCipher插件的开发方法请参考:https://go-
chassis.readthedocs.io/en/latest/dev-guides/how-to-write-cipher.html?
highlight=cipher#protect-your-sk。
----结束
1.4.4 Dubbo 接入 CSE
本章节介绍Dubbo如何接入CSE,使得Dubbo能够对接CSE,并且方便的使用CSE提供 的最常用的功能。在使用微服务引擎功能章节,会给出具体的开发指导。
本章节介绍的开发方法,可以在Dubbo ServiceComb Samples项目中找到对应的代 码,供您在开发过程中参考。
Dubbo未提供网关服务,在例子中使用了Spring Cloud Gateway作为网关,Spring Cloud Gateway接入CSE的说明请参考Spring Cloud接入CSE章节。
前提条件
● 已基于Dubbo开发好了微服务应用。
Dubbo微服务框架下的微服务开发,请参考https://dubbo.apache.org/zh/。
● Dubbo ServiceComb版本为1.3.6及以上版本,并且使用Spring Boot作为开发底 座。
● 本文假设您的项目使用了maven管理打包,您熟悉maven的依赖管理机制,能够 正确的修改“pom.xml”文件中的dependency management和dependency。
操作步骤
步骤1 (可选)在项目的“pom.xml”文件中引入依赖。
如果您的项目中,已经包含了如下依赖,则不需要做任何处理。
如果您的项目中使用了其他注册发现库,比如zookeeper、nacos等,可以删除这些依 赖,这个步骤不是必须的。
<dependency>
<groupId>com.huaweicloud.dubbo-servicecomb</groupId>
<artifactId>dubbo-servicecomb-solution-spring-boot</artifactId>
</dependency>
推荐使用Maven Dependency Management管理项目依赖的三方软件,在项目的
“pom.xml”文件中引入:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.huaweicloud.dubbo-servicecomb</groupId>
<artifactId>dubbo-servicecomb-bom</artifactId>
<version>${dubbo-servicecomb.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
步骤2 在启动类引入Dubbo ServiceComb的Bean。
下面的示例代码中,"classpath*:spring/dubbo-servicecomb.xml"是Dubbo ServiceComb的Bean信息,增加这个信息才会加载Dubbo ServiceComb的功能。
@SpringBootApplication
@ImportResource({"classpath*:spring/dubbo-provider.xml", "classpath*:spring/dubbo- servicecomb.xml"})
public class ProviderApplication {
public static void main(String[] args) throws Exception { try {
new
SpringApplicationBuilder(ProviderApplication.class).web(WebApplicationType.NONE).run(args);
} catch (Throwable e) { e.printStackTrace();
} }}
步骤3 配置微服务信息。
1. 在“dubbo.properties”增加微服务描述信息。如果项目中没有
“dubbo.properties”,则创建一个新的文件。使用Spring Boot集成Dubbo,也 可以将配置信息写到“application.yaml”中。为了符合Dubbo的使用习惯,本文 档使用properties格式进行描述。在推荐的例子中,使用的是
“application.yaml”,使用yaml格式可以更好的利用profile机制管理不同环境的 配置。#### 服务配置信息 ####
# 所属应用。默认为 default
dubbo.servicecomb.service.application=basic-application
# 服务名称。默认为 defaultMicroserviceName dubbo.servicecomb.service.name=price-provider
# 版本。默认为 1.0.0.0
dubbo.servicecomb.service.version=1.0.0
# 环境。默认为空。可选值:development,testing,acceptance,production
# dubbo.servicecomb.service.environment=production
# project。 默认为default
# dubbo.servicecomb.service.project=
#### 实例配置信息 ####
# 实例初始状态。可选值:UP,DOWN,STARTING,OUTOFSERVICE
# dubbo.servicecomb.instance.initialStatus=UP
#### 服务中心配置信息 ####
# dubbo.servicecomb.registry.address=https://cse.cn-south-1.myhuaweicloud.com dubbo.servicecomb.registry.address=http://127.0.0.1:30100
#### 配置中心配置信息 ####
# dubbo.servicecomb.config.address=https://cse.cn-south-1.myhuaweicloud.com dubbo.servicecomb.config.address=http://127.0.0.1:30113
dubbo.servicecomb.config.fileSource=provider.yaml
#### SSL 配置信息 ####
# dubbo.servicecomb.ssl.enabled=true dubbo.servicecomb.ssl.enabled=true
2. 修改dubbo registry为CSE的服务中心。这个配置项一般在spring的配置文件中,
比如“spring/dubbo-provider.xml”文件中。
<dubbo:registry address="sc://127.0.0.1:30100"/>
这个配置项的地址信息不会使用,只使用了协议名称sc。
3. (可选)如果使用基于流量的微服务治理的重试功能,需要修改dubbo cluster配 置。如果无此配置项,请新增。详细请参考使用服务治理。
<dubbo:consumer cluster="dubbo-servicecomb"></dubbo:consumer>
步骤4 (可选)配置AK/SK。
如果使用微服务引擎专业版,需要配置AK/SK;如果使用微服务引擎专享版,不需要 配置AK/SK,可以跳过这个步骤。
AK/SK在“dubbo.properties”中配置,默认提供明文配置,示例如下:
dubbo.servicecomb.credentials.enabled=true dubbo.servicecomb.credentials.accessKey=AK dubbo.servicecomb.credentials.secretKey=SK dubbo.servicecomb.credentials.cipher=default dubbo.servicecomb.credentials.project=cn-south-1 步骤5 (可选)使用环境变量。
可以通过环境变量简化部署配置。使用ServiceStage部署可以使用的环境变量参考准备 环境。
“dubbo.properties”和“application.yaml”中均可以使用place holder来使用环境变 量。以“application.yaml”为例,服务中心的地址和配置中心的地址使用环境变量,
那么采用ServiceStage部署的时候,环境变量的实际值会覆盖配置文件里面的缺省值,
减少了重新编译打包的步骤。
PAAS_CSE_SC_ENDPOINT: http://127.0.0.1:30100 PAAS_CSE_CC_ENDPOINT: http://127.0.0.1:30113 dubbo:
servicecomb:
registry:
address: ${PAAS_CSE_SC_ENDPOINT}
config:
address: ${PAAS_CSE_CC_ENDPOINT}
----结束
1.4.5 Mesher 接入 CSE
1.4.5.1 Mesher 简介 什么是 Mesher
Mesher是Service Mesh的一个具体的实现,是一个轻量的代理服务以Sidecar的方式与 微服务一起运行。
Service Mesh是由William Morgan定义:
Service Mesh是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务 拓扑,Service Mesh保证请求可以在这些拓扑中可靠地传输。在实际应用当中,
Service Mesh通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一 起,但应用程序不需要知道它们的存在。
随着云原生应用的崛起,Service Mesh逐渐成为一个独立的基础设施层。在云原生模 型里,一个应用可以由数百个服务组成,每个服务可能有数千个实例,而每个实例可 能会持续地发生变化。服务间通信不仅异常复杂,而且也是运行时行为的基础。管理 好服务间通信对于保证端到端的性能和可靠性来说是非常重要的。
Service Mesh实际上就是处于TCP/IP之上的一个抽象层,假设底层的L3/L4网络能够点 对点地传输字节(同时,也假设网络环境是不可靠的,所以Service Mesh必须具备处 理网络故障的能力)。
从某种程度上说,Service Mesh有点类似TCP/IP。TCP对网络端点间传输字节的机制进 行了抽象,而Service Mesh则是对服务节点间请求的路由机制进行了抽象。Service
Mesh不关心消息体是什么,也不关心它们是如何编码的。应用程序的目标是“将某些 东西从A传送到B”,而Service Mesh所要做的就是实现这个目标,并处理传送过程中 可能出现的任何故障。
与TCP不同的是,Service Mesh有着更高的目标:为应用运行时提供统一的、应用层面 的可见性和可控性。Service Mesh将服务间通信从底层的基础设施中分离出来,让它 成为整个生态系统的一等公民——它因此可以被监控、托管和控制。
为什么要使用 Mesher
● 业务代码无须改造
● 支持老旧应用接入
● 普通应用快速成为云原生应用
● 业务代码零侵入
基本实现原理
Mesher是L7层协议代理,Mesher以Sidecar模式运行在应用所在的Pod内,与Pod共享 网络与存储:
1. Pod中的应用使用Mesher作为http代理,可以自动发现其他服务。
2. Mesher会代替Pod中的应用向注册中心注册应用相关信息,以便让其他应用发 现。
发起一次网络请求的过程中存在微服务消费者consumer和提供者provider,场景如 下:
● 场景一:仅consumer使用Mesher作为Sidecar。
provider需要自己实现服务注册发现,或者使用Java或Go Chassis开发框架,否则 通过Mesher接入的consumer无法发现provider。
应用间的网络请求如下:
consumer-> Mesher -> provider
● 场景二:consumer、provider均使用Mesher作为Sidecar。
此场景无需再使用微服务开发框架。
应用间的网络请求如下:
consumer -> Mesher -> Mesher ->provider
● 场景三:仅provider使用Mesher作为Sidecar consumer需要使用Java或者Go Chassis开发框架。
应用间的网络请求如下:
consumer-> Mesher -> provider
注意事项
应用上云后需要作出一定的配置变更。例如在Mesher所处环境外,consumer在访问 provider时使用http://IP:port/进行访问。在使用Mesher后,使用http://provider:port/
即可进行访问,接入说明将详细讲解。
1.4.5.2 接入说明
须知
不同于微服务开发框架,Mesher的能力是由ServiceStage平台提供的。您必须在 ServiceStage平台创建Mesher组件,才能使用Mesher。
本章节介绍http应用如何通过Mesher接入CSE。由于Mesher支持多语言,因此本章仅 描述通过Mesher接入CSE时的规范要求。具体的代码样例可以参考:
● .Net core接入服务网格
● PHP接入服务网格
前提条件
已开发好了一个http应用(支持多语言)。
操作步骤
步骤1 修改微服务调用的URL,将URL中的${IP:Port}修改为服务名。
例如调用一个名为“provider”的微服务,API为“/hello”,则调用URL通常为:
http://${IP:Port}/hello。例如:
http://127.0.0.1:80/hello
您需要将调用的URL修改为:
http://provider/hello
步骤2 为微服务调用请求设置http proxy,proxy的地址为:http://${IP:Port}。例如:
http://127.0.0.1:30101
若一个微服务被其他微服务调用,则该微服务的监听地址中必须包含127.0.0.1(监听 端口和其他监听地址不做限制)。
步骤3 在ServiceStage平台创建Mesher组件,请参考创建微服务组件。
须知
Mesher组件名称必须和微服务名称一致。
----结束
1.4.5.3 .Net core 接入服务网格
前提条件
通过ServiceStage部署,可以将.Net应用变为云原生应用,需要符合以下条件:
● 如果使用微服务引擎专业版,需要首先创建Mesher所需的配置,具体操作请参考 为Mesher框架微服务应用配置AK/SK。推荐使用微服务引擎专享版,无需配置。
● 待接入的程序必须支持标准http_proxy环境变量。
说明
本指南讲述的是.Net Core的接入方法,当前支持的.Net Core的版本为:2.0.9版本及以上,3.0 版本以下。
其他语言,如Python、PHP接入,仅需满足前置条件即可。
Demo 说明
用户可以使用dotnet demo示例,示例Demo包含如下两个组件:
● payment service:此组件的API为 /v1/payments,访问该服务会返回一串json。
● order service:此组件的API为 /v1/orders, 当调用/v1/payments接口时,会把 json透传回来。
ServiceStage 部署
部署应用组件前,需要:
● 已经参考创建应用创建应用。
● 已经参考创建环境创建环境,环境包含CCE集群、ELB及微服务引擎等资源。
步骤1 确保order配置文件中payment地址正确。
将payment service命名为“payment” 以代替本地127.0.0.1的寻址方式,端口需要保 留,输入以下命令。
vim order/src/appsettings.json
{ "ServiceEndpoints": {
"PaymentServiceEndpoint": "http://payment:8080"
}, ....
}
步骤2 打包payment和order的镜像。
首先选择上传到某个Region的SWR软件仓库,比如swr.cn-
north-1.myhuaweicloud.com,在该Region的软件中心创建组织,比如demo,具体参 考创建组织。
打包镜像命令示例如下:
cd order/src/
sudo docker build . -t swr.cn-north-1.myhuaweicloud.com/demo/ordernet:1.0 cd payment/src/
sudo docker build . -t swr.cn-north-1.myhuaweicloud.com/demo/paymentnet:1.0
步骤3 上传镜像。
● 通过界面上传,请参考上传镜像。
● 通过命令push,示例如下:
docker push swr.cn-north-1.myhuaweicloud.com/demo/ordernet:1.0 docker push swr.cn-north-1.myhuaweicloud.com/demo/paymentnet:1.0
步骤4 创建payment应用组件,请参考创建微服务组件。
1. “选择运行时”:选择“Docker”。
2. “选择框架/服务网格”:选择“Mesher”。
3. “组件名称”:输入“payment”。
说明
应用组件名字要跟步骤1中order配置文件中的地址保持完全一致,所以名字为payment。
步骤5 部署payment组件,请参考部署组件。
1. “实例数量”:设置为1。
2. “镜像”:单击“选择镜像”,选择步骤3中上传的payment组件镜像。
3. 其他参数使用默认配置。
步骤6 创建order组件,请参考创建微服务组件。
1. “选择运行时”:选择“Docker”。
2. “选择框架/服务网格”:选择“Mesher”。
3. “组件名称”:输入“order”。
步骤7 部署order组件,请参考部署组件。
1. “实例数量”:设置为1。
2. “镜像”:单击“选择镜像”,选择步骤3中上传的order组件镜像。
3. “公网访问”:开启公网访问,“监听端口”设置为80。
4. 其他参数使用默认配置。
----结束
结果验证
等待2个组件全部部署完成 单击访问地址,如下图所示。
调用对应接口,返回json串,如下图所示。
查看微服务控制台(请参考维护微服务),会看到已经存在的服务,并且可以进行治 理,具体参考微服务治理。
1.5 部署微服务应用
微服务应用部署,请参考部署组件。
1.6 使用微服务引擎功能
1.6.1 使用服务注册
微服务引擎的服务中心提供了服务注册的功能。服务注册是指微服务启动的时候,将 基本信息,比如所属应用、微服务名称、微服务版本、监听的地址信息等注册到服务 中心。
微服务运行的过程中,也通过服务中心查询其他微服务的基本信息。不同的微服务开 发框架注册的信息会有差异,比如Java Chassis还会注册服务契约等信息。不同微服务 开发框架注册的基本信息、注册和发现其他微服务的流程是相同的。
本章节重点介绍不同的微服务开发框架如何使用服务中心和配置自己的注册信息,同 时也会介绍微服务和注册中心之间交互有关的配置项。微服务注册成功后,可以在微 服务引擎使用微服务目录、微服务实例列表、微服务依赖关系等功能。
Java Chassis
Java Chassis使用服务注册,需要在项目中增加如下依赖:
<dependency>
<groupId>org.apache.servicecomb</groupId>
<artifactId>registry-service-center</artifactId>
</dependency>
如果项目已经直接或者间接包含这个依赖,则无需添加。Java Chassis包含如表1-5所 示配置项。这些配置项的值影响在服务中心注册的基本信息,以及微服务和服务中心 之间的交互,比如心跳等。
表1-5 Java Chassis 常用配置项
配置项 含义 缺省值 备注
servicecomb.service.ap
plication 所属应用 default -
servicecomb.service.na
me 微服务名称 defaultMicro
service - servicecomb.service.ve
rsion 微服务版本 1.0.0.0 -
servicecomb.service.en
vironment 环境 - production
、developmen t等
配置项 含义 缺省值 备注 servicecomb.service.re
gistry.address 服务注册发现地址 http://
127.0.0.1:301 00
集群地址使 用“,”分隔
servicecomb.service.re
gistry.instance.watch 是否开启watch模式 true 微服务引擎 专业版需要 设置为false servicecomb.service.re
gistry.instance.healthC heck.interval
发送心跳的时间间隔
(秒) 30 -
servicecomb.service.re gistry.instance.healthC heck.times
允许的心跳失败次数。当 连续第times+1次心跳仍 然失败时则实例被服务中 心下线。即interval * (times + 1)决定了实例被 自动注销的时间。如果服 务中心等待这么长的时间 没有收取到心跳,会注销 实例
3 -
servicecomb.datacente
r.name 数据中心名称 - -
servicecomb.datacente
r.region 数据中心区域 - -
servicecomb.datacente
r.availableZone 数据中心可用区 - -
Java Chassis注册的实例地址信息、监听地址,和配置项
servicecomb.service.publishAddress指定的发布地址有关。服务监听地址的配置项是 servicecomb.rest.address和servicecomb.highway.address,分别对应rest传输方式和 highway传输方式的监听地址。注册的地址信息和监听地址、发布地址的关系如表1-6 所示。
表1-6 注册的实例地址生效规则
监听地址 发布地址 注册的实例地址 127.0.0.1 - 127.0.0.1
0.0.0.0 - 指定选取一张网卡的IP地址作为发布地址。不会选择 通配符地址、回环地址或广播地址
具体IP地址 - 与监听地址一致
* 具体IP地址 与发布地址一致
* "{网卡名}" 指定网卡名对应的IP,注意需要加上引号和括号