本实验手册参考了 ServiceComb 的官方文档,并对案例进行了改造、扩展,以有利于学员按照步骤完成实验并理解ServiceComb的相关概念和原理。
要完成本实验,学员需要在电脑中安装、配置如下软件:
环境准备
JDK 8 - Java 8 以上的版本都可以,但需要安装 JDK, 而不是 JRE
Git - 最新版本即可
Maven - 安装 3.x 版本
IntelliJ IDEA Community Edition - 选择最新的社区版(免费版即可)
Docker - 建议安装比较新的版本,比如 19.0 以上
安装ServiceComb库
建立 Projects 目录,然后进入该目录,执行
1 | git clone https://github.com/apache/servicecomb-java-chassis.git |
执行完后,ServiceComb 的源代码已经克隆到 Projects 目录的 servicecomb-java-chassis 中,
然后进入该目录,执行
1 | mvn clean install -DskipTests |
在构建过程中,总共需要下载约 188M 大小的第三方库,然后 maven 会将 ServiceComb 项目编译、打包并部署到本地 maven 的仓库中,该仓库一般位于用户目录中的 .m2 目录。
构建完成后,可以看到类似如下的信息:
1 | [INFO] Reactor Summary for ServiceComb Java Chassis 1.3.0-SNAPSHOT: |
建立服务项目
准备项目
在 IDEA 中新建一个 maven 类型的项目,将 GroupI 名为为: org.apache.servicecomb.samples, artifactId 指定为:bmi-calculator。 项目建立后,打开项目中的 pom.xml 文件,将其修改为以下内容:
1 |
|
保存以后, IDEA 会自动下载需要的第三方库。
构建 Calculator 服务
- 在源码中新建一个名为: org.apache.servicecomb.samples.bmi.service 的 package, 然后在里面新建一个名为: CalculatorService 的接口。该接口负责计算体质指数的行为。定义如下:
1 | public interface CalculatorService { |
- 在源码中新建一个名为: org.apache.servicecomb.samples.bmi.service.impl 的 package, 然后在里面新建一个名为:CalculatorServiceImpl 的类,该类是 CalculatorService 的实现类,负责实现具体的记录逻辑,对应的代码如下:
1 |
|
注意: 我们使用了 Spring 中的 @Service 对该类进行了注解,定义其为一个Spring中的服务组件
构建 Instance 服务
- 在 org.apache.servicecomb.samples.bmi.service 中再定义一个接口: InstanceInfoService, 代码如下:
1 | public interface InstanceInfoService { |
- 同样,在 org.apache.servicecomb.samples.bmi.service.impl 中新建 InstanceInfoService 接口的实现, 代码如下:
1 |
|
该类的实现是从注册中心去找当前节点在注册中心中的唯一标识。
创建服务端点
服务端点用于生成服务契约,使得服务间能无缝进行通信
- 首先定义一个数据类,表示需要返回给服务调用者的数据结构。 新建一个名为: org.apache.servicecomb.samples.bmi.vo 的 package。 然后在其中定义一个名为: BMIViewObject 的类, 代码如下:
1 | public class BMIViewObject { |
- 定义端点接口,新建一个名为: org.apache.servicecomb.samples.bmi.endpoint 的 package。然后在 package 中定义一个名为: CalculatorEndpoint 的接口。 代码如下:
1 | public interface CalculatorEndpoint { |
- 定义端点实现类, 新建一个名为: org.apache.servicecomb.samples.bmi.endpoint.impl 的 package。 它实现了 CalculatorEndpoint 接口。 代码如下:
1 | "calculatorRestEndpoint") (schemaId = |
其中,用 @RestSchema 和 @RequestMapping 注解了类,用 @GetMapping 修饰了方法 calculate。 有 Spring Boot 基础的学员可以看出,通过这个类的定义方式和 Spring Boot 中用 @RestController 注解的类很相似。
构建启动类
在通常的SpringBoot应用中,需要定义一个启动类来执行服务程序的启动。代码如下:
1 |
|
定义服务配置文件
在项目的 src/main/resources 目录下新增一个名为: microservice.yaml 的文件。该文件是 ServiceComb 默认的微服务配置文件。文件内容如下:
1 | APPLICATION_ID: bmi |
可以看到,文件指明了几个运行时的关键信息:
- 应用唯一标识(APPLICATION_ID): bmi
- 服务的名称(name): calculator
- 注册服务器的地址: 本机的30100端口,接下来我们会通过 Docker 来运行该服务。
- 服务自身的监听地址和端口: 本机的 7777 端口
运行服务
启动注册中心
执行以下命令,拉取注册中心的镜像
1 | docker pull servicecomb/service-center |
拉起完成后,可以通过 docker images 命令查看本地镜像进行确认
1 | docker images |
系统显示
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
执行以下命令启动注册中心:
1 | docker run --name service-center -d -p 30100:30100 servicecomb/service-center |
启动完成后,可以用 docker ps 命令查看启动结果:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
运行 Calculator 服务
在 IDEA 中运行刚才建的 bmi-calculator 项目。可以看到在 Run TAB 中的输出如下:
1 | 2019-10-24 19:02:50.296 INFO 8493 --- [ main] org.apache.servicecomb.core.SCBEngine : Status already changed to up. |
可以看到项目已经成功运行并注册到注册中心了。
验证服务
打开浏览器,比如 Chrome, 在地址栏输入以下地址
1 | http://localhost:7777/bmi?height=120&weight=50 |
如果一切正常,可以看到浏览器中显示服务返回的结果
1 | {"result":34.7,"instanceId":"d1ac38d2f64d11e9b64a0242ac110002","callTime":"19:17:40"} |
下一步
在下一篇文章中,将介绍如何为 calculator 服务搭建配套的其它服务能力。