最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring...

22
微服务引擎 最佳实践 文档版本 01 发布日期 2018-04-09

Transcript of 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring...

Page 1: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

微服务引擎

最佳实践

文档版本 01

发布日期 2018-04-09

Page 2: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

目 录

1 Dubbo 应用使用 mesher 接入 CSE............................................................................................. 11.1 配置并启动-Windows....................................................................................................................................................21.2 配置并启动-Linux......................................................................................................................................................... 3

2 Spring Cloud 应用接入 CSE.........................................................................................................52.1 演进路线图.................................................................................................................................................................... 62.2 快速接入........................................................................................................................................................................ 72.3 使用 CSE 作为 RPC 框架............................................................................................................................................112.4 使用轻量级容器和 Edge Service................................................................................................................................ 19

微服务引擎佳实践 目 录

文档版本 01 (2018-04-09) ii

Page 3: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

1 Dubbo 应用使用 mesher 接入 CSE

本文基于公有云微服务引擎实践所编写,用于指导您将Dubbo应用或接入微服务引擎。

本文通过一个示例介绍Dubbo应用如何使用mesher接入CSE,该示例旨在快速体验,因此Provider与Consumer的改造已完成,了解改造的具体细节,请参考Dubbo使用mesher接入CSE。

在这个示例中,有以下主干部分:

l 1个Providerl 1个Consumerl 2个mesher

它们之间的请求关系如下图所示:

1.1 配置并启动-Windows

1.2 配置并启动-Linux

微服务引擎佳实践 1 Dubbo 应用使用 mesher 接入 CSE

文档版本 01 (2018-04-09) 1

Page 4: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

1.1 配置并启动-Windows

前提条件

已获取AK/SK,若未获取请参考下载AK/SK。

背景介绍

为方便您操作,示例中已包含以下内容:

l mesherProvider和Consumer使用的mesher均已在压缩包中。

若您需要单独获取mesher,可以到控制台“微服务开发 > 工具下载”。

l env.bat用于承载服务启动的信息,比如AK/SK、服务中心地址。只需在该脚本中配置一次即可。

l init_env.bat读取本机IP以及env.sh中设置的环境变量。

l start_all.bat用于启动所有服务。

操作步骤

步骤1 下载Dubbo示例demo,解压。

步骤2 打开env.bat脚本,设置以下参数。

l AK_ENV:您的AK

l SK_ENV:您的SK

l SERVICE_CENTER:https://cse.cn-north-1.myhwclouds.com:443

保存退出。

步骤3 执行init_env.bat脚本,读取本机IP以及env.sh中设置的环境变量。

步骤4 执行start_all.bat脚本,启动所有服务。

步骤5 启动成功后,进入管理控制台查看“微服务管理 > 服务目录”页面,选择“dubboEnv”应用,可以看到应用下的服务已存在。

步骤6 浏览器访问{IP}:30101/demo/sayHello?name=Tom,会有以下返回值:

Hello Tom, response from provider: {IP}:3333

----结束

微服务引擎佳实践 1 Dubbo 应用使用 mesher 接入 CSE

文档版本 01 (2018-04-09) 2

Page 5: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

1.2 配置并启动-Linux

前提条件

1. 已获取AK/SK,若未获取请参考下载AK/SK。

2. 已购买弹性云服务器。

3. 已获取该弹性云服务器的密钥文件。

4. 该弹性云服务器已绑定弹性IP。5. 弹性云服务器已安装unzip工具。

背景介绍

为方便您操作,示例中已包含以下内容:

l mesherProvider和Consumer使用的mesher均已在压缩包中。

若您需要单独获取mesher,可以到控制台“微服务开发 > 工具下载”页面获取。

l env.sh用于承载服务启动的信息,比如AK/SK、服务中心地址。只需在该脚本中配置一次即可。

l init_env.sh读取本机IP以及env.sh中设置的环境变量。

l start_all.sh用于启动所有服务。

l stop_all.sh用于停止所有服务。

操作步骤

步骤1 密钥方式以root用户登录弹性云服务器。

步骤2 下载Dubbo示例demo,使用FTP工具(如winscp)将下载包上传到弹性云服务器,解压。

unzip dubbo-demos.zip

步骤3 在env.sh当前路径执行以下命令设置运行权限

chmod 770 * -R

步骤4 打开env.sh脚本,设置以下参数。

l JAVA_HOME:您本机的JAVA_HOME

l AK_ENV:您的AK

l SK_ENV:您的SK

l SERVICE_CENTER:https://cse.cn-north-1.myhwclouds.com:443

保存退出。

微服务引擎佳实践 1 Dubbo 应用使用 mesher 接入 CSE

文档版本 01 (2018-04-09) 3

Page 6: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

步骤5 执行init_env.sh脚本,读取本机IP以及env.sh中设置的环境变量。

./init_env.sh

步骤6 执行start_all.sh脚本,启动所有服务。

./start_all.sh

步骤7 启动成功后,进入管理控制台查看“微服务管理 > 服务目录”页面,选择“dubboEnv”应用,可以看到应用下的服务已存在。

步骤8 进入dubboconsumer/dubbo-demo-consumer/logs/目录。

查看stdout.log文件,会显示以下内容:dubbo consume sayHello: Hello world, response from provider: {IP}:3333

----结束

后续步骤

若您想停启所有服务,请执行stop_all.sh脚本。

微服务引擎佳实践 1 Dubbo 应用使用 mesher 接入 CSE

文档版本 01 (2018-04-09) 4

Page 7: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

2 Spring Cloud 应用接入 CSE

前提条件

已申请公有云帐号。

背景介绍

Spring Cloud应用可以方便的接入CSE提供的基础服务。

接入CSE服务有如下好处:

1. 开发者可以专注于业务系统的开发,把精力从中间件的可靠性评估、集群部署、运维监控等复杂的事情中解放出来。

2. 实现业务快速交付和敏捷开发。利用PaaS平台,根据业务规模,动态的调整资源使用,降低业务风险。

下图展现了CSE基础服务、PaaS平台服务和第三方服务的关系:

CSE官方支持ServiceComb微服务框架接入和Spring Cloud微服务框架接入。两个框架接入的步骤基本类似。在本章节中,主要介绍Spring Cloud应用接入CSE的原理,然后通过一个Spring Cloud应用改造的案例,说明接入步骤。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 5

Page 8: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

在本章节中,主要介绍Spring Cloud应用如何接入CSE。

建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

2.1 演进路线图

2.2 快速接入

2.3 使用CSE作为RPC框架

2.4 使用轻量级容器和Edge Service

2.1 演进路线图CSE提供了非常丰富的开箱即用的微服务管控能力,这些能力通过CSE的RPC框架集成。如果使用Spring Cloud,开发者需要组合非常多的三方组件来完成这些功能,下面列举了部分功能:

CSE功能 Spring Cloud实现方式

负载均衡策略 使用ribbon组件。

实例故障隔离和失败重试 使用ribbon/hystrix组件。

微服务隔离、熔断、容错 使用hystrix组件。

微服务方法级别隔离、熔断、容错

使用hystrix组件,定义复杂的配置规则。

流量控制 实现流量控制算法,定义复杂的配置规则。

故障注入 实现动态配置,定义故障规则。

灰度发布 实现灰度发布算法,定义灰度发布规则。

微服务监控,包括调用链等

使用zipkin组件。

metrics Spring Cloud 自带,没有集中监控能力,或者集成prometheus。

CSE还提供了非常友好的管理界面,帮助开发者在运行时管理和监控微服务。SpringCloud开发者在使用CSE的过程中有非常多灵活的选择,下面是一个可选的技术路线:

l 第一步:遗留系统快速接入,完成Spring Cloud应用的云上部署。

Spring Cloud开发者通过修改pom文件,就可以接入CSE提供的公共服务中心和配置中心服务,使用公共服务进行注册发现、动态配置,节省了开发、部署eureka、git等Spring Cloud提供服务的时间和购买部署公共服务机器的成本。

这个步骤一般在1小时内就可以完成开发和部署测试,提供了快速上云的通道。

这个步骤完成后,业务原有的功能基本不受任何影响(一些严重依赖于服务发现中间件的功能除外)。接入也给用户提供了一个可以直观感受CSE功能的机会,用户可以根据实际的运维感受,选择是否使用CSE进行下一步的演进。

l 第二步:将Spring MVC REST Framework改造为CSE。这个步骤会在Spring Boot框架中集成CSE的REST框架。通过这个步骤,CSE提供的所有微服务管理功能都可以开箱即用,业务可以专注于逻辑的开发。完成这个

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 6

Page 9: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

步骤,用户需要对CSE的设计原理,与Spring Boot集成原理和关系有一定了解,这样才能够快速解决文档中未提到的一些技术问题。开始之前,建议开发者先进行如下准备工作,以更好的解决开发过程中可能遇到的问题。

a. 完成第一步,并体验CSE。b. 阅读CSE的设计原理,了解CSE框架的设计思路和组件组成。

c. 体验在Spring Boot中使用CSE,理解在Spring Boot框架下使用CSE的基本原理。

l 第三步:使用轻量级容器和Edge Service。对于多数后台服务,对外只提供REST接口,不提供Web页面。这些服务运行于J2EE容器(比如Tomcat)会额外多出很多性能损耗。CSE提供了轻量级的HTTP服务器来提供REST服务,可以极大的提高性能并减少资源占用。Edge Service是CSE提供可与CSE微服务完美配合的网关服务,除了高性能,还支持强大的灰度版本管理能力、异步编程扩展能力和治理能力。

2.2 快速接入

本章节通过一个实际的案例,说明Spring Cloud应用如何经过少量的配置修改,快速接入CSE。Demo下载地址:GitHub 码云Gitee

原始Spring Cloud应用位于SpringCloudIntegration的子项目:springcloud-sample

修改后的Spring Cloud应用位于SpringCloudIntegration的子项目:springcloud-sample-2-cse,该项目已提供Dockerfile和start.sh,可以直接拷贝以便在微服务云应用平台快速构建镜像。

springcloud-sample提供了3个项目:

l eureka-server提供注册发现能力。

l springcloud-provider服务提供者,该服务提供了名称为HelloService的REST接口。

l springcloud-consumer服务消费者,该服务也提供了名称为HelloService的REST接口,其实现通过Feign调用springcloud-provider的REST接口。

修改后的springcloud-sample-2-cse具备如下能力和变化:

l 使用CSE提供的服务中心作为注册发现服务,替换掉原有的Eureka;

l 使用CSE提供的配置中心作为动态配置服务,可以通过配置中心管理公共配置;

l 业务的其他逻辑不发生任何变化,写代码的方式也不发生变化。开发者仍然可以按照原来的开发习惯书写业务代码。

接入步骤

CSE为Spring Cloud应用提供了非常简单的接入方式,开发者只需要修改依赖关系和少量的配置,就可以启用服务中心和配置中心客户端连接功能,将Spring Cloud应用作为一个CSE的微服务注册到服务中心和使用动态配置能力。Demo中以公有云“华北-北京一”(cn-north-1)区域为例,其他区域则需要参照“补充说明”第2点,额外在application.yml中显示地指定注册地址和区域。

步骤1 参考“环境准备”配置maven setting文件,并将Spring Cloud中对于eureka的依赖换成CSE的依赖。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 7

Page 10: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

Eureka的依赖:开发者一般会使用spring-cloud-starter-eureka。spring-cloud-starter-eureka-server是作为注册服务使用的,替换服务中心后不需要继续使用。

删除如下依赖,以springcloud-sample为例,修改springcloud-provider/pom.xml、springcloud-consumer/pom.xml:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency>

删除如下依赖,以springcloud-sample为例,修改父pom.xml:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>

增加如下依赖,以springcloud-sample为例,修改父pom.xml:

<dependency> <groupId>com.huawei.paas.cse</groupId> <artifactId>cse-solution-spring-cloud</artifactId> <version>2.3.20</version></dependency>

[可选]eureka-server已不再需要,可以删除,以springcloud-sample为例,修改父pom.xml,只保留springcloud-provider和springcloud-consumer:

<modules> <module>springcloud-provider</module> <module>springcloud-consumer</module></modules>

步骤2 springcloud-sample的springcloud-consumer模块使用的Ribbon默认对接Eureka,需要在springcloud-consumer的application.yml中增如下配置:

helloprovider: ribbon: NIWSServerListClassName: org.apache.servicecomb.springboot.starter.discovery.ServiceCombServerList

其中:

<clientId>.ribbon.NIWSServerListClassName: RibbonClient的配置规则,本例中helloprovider是clientId,即服务消费者需要访问的服务提供者的微服务名称。

org.apache.servicecomb.springboot.starter.discovery.ServiceCombServerList: CSE服务实例清单的维护机制

步骤3 经过上面步骤,就完成了Spring Cloud应用接入CSE的全部整改。开发者可以将应用打包为容器镜像,在公有云上进行部署。另外,springcloud-sample-2-cse项目已提供Dockerfile和start.sh,可以直接拷贝以便在微服务云应用平台快速构建镜像。

----结束

体验改造后的服务

本地调试时,需要参照“补充说明”第2点,在application.yml中增加认证信息。

访问服务:

http://localhost:7211/hello?name=World

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 8

Page 11: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

说明

部署在公有云上时,请将localhost:7111和localhost:7211替换为实际的访问地址。您可以在应用详情页面中,从“应用上线 > 应用管理 > 应用详情 > 访问方式”中获取“外部访问地址”。

服务目录

登录公有云,访问微服务引擎,可以在"微服务管理 > 服务目录" 查看到注册成功的两个服务以及实例信息。

动态配置

为了演示,在HelloService中增加了如下接口

@Value(value = "${cse.dynamic.property:null}") String value;

@RequestMapping(method = RequestMethod.GET) public String dynamicProperty() { String dynamicProperty = DynamicPropertyFactory.getInstance().getStringProperty("cse.dynamic.property", "").get(); return "@Value is " + value + "; Api read is " + dynamicProperty; }

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 9

Page 12: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

并通过微服务引擎的"动态配置"增加配置项,访问 http://localhost:7211/hello/dynamicProperty ,得到如下結果:

@Value is property; Api read is property

修改配置项的值为其他值,得到

@Value is property; Api read is propertyChanged

@Value注入的值不会动态变化,通过API获取的值会动态变化。Spring Cloud使用的大量组件,包括Hystrix, Ribbon等都是通过API读取的配置,这些配置项都能够动态读取到。

Spring Cloud还提供了@ConfigurationProperties简化配置,但它的工作原理和@Value以及API都不同,只能够读取到application.yml配置文件中的配置项,不支持动态配置。

其他功能

该接入步骤完成了上云的第一步,只能使用服务目录和动态配置功能。经过进一步的改造Spring Cloud应用才能够使用仪表盘、服务治理等功能。

补充说明

1. 建议开发者在pom.xml中引入依赖的dependencyManagement,以便更好的管理使用的三方件,防止冲突。

dependencyManagement不会往程序里面增加依赖关系,但是可以帮助开发者更好的管理依赖关系,对于解决三方软件冲突非常有用。详细原理描述可以参考“使用maven管理复杂依赖关系的技巧"。<dependencyManagement> <dependencies> <dependency> <groupId>com.huawei.paas.cse</groupId> <artifactId>cse-dependency</artifactId> <version>2.3.20</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>

2. 将应用部署在云上虚拟机集群内时,部署平台会对应用增加一些认证关系的配置,并自动获取认证信息(AK/SK)完成安全认证。CSE的服务中心和配置中心在apigateway开放了REST接口,支持开发者在公网环境使用其服务,为开发者的线下开发带来极大的便利。

线下使用CSE的服务中心和配置中心,开发者需要在application.yml中增加认证信息,认证信息包含AS/SK,可参考“如何管理访问密钥”获取。cse: credentials: accessKey: your access key secretKey: your secret key akskCustomCipher: default在上面的步骤中,实际隐含了将服务中心的地址设置为华北区cn-north-1,如果需要使用其他区域的服务中心和配置中心地址,还需要显示地指定注册地址和区域。

公有云“华东-上海二”区域配置如下cse: service:

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 10

Page 13: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

registry: address: https://cse.cn-east-2.myhuaweicloud.com:443 config: client: serverUri: https://cse.cn-east-2.myhuaweicloud.com:443 credentials: project: cn-east-2公有云“华南-广州”区域配置如下cse: service: registry: address: https://cse.cn-south-1.myhuaweicloud.com:443 config: client: serverUri: https://cse.cn-south-1.myhuaweicloud.com:443 credentials: project: cn-south-1有些开发者需要通过代理服务器访问公有云,也可以通过设置代理来实现:

cse: proxy: enable: true host: your proxy server port: your proxy server port username: user name passwd: password for proxyCSE的配置是分层次的,按照优先级顺序是:

yaml配置文件 < 环境变量 < System Property < 配置中心。

如果开发者不希望将密码信息写入配置文件,也可以通过环境变量或者SystemProperty的方式设置这些配置信息。比如:

java -Dcse.credentials.accessKey=$ACCESS_KEY Application.jar。

2.3 使用 CSE 作为 RPC 框架在上面的章节中,介绍了Spring Cloud如何使用CSE的服务注册发现、动态配置管理等中间件服务。这些操作的基础是Spring RESTful Web Service (本质上是一个Servlet,即org.springframework.web.servlet.DispatcherServlet)。CSE Java SDK作为一个独立的RPC框架实现,可以非常容易集成到Spring Cloud中。通过将Spring RESTful Web Service替换为CSE Java SDK,可以给开发者带来如下便利:

l 一致的开发体验。使用CSE Java SDK的SpringMVC模式,可以获得与SpringRESTful Web Service一致的开发体验,包括一样的声明式Annotation,使用RestTemplate进行访问。

l 更好的RPC支持。使用CSE Java SDK,开发者不需要在客户端使用Feign等组件访问服务,可以直接使用RPC访问,非常灵活。

l 更好的通信性能和协议扩展。这块是CSE Java SDK的核心部分。

l 完整的开箱即用的服务治理、监控、调用链等功能。达到一键式启用的目的。

本章节仍然基于快速接入的示例,展示改造的步骤,以及改造以后的效果。点击下载地址获取改造后的项目。

前提条件

l 已获取AK/SK,若未获取请参考下载AK/SK。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 11

Page 14: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

集成方式

CSE Java SDK支持如下几种集成方式,当需要和Spring Cloud集成的时候,CSE JavaSDK可以作为一个Servlet替换org.springframework.web.servlet.DispatcherServlet。

操作步骤

步骤1 配置依赖关系。

通过依赖spring-boot-starter-transport,可以引入对于CSE的依赖。为了简单的接入CSE,还引入了cse-solution-service-engine。

通过依赖spring-boot-starter-provider,可以引入对于CSE Java SDK的依赖。为了简单的接入CSE,还引入了cse-solution-service-engine。<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>spring-boot-starter-transport</artifactId> </dependency> <dependency> <groupId>com.huawei.paas.cse</groupId> <artifactId>cse-solution-service-engine</artifactId> </dependency>

步骤2 配置启动类和定义REST接口。

在启动类Application里面加入@EnableServiceComb加载CSE运行时,并通过@SpringBootApplication(exclude=DispatcherServletAutoConfiguration.class)关闭SpringRESTful Web Service。

然后开发者就可以定义自己的REST接口(对应于Spring Cloud的Controller)。可以看出和Spring Cloud Controller的差异:

l 使用@RestSchema声明接口,并且指定Schema ID。CSE会对每个REST接口都生成一个接口定义文件,并上传到服务中心。Schema ID在微服务内部需要保持唯一。

l 显示的使用@RequestMapping定义路径。CSE支持JaxRS和SpringMVC两种方式定义REST接口,运行时根据这个标签来区分采用哪种方式生成契约。

其他服务的定义方式和Spring Cloud保持完全一致。CSE支持客户端以RestTemplate和RPC两种方式访问服务端,也可以通过浏览器使用REST的方式直接访问服务端,所以一个好的开发实践是给每个REST服务都定义一个接口Hello。使用CSE,不需要SpringCloud的声明式REST调用(Feign),可以大大简化开发者的工作量。

@RestSchema(schemaId="hello") @RequestMapping(path = "/hello", produces = MediaType.TEXT_PLAIN)

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 12

Page 15: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

public class HelloService implements Hello { private static org.slf4j.Logger log = LoggerFactory.getLogger(HelloService.class);

@Override @RequestMapping(path = "/sayhi", method = RequestMethod.GET) public String sayHi(@RequestParam(name = "name", required = false) String name) { log.info("Access /hello/sayhi, and name is " + name); return "from provider: Hello " + name; } }

引入CSE后,不再需要Feign等组件,如下的一些依赖也可以移除。还有标签@EnableDiscoveryClient、@EnableZuulServer等

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>

步骤3 定义微服务信息

在application.yml中配置基本的微服务信息。

# 应用名称APPLICATION_ID: spring-cloud-application-cse-rpc# 微服务名称和版本号,微服务名称使用Spring Cloud的名称service_description: name: ${spring.application.name} version: 1.0.0# 服务中心和配置中心的地址servicecomb: service: registry: address: https://cse.cn-north-1.myhwclouds.com instance: watch: false config: client: serverUri: https://cse.cn-north-1.myhwclouds.com refreshMode: 1 refresh_interval: 15000# 对外发布的地址,端口号使用server.port rest: address: 0.0.0.0:${server.port}# AK/SK认证信息,需要修改为自己的AK/SK credentials: accessKey: your access key secretKey: your secret key akskCustomCipher: default# 线下开发,关闭监控数据上报 monitor: client: enable: false

步骤4 客户端访问。

CSE Java SDK简化了客户端访问服务端的方式,同时也支持Spring Cloud使用RestTemplate的方式去访问。

l RPC方式。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 13

Page 16: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

@RpcReference(microserviceName="helloprovider", schemaId="hello")Hello client;client.sayHi(name)

l RestTemplate方式。RestTemplate restTemplate = RestTemplateBuilder.create();restTemplate.getForObject("cse://helloprovider/hello/sayHi?name=" + name, String.class);

----结束

体验改造后的服务

在构造的过程中,已经体验了开发上的便利:比Feign更好的RPC支持,以及在"快速接入"章节的相关功能。改造后的应用通过: http://localhost:7211/hello?name=3 进行访问。然后可以登录CSE,体验更多的治理功能。下面挑选了几个经常使用的功能进行描述。

服务契约

进入微服务引擎,微服务名录查看微服务信息,可以看到helloprovider包含如下接口定义文件。

swagger: "2.0"info: version: "1.0.0" title: "swagger definition for io.provider.HelloService" x-java-interface: "cse.gen.spring_cloud_application_cse_rpc.helloprovider.hello.HelloServiceIntf"basePath: "/hello"consumes:- "application/json"produces:- "application/json"paths: /sayhi: get: operationId: "sayHi" parameters: - name: "name" in: "query" required: false type: "string" responses: 200: description: "response of 200" schema: type: "string"

当需要使用浏览器、postman等HTTP客户端访问后台接口的时候,契约可以替代接口说明文档。

调用关系

在服务治理界面,通过图形化的方式展现了微服务之间的调用关系。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 14

Page 17: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

服务治理

在服务治理页面,对helloconsumer下发一个故障注入,接口调用模拟3秒的时延。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 15

Page 18: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

然后访问接口: http://localhost:7211/hello?name=3 可以发现这个接口返回时间被延长。

服务监控

将应用部署到公有云以后,微服务会统计和上报自己的监控状态,这样用户就可以通过仪表盘、ServiceStage的性能监控等功能,监控微服务的运行状态、调用链等指标。

注意:本地调试情况下,不会上报监控数据。并且日志可能打印如下错误:

Can not find any instances from service center due to previous errors. service=default/CseMonitoring/latest

如果不期望上报监控数据,可以增加配置项:

cse.monitor.client.enable=false

补充说明

除了上述可以直接感受到的功能,切换为CSE RPC后,请求处理流程也发生了变化。调用流程使用了CSE优秀的统一一致的处理流程。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 16

Page 19: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

该流程里面的处理链扩展能力和契约能力,是所有治理的基础。

当然,修改后,还会发生其他一些变化,业务代码还会涉及一些修改,这些修改包括REST接口定义的数据类型支持(参考说明),以及Spring Cloud其他的构建在SpringRESTful Web Service之上的能力。修改过程中,也可能会碰到若干jar包冲突或者不兼容的情况。

这些情况都不涉及到业务逻辑代码的修改,本质上只是改变了业务代码发布为服务的表现形式。使用CSE,能够更好的聚焦于业务逻辑开发。

改造过程中的常见问题

l HttpServletRequestHttpServletRequest是J2EE(Servlet)协议定义的对象。CSE支持在Servlet协议上、HTTP协议以及其他协议上提供REST服务,因此不支持特定技术框架的对象。需要将接口定义修改为平台无关的原型。

以下面接口为例:

@RequestMapping(value = "/auth", method = RequestMethod.POST) public ResultResponse createAuthenticationToken(HttpServletRequest request, @RequestBody JwtAuthenticationRequest authenticationRequest) throws AuthenticationException{ String type = authenticationRequest.getType(); String appCode = request.getHeader(BaseTypeConstants.HEADER_APP_CODE); String appType = request.getHeader(BaseTypeConstants.HEADER_APP_TYPE);… …修改后:

@RequestMapping(value = "/auth", method = RequestMethod.POST) public ResultResponse createAuthenticationToken(@RequestHeader(name= BaseTypeConstants.HEADER_APP_CODE) String appCode, @RequestHeader(name= BaseTypeConstants.HEADER_APP_TYPE String appType), @RequestBody JwtAuthenticationRequest

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 17

Page 20: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

authenticationRequest) throws AuthenticationException{ String type = authenticationRequest.getType();… …对于HttpServletResponse的改造原理是一样的。

l Feign客户端

CSE提供了比Feign更加容易使用的客户端RPC方式,客户端不需要像Feign一样声明REST映射关系。本项目中已经包含了Feign的改造例子。

改造前:

# 客户端接口声明@FeignClient("helloprovider")@RequestMapping(path = "/hello")public interface Hello { @RequestMapping(path = "/sayhi", method = RequestMethod.GET) String sayHi(@RequestParam(name = "name") String name);}# 客户端使用@AutowiredHello client;

改造后:# 客户端接口声明public interface Hello { String sayHi(String name);}# 客户端使用@RpcReference(microserviceName="helloprovider", schemaId="hello")Hello client;对于习惯RPC编程的开发人员,可以直接在服务定义的时候,就声明接口,然后作为API发布。这样客户端就可以避免重复写代码了。

l 三方软件冲突

启动报如下错误:

Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.spring boot默认使用logback, 并且依赖了slf4j-log4j12,会导致冲突。可以通过排除log4j-over-slf4j解除冲突:<dependency> <groupId>com.huawei.paas.cse</groupId> <artifactId>cse-solution-service-engine</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions></dependency>启动报如下错误:

java.lang.NoSuchMethodError: javax.ws.rs.core.Response$Status$Family.familyOf(I)Ljavax/ws/rs/core/Response$Status$Family; at org.apache.servicecomb.serviceregistry.client.http.ServiceRegistryClientImpl.registerSchema(ServiceRegistryClientImpl.java:309) ~[service-registry-1.0.0.B010.jar:1.0.0.B010]这个属于jsr311-api冲突,如果pom中依赖了下面的旧的协议包,删除即可

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 18

Page 21: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

<dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <version>1.1.1</version></dependency>

2.4 使用轻量级容器和 Edge Service前面的例子展示了如何在Spring Cloud中使用CSE的REST框架,切换过程中也进行了一些接口定义的调整,使得接口定义更加规范和简洁。对于一些只提供业务逻辑的服务,可以使用轻量级的运行容器,让业务运行更高效。一般来说,还需要提供一个网关服务,进行认证鉴权和外部接入。

下面的内容,介绍如何将服务切换为轻量级容器和实现Edge Service。单击下载改造后的项目。

改造为轻量级的容器

这部分改造非常简单,只需要修改pom依赖,原理介绍在Java应用方式开发步骤提供了介绍。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>spring-boot-starter-transport</artifactId></dependency>

修改为

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency><dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId></dependency><dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>spring-boot-starter-provider</artifactId></dependency>

性能比较

为了测试性能,开发了performanceclient服务,该服务使用了CSE的metrics能力输出统计数据。由于性能数据和运行环境、参数配置等都非常大, 下面只给出了在windows开发环境同时运行3个服务的性能结果。改造后:

consumer: tps latency(ms) max-latency(ms) operation rest.200: 2799 3.562 14.571 helloconsumer.hello.hello 2799 3.562 14.571

改造前:

consumer: tps latency(ms) max-latency(ms) operation

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 19

Page 22: 最佳实践 - developer-res-cbc-cn.obs.cn-north-1 ...€¦ · 在本章节中,主要介绍Spring Cloud应用如何接入CSE。 建议开发者先通过CSE提供的“快速体验微服务能力”了解CSE。

rest.200: 2479 4.021 15.889 helloconsumer.hello.hello 2479 4.021 15.889

由此看出,改造后性能有一定程度的提升。本测试只是非常粗糙的测试数据,在不同环境和条件下的提升比例会有巨大的差异。加上应用并未调优,这个数据仅供参考。建议开发者在目标环境运行测试程序。

增加 Edge ServiceEdge Service开发非常简单,只需要将项目复制过来即可使用,并且可以应用于其他项目中。Edge Service的核心组成是AbstractEdgeDispatcher,通过SPI进行加载,当需要不同的路由规则时,通过增加扩展即可实现。SPI根据实现类的getOrder进行优先级选择。

在本例子中,使用了缺省的DefaultEdgeDispatcher,经过简单的配置就可以实现强大的路由能力。

servicecomb: http: dispatcher: edge: default: enabled: true prefix: api withVersion: false prefixSegmentCount: 2

增加Edge Service以后,可以通过“http://localhost:7118/api/helloconsumer/hello?name=World”访问原来的服务。

可以参考ServiceComb开发指南获取更多关于Edge Service的使用说明。

微服务引擎佳实践 2 Spring Cloud 应用接入 CSE

文档版本 01 (2018-04-09) 20