# servicecomb-getstarted
**Repository Path**: huaweicloud-microservices/servicecomb-getstarted
## Basic Information
- **Project Name**: servicecomb-getstarted
- **Description**: 使用 servicecomb 开发微服务应用入门
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-08-02
- **Last Updated**: 2023-02-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# `Servicecomb` 开发微服务应用指南
[toc]
本文档主要介绍使用 `Servicecomb` 开发微服务应用,并将此应用部署到华为云平台 `CCE` 的过程。
本文档的主要读者为:
* 具有 `Spring Boot` 或 `Spring Cloud` 微服务开发基础
* 基本了解微服务常见架构模式(如网关,微服务治理等)
* 需要将微服务应用部署到华为云平台的开发人员
`Servicecomb` 是华为推出的一套用来开发微服务的框架,类似于 `Spring Cloud` 框架。具体可参见[官方文档](http://servicecomb.apache.org/references/java-chassis/zh_CN/)。
# 1. 功能
本文档将对官方文档中给出的[计算 `bmi` 指数的应用]([体质指数微服务应用快速开发 - Apache ServiceComb](http://servicecomb.apache.org/cn/docs/products/java-chassis/bmi/))为基础,对其进行适当改造。改造后的应用将包含以下微服务。
* 计算服务:完成 `bmi` 指数的计算
* 身份管理服务:提供用户的注册,登录,角色等
* 网关服务:对外提供统一的入口,同时提供认证功能
* 如果没有认证,则先请求身份管理服务获取 `Token`
* 只有通过认证的用户才能访问计算服务
同时,还将提供一个简单的前端,主要向开发者演示如何访问网关服务。
# 2. 开发
首先使用 `Spring Boot` 进行开发计算服务和身份服务,然后将这两个服务转换为 `Servicecomb` 服务。然后使用 `Servicecomb` 提供的 `Edge Service SDK` 开发网关服务。最后使用 `Vue` 开发一个简单的前端以形成一个完整的应用。
本文档所示所有源码已上传至 https://gitee.com/huaweicloud-microservices/servicecomb-getstarted
**需要提前说明的是:由于云平台只支持 Java8,因此在开发时使用 Jdk8 进行开发,或不要使用 Java8 以上的新特性。本文档开发时使用的 Java11,在往云部署时,又改为了 Java8,这是没必要的。**
## 2.1 使用 `IDEA` 搭建项目
* 创建名为 `servicecomb-getstarted` 的 `Maven` 项目,将 `groupId`,`artifactId`, `version` 分别设为 `com.sgcc.tj.huaweicloud`,`servicecomb-getstarted` 和 `1.0`
* 工程创建好以后,打开 `pom.xml`,将 `packaging` 设置为 `pom`
* 创建三个 `servicecomb-getstarted` 项目的子模块,模块名分别为 `idm-service`, `gateway-service`, `calculaor-service`,这三个模块分别代表身份管理服务,网关服务,计算服务
* 创建一个名为 `ui` 的 `Vue` 模块,表示前端。创建此模块前,需要安装 `Vue` 插件
* 目前为止,项目的代码可由 `v1.0` 标签查看
## 2.2 使用 `Spring Boot` 开发计算服务和身份管理服务
### 2.2.1 开发计算服务
* 在 `calculator-service` 工程下的 `pom.xml` 添加 `spring-boot` 插件和 `spring-boot-starter-web` 依赖
```xml
org.springframework.boot
spring-boot-starter-web
2.4.5
org.springframework.boot
spring-boot-maven-plugin
2.4.5
com.sgcc.tj.huaweicloud.Application
repackage
```
* 添加接口类 `BmiController`
```java
package com.sgcc.tj.huaweicloud;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BmiController {
@GetMapping("/api/calculator/bmi")
public Float calculate(Float height, Float weight) {
return weight / height / height;
}
}
```
* 添加 `Spring Boot` 启动类
```java
package com.sgcc.tj.huaweicloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
```
* 测试接口,保证接口可用

### 2.2.2 开发身份管理服务
* 与计算服务一样,修改 `pom.xml` ,添加启动类 `Application`
* 添加接口 `TokenController`,此接口用于提供类似于 `JWT` 的令牌,为简单起见,此接口只能返回一个用户信息,其他信息一律返回`401`
```java
package com.sgcc.tj.huaweicloud;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import java.util.StringJoiner;
@RestController
public class TokenController {
@PostMapping("/api/token/simple")
public String getToken(String username, String password) {
if (username.equals("user") && password.equals("123")) {
var joiner = new StringJoiner("#");
joiner.add("username:user") // 账号
.add("name:用户") // 姓名
.add("role:user") // 角色
.add("userId:1"); // userId
return joiner.toString();
}
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "无效的用户名或密码");
}
}
```
* 使用 Postman 测试,确保接口调用成功

* 至此,我们完成了 `Spring Boot` 版本的两个微服务,接下来,我们把这两个服务改造成`Servicecomb` 版本。
## 2.3 使用 `Servicecomb` 框架改造计算服务和身份管理服务
官方的 `Servicecomb` 与 `Spring Boot` 集成的文档请参考[在Spring Boot中使用java chassis](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/using-java-chassis-in-spring-boot/using-java-chassis-in-spring-boot.html))
改造之前,需要在本地安装服务注册中心(类似于 `Eureka` 或 `Nacos`,用于微服务的注册与发现)。为了与华为云平台的 `CSE` 更好对接,我们使用华为云提供的 `service center` 作为我们本地的服务注册中心。安装文档请参考[ServiceCenter 安装](http://servicecomb.apache.org/cn/docs/products/service-center/install/) 。安装结束后,运行前端和后端脚本,然后打开浏览器,可以看到如下仪表盘界面。可以看到,当前服务中心只有一个服务(即服务中心自己)。

### 2.3.1 改造计算服务
* 修改 `pom.xml` 文件,主要包括以下四部分内容
* 引入 `servicecomb` 的依赖管理
* 引入 `maven-compiler-plugin` 插件
* 使用 `servicecomb` 提供的依赖包替换原有的 `spring-boot-starter` 依赖。由于计算服务属于 [web开发方式](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/using-java-chassis-in-spring-boot/web-application.html),因此引入的依赖包为 `java-chassis-spring-boot-starter-servlet`
* 引入 `service-center` 的依赖包 `registry-service-center`
修改后的 `pom.xml` 如下所示(没有修改的部分使用 ... 代替)
```xml
...
org.apache.servicecomb
java-chassis-spring-boot-starter-servlet
org.apache.servicecomb
registry-service-center
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
11
11
-parameters
...
org.apache.servicecomb
java-chassis-dependencies
2.3.0
pom
import
```
* 改造 `Application` 类,只需要在类级别添加 `@EnableServiceComb` 注解以启用 `servicecomb` 功能
* 在 `src/main/resources` 目录下添加 `microservice.yaml` 文件完成微服务定义和服务中心配置。详细配置项可参考[微服务定义](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/build-provider/definition/service-definition.html) 和 [使用服务中心](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/registry/service-center.html) 中有关配置项的说明。此处各配置项简单说明如下。
* servicecomb-starter:整个微服务应用的名字,所有的微服务都要用这个名字
* calculator:此微服务的名字
* 0.0.1 是当前此微服务的版本
* development 表明该微服务当前处于开发状态。在正式往云平台部署的时候,需要删除此配置,或将其改为 `production`
* http://127.0.0.1:30100:当前服务注册中心的地址
* 0.0.0.0:8000:表明此微服务在 8000 端口上监听来自任何客户端发过来的请求
```yaml
servicecomb:
service:
application: servicecomb-starter
name: calculator
version: 0.0.1
environment: development
registry:
address: http://127.0.0.1:30100
rest:
address: 0.0.0.0:8000
```
* 修改 `BmiController` ,主要包含两个内容
* 将原来的 `@RestController` 替换为 `@RestSchema(schemaId="calculator")` 。其中 `schemaId` 表示此接口的名字
* 在类别上添加 `@RequestMapping` 注解,用法与 `Spring MVC` 相同。这一步不能省略
```java
package com.sgcc.tj.huaweicloud;
import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@RestSchema(schemaId = "calculator")
@RequestMapping("/")
public class BmiController {
@GetMapping("/api/calculator/bmi")
public Float calculate(Float height, Float weight) {
return weight / height / height;
}
}
```
* 此时,启动 `Application` ,然后使用 `Postman` 等进行测试,确保接口正常工作
### 2.3.2 改造身份管理服务
改造过程与计算服务完全相同。此处略。各位读者可参考源代码。修改结束后进行测试,确保接口正常工作。
目前为止的代码可使用 `v3.0` 标签进行查看。
最后,观察服务中心界面,可发现现在启动了 `idm` 和 `calculator` 两个微服务,每个微服务有一个实例。这两个微服务正是我们开发的并注册到服务中心的微服务。


## 2.4 使用 `Edge Service` 开发网关服务
网关模式是一种常见的微服务架构模式,用于对外提供访问的统一入口。网关不实现业务逻辑,其基本的功能是提供请求的路由转发。根据实际的需要,网关还有可能会提供安全认证、以及流量监控等微服务治理的附加功能。
本文档使用 `servicecomb` 自带的`Edge Service` 框架进行网关服务的开发,其官方文档可参考[使用 Edge Service 做网关](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/edge/by-servicecomb-sdk.html)
### 2.4.1 网关的基本转发功能
* 修改 `pom.xml` 文件,与前面两个微服务类似。具体内容如下。需要特别说明的是,`edge-core` 是 `Edge Service` 的依赖包,由于网关服务是整个微服务应用对外提供服务的入口,提供方式为 `http` 接口,所以此处引入了 `java-chassis-spring-boot-starter-servlet` 依赖
```xml
servicecomb-getstarted
com.sgcc.tj.huaweicloud
1.0
4.0.0
gateway-service
11
11
org.apache.servicecomb
java-chassis-spring-boot-starter-servlet
org.apache.servicecomb
edge-core
org.apache.servicecomb
registry-service-center
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
11
11
-parameters
org.springframework.boot
spring-boot-maven-plugin
2.4.5
com.sgcc.tj.huaweicloud.Application
repackage
org.apache.servicecomb
java-chassis-dependencies
2.3.0
pom
import
```
* 创建启动类 `Application`,如下
```java
package com.sgcc.tj.huaweicloud;
import org.apache.servicecomb.springboot2.starter.EnableServiceComb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableServiceComb
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
```
* 添加 `microservice.yaml` 文件进行微服务定义、服务中心配置、网关转发配置、CORS配置,完整内容如下面的 `yaml` 文件所示。
* `servicecomb.service.*` 配置的含义与前面解释过的相同,用于进行微服务定义和服务中心配置
* `servicecomb.http` 用于配置网关转发规则。官方文档请参考[使用 Edge Service 做网关](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/edge/by-servicecomb-sdk.html)
* `dispatcher.edge.url.enabled: true`:启用按 `url` 转发
* `dispatcher.edge.url.mappings`:`url` 映射规则
* `mappings` 下定义了两个 `url` 规则,分别命名为 `idm` 和 `calculator`,在此例中分别对应对两个微服务的转发规则。每个规则下都包含四条配置,以下以 `idm` 映射为例。
* `path`:用于匹配客户端发送的地址。此例中的值为 `/api/token/.*`,即任何以 `/api/token/` 开头的请求都会按此规则进行处理
* `microserviceName`:当上述 `path` 匹配成功后,当前请求会被转发的微服务名称。此名称必须是之前注册到服务中心的微服务名称。此处的值为 `idm` ,表明请求会被网关转发到 `idm` 微服务,即身份管理微服务
* `prefixSegmentCount`:前缀个数。此例中设置的值为0,表示网关会把客户端发过来的 `url ` 原封不动地发给微服务。如果值为1,则会去掉1个前缀,此时如果网关接收到的 `url` 为 `/api/abc/def`,则网关真正转发给微服务的 `url` 为 `/abc/def`
* `versionRule`:匹配的微服务的版本,当前所有微服务版本都是 `0.0.1` ,在实际环境中,同一个微服务可能会同时存在多个版本的实例。
* `servicecomb.cors` 用于配置 `CORS` 规则。如果从浏览器直接调用网关,需要处理跨域。具体请参考[跨域资源共享(CORS)配置](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/general-development/CORS.html)
```yaml
servicecomb:
service:
application: servicecomb-starter
name: gateway
version: 0.0.1
environment: development
registry:
address: http://127.0.0.1:30100
rest:
address: 0.0.0.0:9000
http:
dispatcher:
edge:
url:
enabled: true
mappings:
idm:
prefixSegmentCount: 0
path: "/api/token/.*"
microserviceName: idm
versionRule: 0.0.1
calculator:
prefixSegmentCount: 0
path: "/api/calculator/.*"
microserviceName: calculator
versionRule: 0.0.1
cors:
enabled: true
origin: "*"
allowCredentials: false
allowedMethod: OPTIONS,GET,POST,PUT,DELETE
maxAge: 3600
```
### 2.4.2 测试网关的转发功能
* 首先启动服务中心,然后依次启动计算服务、身份管理服务、网关服务
* 使用 `Postman` 等测试工具测试网关的转发功能


* 打开服务中心的仪表盘,可以我们开发好的包含网关在内的三个微服务。同时,打开拓扑页,可以看到三个微服务之间的关系。由此可以看出 `gateway` 作为消费方,它会向另外两个微服务发起调用。

### 2.4.4 增加网关认证功能
除了基本的路由转发,网关还有很多其他的用途。认证是网关需要提供的最常见的一种附加功能。
认证过程的基本逻辑是:在接收到请求后,网关会检查该请求是否需要认证。如果不需要认证,网关会直接放行(转发给微服务)。如果需要认证,网关会进一步检查该请求是否携带了合法的认证信息。只有这两项检查都通过了,网关才会将放行,否则,网关将返回 `401` 错误。在放行之前,网关可能会从认证信息中提取部分信息。这些信息会在转发请求时一并发给微服务。
* 实现 `AuthHandler`
* 为了提供请求转发的吞吐量,`Edge Service` 框架采用了基于 `Vertx` 的异步编程模型。在 [官方文档中](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/edge/by-servicecomb-sdk.html#_3) 提到
> `Edge Service` 可以通过多种方式来扩展Edge Service的功能,包括Dispatcher、HttpServerFilter、Handler、HttpClientFilter等。比较常用和简单的是通过Handler来扩展。
* 完整的 `AuthHandler` 代码如下。
* `init` 方法用于进行初始化操作
* `handle` 方法用于进行认证。注意认证失败后要使用 `return` 提前返回,认证成功后要调用 `invocation.next(asyncResponse);` 以保证后续的 `handler` 继续进行处理。
* 使用 `HttpServletRequestEx.getHeader("Authorization")` 从请求头部中获取认证信息。拿到认证信息后,对其进行解析,并调用 `Invocation.addContext` 方法将从认证信息中提取到的 `username`,`name` 等进行保存,这些信息会在转发时一并转发给目标微服务。
```java
package com.sgcc.tj.huaweicloud;
import org.apache.servicecomb.core.Handler;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.definition.MicroserviceMeta;
import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx;
import org.apache.servicecomb.swagger.invocation.AsyncResponse;
import org.apache.servicecomb.swagger.invocation.InvocationType;
import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.core.Response;
import java.util.Arrays;
import java.util.stream.Collectors;
public class AuthHandler implements Handler {
private static Logger LOGGER = LoggerFactory.getLogger(AuthHandler.class);
private static final String[] AUTH_WHITELIST = {
"/api/token/simple"
};
@Override
public void init(MicroserviceMeta microserviceMeta, InvocationType invocationType) {
}
@Override
public void handle(Invocation invocation, AsyncResponse asyncResponse) throws Exception {
HttpServletRequestEx request = invocation.getRequestEx();
String token = request.getHeader("Authorization");
String url = request.getRequestURI();
if (Arrays.asList(AUTH_WHITELIST).contains(url)) {
invocation.next(asyncResponse);
return;
}
if (token == null) {
asyncResponse.consumerFail(new InvocationException(Response.Status.UNAUTHORIZED, "未认证访问"));
return;
}
try {
// token 类似于 "username:user#name:用户#role:user#userId:1"
var map = Arrays.stream(token.split("#"))
.map(item -> item.split(":"))
.collect(Collectors.toMap(array -> array[0], array -> array[1]));
invocation.addContext("username", map.get("username"));
invocation.addContext("role", map.get("role"));
invocation.addContext("name", map.get("name"));
invocation.addContext("userId", map.get("userId"));
} catch (Exception e) {
asyncResponse.consumerFail(new InvocationException(Response.Status.UNAUTHORIZED, "未授权访问"));
return;
}
invocation.next(asyncResponse);
}
}
```
* 注册 `AuthHandler`
根据 `Vertx` 异步编程模型,自定义的 `Handler` 需要注册后才能使用。在 `Edge Service` 框架中,可以在类路径下添加 `config/cse.handler.xml` 进行自定义 `Handler` 的注册。其内容如下
```xml
```
* 在 `microservice.yaml` 文件中配置认证功能。在现有的 `microservice.yaml` 文件最下方插入以下内容。该配置会在每次转发请求之前按顺序进行 `auth` 和 `loadbalance` 的处理链。有关处理链的详细介绍请参考[处理链介绍](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/references-handlers/intruduction.html)。此处的 `loadbalance` 如果不填,网关服务在转发时会报错。
```yaml
servicecomb:
# 其他现有配置保留
handler:
chain:
Consumer:
default: auth,loadbalance
```
* 默认情况下,`Edge Service` 不会向微服务转发任何请求的头部。如果你希望转发请求的若干头部信息,可以在 `microservice.yaml` 添加以下配置。例如,如果你想让后面的微服务接收请求中的 `Authorization` 头部,可以将其加入到 `allowedHeaders` 中。
```yaml
servicecomb:
# 其他现有配置保留
edge:
filter:
addHeader:
enabled: true
allowedHeaders: Authorization
```
### 2.4.5 测试认证服务
重新运行程序,使用 `Postman` 调用网关接口,可以看到,此时访问 `token` 接口,依然可以成功,但是,如果要访问 `calculator` 接口,则会报以下错误。


### 2.4.6 在微服务间传递消息
前已述及,网关服务在转发前,会将 `username` 等认证信息封装到 `InvocationContext` 中,这些信息会一同转发到微服务。微服务在接收到网关转发过来的请求后,可以提取这些信息。这也是 `Servicecomb` 下微服务之间传递信息的主要方式。详细内容请参考[使用Context传递控制消息 ](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/general-development/context.html)
修改计算服务的 `BmiController` 如下
```java
package com.sgcc.tj.huaweicloud;
import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.apache.servicecomb.swagger.invocation.context.InvocationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@RestSchema(schemaId = "calculator")
@RequestMapping("/")
public class BmiController {
@GetMapping("/api/calculator/bmi")
public String calculate(Float height, Float weight, InvocationContext context) {
var username = context.getContext("username");
var bmi = weight / height / height;
return username + " bmi: " + bmi;
}
}
```
重新启动计算服务,使用 `Postman` 进行测试,确保接口正确返回

至此,本地开发全部结束。所有的代码可通过 `v4.0` 查看。
# 3. 部署
为了充分发挥容器云和微服务的优势,我们鼓励各业务在部署上云尽可能采用 `CCE + ServiceStage` 的方式进行部署。`CCE` 是华为云提供的企业级 `Kubernetes` 集群,可为用户提供高性能的容器化部署。`ServiceStage` 是华为云提供的一个微服务管理平台,它支持多种微服务框架及成套的开发工具。
本章详细描述 `BMI` 微服务应用部署到华为云的过程。概括而言,该过程包含以下几个步骤。
* 申请华为云资源及环境准备。按照云平台运营中心规定的流程申请资源。拿到资源后进行部署前的环境准备工作,主要包括创建项目,上传软件包或镜像等。
* 微服务应用对接 `ServiceStage` 。主要描述将微服务接入 `CSE` 的过程,`CSE` 是华为云用于提供服务注册、配置管理等功能的微服务引擎。
* 创建并部署微服务应用。创建应用及对应组件将各应用组件部署到 `CCE` 集群并配置外部访问方式。
* 测试微服务应用
## 3.1 申请华为云资源及环境准备
* 向云平台运营中心提交资源申请和用户申请。申请时应根据应用的实际情况对资源的容量进行合理估算,不要太高或太低,避免造成资源浪费或影响应用性能。另外,对于微服务应用,一般申请的资源以 `CCE` 为主。
* 申请经审批通过后运营中心会创建项目,开通 `VPC` 和安全组,下发资源,创建账户。
* 使用创建好的账号登录云平台运营系统,进行如下操作
* 创建 `CSE` 专业版或专享版。打开 `ServiceStage` 的 `CSE` 页面,点击创建即可。创建成功后可显示 `CSE` 的地址
* 获取 `AK/SK` 。操作过程请参考[获取AK/SK与项目名称](https://support.huaweicloud.com/devg-servicestage/ss-devg-0033.html) 。 `AK/SK` 请妥善保存。如果 `CSE` 是专享版,此步可省略。
* 创建环境。操作过程请参考[环境管理](https://support.huaweicloud.com/usermanual-servicestage/servicestage_user_0406.html)。环境的定义如下面的引用所示。每个环境可用于不同目的,如开发环境,测试环境等,这一点与 `Spring` 的 `Profile` 类似。对于微服务应用,请至少创建一个环境。在基础资源中添加 `CCE` 集群,在可选资源中添加 `CSE` ,`ELB`(需申请审批),`RDS` 等
> 环境是用于应用部署和运行的计算、存储、网络的集合。`ServiceStage` 把相同 `VPC` 下的基础资源(如 `CCE` 集群,`ECS` 等)加上可选资源(如 `ELB`, `RDS`)组合为一个环境。
## 3.2 微服务应用对接 `ServiceStage`
对接的过程每个微服务都完全相同。以 `Servicecomb Java` 版 为例,官方文档请参考[Java Chassis接入CSE](https://support.huaweicloud.com/devg-servicestage/ss-devg-0008.html)。 对接的过程基本上就是对接 `CSE` 的过程。
`CSE` 是 `ServiceStage` 提供的一个微服务应用的管理工具,对外提供服务中心,配置管理等很多微服务管理和治理功能。`CSE` 分专业版和专享版两个版本,这两个版本在对接时存在一定的不同。
为什么需要对接?因为我们在开发时使用的是本地的服务中心,当我们往云上部署时,需要把服务中心改成 `CSE` 提供的服务中心。
以下以计算服务为例,描述其接入 `CSE` 的过程。其他服务的接入过程类似。
* JDK 版本降级。使用 JDK8 重新编译微服务。**注:应在一开始就使用 JDK8 进行开发**
* 修改 `pom.xml` ,主要改动如下是添加如下的依赖声明。
* `solution-basic` 内置了所有对接所必需的功能。
* `servicestage-environment` 是可选的,如果你不打算使用 `ServiceStage` 的环境变量覆盖 `microservice.yaml` 配置,此依赖可以去除。
```xml
org.apache.servicecomb
solution-basic
org.apache.servicecomb
servicestage-environment
```
* 修改 `microservice.yaml` 文件。主要改动如下
* 将 `servicecomb.service.registry.address` 的值改为云平台 `CSE` 的地址
* 对于 `CSE` 专业版,进行以下配置
* 配置 `AK/SK` ,将以下配置加入到 `microservice.yaml` 文件中。使用之前拿到的 `AK/SK` 替换其中的 `$AK` 和 `$SK`
```yaml
servicecomb:
credentials:
accessKey: $AK
secretKey: $SK
akskCustomCipher: default
```
* 添加配置 `servicecomb.service.registry.instance.watch` 并将其设为 `false`
* 所有的服务都修改结束后,使用 `mvn clean package` 命令将每个服务都打包成 `jar` 包,然后在 `OBS` 上创建一个桶并上传这些 `jar` 包。
* 修改后的代码已上传,可通过版本 `v5.0` 进行查看
## 3.3 创建并部署微服务应用
* 创建应用。官方文档请参考[创建应用](https://support.huaweicloud.com/usermanual-servicestage/servicestage_user_0409.html)。此处不需要添加环境变量
* 为每一个微服务都新建一个组件。官方文档请参考[创建微服务组件](https://support.huaweicloud.com/usermanual-servicestage/servicestage_user_0412.html)的操作步骤
* 由于 `BMI` 应用使用的是 `servicecomb` 的 `Java SDK` ,因此在选择运行时和框架时,请选择 `Java Chassis` 和 `Java8`
* “源码/软件包”一项请选择之前上传到 `OBS` 上对应的软件包
* 部署每一个微服务,每个服务的部署过程类似。部署过程请参考[部署组件](https://support.huaweicloud.com/usermanual-servicestage/servicestage_user_0419.html)
* 网关服务建议放到最后部署
* 按实际情况填写的环境,版本,部署系统,实例数量,CSE 等信息
## 3.4 测试微服务应用
# 4. 其他问题
* 可使用 `Roma Connect` 替代网关服务的开发。具体请参考相关文档。
* 关于文件上传,异常处理请参考[通用功能开发](http://servicecomb.apache.org/references/java-chassis/zh_CN/general-development/catalog.html)
* 其他问题可参考官方文档
* 部署之前一定要保证本地环境下测试通过