Apache ServiceComb java-chassis 3.3.0 常用工具与 API 详解
Apache ServiceComb java-chassis 3.3.0 常用工具与 API 详解:java-chassis 无独立 CLI、以 Maven/jar 形态使用的定位说明,核心 API 速查(@RestSchema 与 JAX-RS 注解、RestTemplateBuilder 消费端调用、Swagger 契约生成、SCBEngine 生命周期)与 mvn/java/curl/jps 实用命令,含真实回显与 FAQ,全程实测。
Apache ServiceComb java-chassis 3.3.0 常用工具与 API 详解
目标:详解 Apache ServiceComb java-chassis 3.3.0 的核心 API 与配套工具使用。java-chassis 是随应用进程运行的框架,没有独立的
servicecomb命令行程序;日常操作由「Maven/jar 构建工具 + Java API + curl 验证」三部分组成。本文按「生产者 API → 消费者 API → 契约与生命周期 → 实用命令」分节速查,并给出可直接执行的命令与真实回显。所有示例在 Ubuntu 22.04.5 + JDK 17 环境实测。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Java:OpenJDK 17.0.20.1
- 构建工具:Apache Maven 3.6.3
- java-chassis 版本:3.3.0(java-chassis-spring-boot-starter-standalone + registry-local / registry-service-center)
- Spring Boot 版本:3.2.12
- 示例工程:
/root/servicecomb-hello/ - 演示账号:root
二、工具概览
java-chassis 以「Maven 依赖 + 随应用启动」形态工作,没有 servicecomb 命令行可执行程序。日常使用的工具与 API 如下:
| 类别 | 名称 | 作用 |
|---|---|---|
| 构建 | Maven(mvn) | 解析 java-chassis 依赖、打可执行 fat jar |
| 运行 | java -jar | 启动内嵌 java-chassis 的 Spring Boot 应用 |
| 生产者 API | @RestSchema + JAX-RS 注解 | 把 Java 类暴露为 REST 微服务 |
| 消费者 API | RestTemplateBuilder / RestOperations | 以 cse://服务名/路径 调用其他微服务 |
| 契约 | SwaggerGenerator(自动) | 启动时生成 OpenAPI 3.0 契约到 /tmp/microservices/ |
| 生命周期 | SCBEngine(自动) | 框架内核,随 Spring 容器启动/关闭 |
| 验证 | curl / jps / ps | REST 请求验证、进程与 JVM 参数核对 |
💡 说明:发行版
apache-servicecomb-java-chassis-distribution-3.3.0-bin.zip内的libs/(63 个 jar)适合离线手工 classpath 组装或装进内网私服;scctl等运维小工具属于 service-center 项目,不属于 java-chassis 本体。
三、前置条件
已按《Apache ServiceComb java-chassis 3.3.0 构建并运行示例 REST 应用指南》篇完成工程构建并可启动:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
cd /root/servicecomb-hello
mvn clean package -DskipTests
四、核心 API 详解
4.1 生产者 API:@RestSchema 与 JAX-RS 注解
@RestSchema(org.apache.servicecomb.provider.rest.common.RestSchema)把类注册为 REST 生产者 schema,配合 Jakarta JAX-RS 注解声明路径与参数:
package demo;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import org.apache.servicecomb.provider.rest.common.RestSchema;
@RestSchema(schemaId = "hello")
@Path("/hello")
public class HelloEndpoint {
@GET
public String sayHello(@QueryParam("name") String name) {
String who = (name == null || name.isEmpty()) ? "ServiceComb" : name;
return "Hello, " + who + "!";
}
}
| 注解/元素 | 说明 |
|---|---|
@RestSchema(schemaId) | 声明生产者 schema,schemaId 服务内唯一 |
@Path("/hello") | 类级路径前缀,最终 URL 为 http://host:8080/hello |
@GET / @POST 等 | HTTP 方法映射 |
@QueryParam("name") | 查询参数绑定 |
@PathParam / @HeaderParam | 路径参数 / 请求头绑定 |
实测验证:curl -s http://127.0.0.1:8080/hello?name=Alice 返回 "Hello, Alice!";生成的契约 /tmp/microservices/hello/hello.yaml 中 operationId: sayHello、name 查询参数与代码一致。
⚠️ 注意:除 JAX-RS 外,java-chassis 还支持 Spring MVC 注解(
@RequestMapping等,依赖 provider-springmvc)与透明 POJO(provider-pojo);standalone starter 已同时引入三者,可按团队习惯选择。
4.2 消费者 API:RestTemplateBuilder(cse:// 协议调用)
消费端通过 RestTemplateBuilder.create() 获得一个支持 cse:// 协议的 RestOperations,按「服务名」而非 IP 调用远端服务(经注册中心发现实例):
package demo;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
import org.springframework.web.client.RestOperations;
@RestSchema(schemaId = "hello")
@Path("/hello")
public class HelloEndpoint {
private final RestOperations restTemplate = RestTemplateBuilder.create();
@GET
@Path("/call")
public String callSelf(@QueryParam("name") String name) {
return restTemplate.getForObject(
"cse://hello/hello?name={name}", String.class, name);
}
}
| 方法 | 说明 |
|---|---|
RestTemplateBuilder.create() | 创建支持 cse:// 协议的 RestOperations(注意返回类型是 RestOperations) |
getForObject(String url, Class<T> type, Object... uriVariables) | GET 调用并反序列化,{name} 占位由可变参数填充 |
cse://hello/hello?name=x | 协议为 cse://(服务发现),主机段是服务名,路径段是对方 schema 路径 |
实测验证(local 注册中心与服务均已启用):
curl -s "http://127.0.0.1:8080/hello/call?name=Carol"
"Hello, Carol!"
调用链为:curl → 本服务 /hello/call → cse://hello/hello(服务发现 + 负载均衡)→ hello 服务的 /hello。
💡 说明:POJO 远程调用可用
@RpcReference(schemaId = "hello", microserviceName = "hello")注入接口代理,效果等价;本文以 REST 形态为例。
4.3 契约与生命周期:SwaggerGenerator 与 SCBEngine
两者均为框架自动运行,无需编码,但需要会读它们的关键输出:
- SwaggerGenerator(契约生成):启动日志
o.a.s.s.generator.SwaggerGenerator : select [org.apache.servicecomb.swagger.generator.jaxrs.JaxrsSwaggerGeneratorFactory] for [demo.HelloEndpoint] to generate schema.
o.a.s.s.generator.SwaggerGenerator : generate schema from [class demo.HelloEndpoint]
o.a.s.c.p.producer.ProducerBootListener : export microservice swagger file to path /tmp/microservices/%s/%s.yaml
随后 /tmp/microservices/hello/hello.yaml 生成 OpenAPI 3.0 契约(openapi: 3.0.1、servers: url: /hello、operationId: sayHello)。
- SCBEngine(框架内核):随 Spring 容器启动,就绪时打印:
org.apache.servicecomb.core.SCBEngine : ServiceComb is ready.
并输出过滤器链信息(consumer/producer/edge 三段,如 consumer 段的 filters: [retry(-1990), load-balance(0), rest-client-codec(1990), rest-client-sender(2000), websocket-client(2000)]),是核对框架功能装载是否完整的快速检查点。
4.4 注册中心客户端日志(registry-service-center)
接入 service-center 后,ServiceCenterClient / ServiceCenterRegistration 的日志是排障第一现场:
o.a.s.s.c.client.ServiceCenterClient : Query serviceId fails, statusCode = 400; message = Bad Request; content = {"errorCode":"400012","errorMessage":"Micro-service does not exist","detail":"/default/hello/0.0.1 does not exist."}
o.a.s.s.c.c.ServiceCenterRegistration : register microservice successfully, service id=bad03bda8b28269a31ccf8fade650edd7750bb86, instance id=b1050217-3fed-4bb3-aaff-63cb259e98ed
400012 Micro-service does not exist 出现在首次注册前,属正常流程;紧随其后的 register microservice successfully 才是注册成功标志。
五、实用命令速查
5.1 构建与运行
cd /root/servicecomb-hello
mvn clean package -DskipTests # 编译并打 fat jar
nohup java -Xms256m -Xmx512m -jar target/servicecomb-hello.jar > /root/hello.log 2>&1 &
实测回显(打包成功标志):
[INFO] BUILD SUCCESS
5.2 REST 验证
curl -s http://127.0.0.1:8080/hello
curl -s -i http://127.0.0.1:8080/hello | head -5
实测回显:
"Hello, ServiceComb!"
HTTP/1.1 200 OK
X-B3-TraceId: 6accdcd8751366a7
Content-Type: application/json
Content-Length: 21
5.3 契约查看
cat /tmp/microservices/hello/hello.yaml | head -12
实测回显:
openapi: 3.0.1
info:
title: swagger definition for demo.HelloEndpoint
version: 1.0.0
servers:
- url: /hello
paths:
/:
get:
operationId: sayHello
5.4 注册中心查询(service-center)
curl -s http://127.0.0.1:30100/v4/default/registry/microservices
实测回显(节选,hello 已注册):
"serviceName":"hello"
5.5 进程与 JVM 参数核对
jps -v
实测回显:
5549 servicecomb-hello.jar -Xms256m -Xmx512m
5.6 依赖树核查(版本冲突排查)
cd /root/servicecomb-hello
mvn dependency:tree 2>/dev/null | grep "org.apache.servicecomb" | head -8
实测回显(节选):
+- org.apache.servicecomb:java-chassis-spring-boot-starter-standalone:jar:3.3.0:compile
| +- org.apache.servicecomb:transport-rest-vertx:jar:3.3.0:compile
| +- org.apache.servicecomb:provider-springmvc:jar:3.3.0:compile
| +- org.apache.servicecomb:provider-jaxrs:jar:3.3.0:compile
| +- org.apache.servicecomb:provider-pojo:jar:3.3.0:compile
| \- org.apache.servicecomb:handler-loadbalance:jar:3.3.0:compile
六、注意事项
⚠️ 注意:
- java-chassis 没有独立 CLI 工具;构建、运行、验证分别依赖 mvn、java -jar、curl。
RestTemplateBuilder.create()返回RestOperations,声明为RestTemplate会编译失败(实测报incompatible types)。- 3.x 主类不要再加
@EnableServiceComb(该注解已随 2.x 移除),自动配置由 Spring Boot 3 的 AutoConfiguration.imports 完成。- 服务间调用的
cse://URL 中主机段必须是「服务名」(servicecomb.service.name),不是 IP 或应用名。
七、常见问题
Q1:/hello/call 返回连接失败或实例为空?
消费端依赖注册中心发现实例。确认两端服务都已启动且注册成功(local 形态需同一进程内演示,或两端均接 service-center)、URL 中服务名与 servicecomb.service.name 一致。
Q2:调用返回 404 或契约不含某方法?
先查契约文件 /tmp/microservices/<appId>/<服务名>/<服务名>.yaml:方法没出现在契约里通常是注解遗漏(如 @GET)或类未标 @RestSchema。
Q3:启动卡在连接注册中心?
检查 servicecomb.registry.sc.address 是否可达(curl http://127.0.0.1:30100/v4/default/registry/microservices 验证 service-center 是否在线);演示场景可临时 servicecomb.service.registry.enabled: false 独立运行。
Q4:如何确认生产者注解被识别?
看启动日志:select [org.apache.servicecomb.swagger.generator.jaxrs.JaxrsSwaggerGeneratorFactory] for [demo.HelloEndpoint] to generate schema. 出现即表示 schema 已按 JAX-RS 风格识别;若用 Spring MVC 注解则应出现对应 springmvc 工厂。
Q5:Maven 打包后 jar 体积大(60MB+)正常吗?
正常。fat jar 内含 Spring Boot 与 java-chassis 全部运行时依赖(standalone 形态含 Vert.x 网络栈),实测 servicecomb-hello.jar 约 63MB。
八、参考链接
- java-chassis 官方文档:
https://servicecomb.apache.org/references/java-chassis/zh_CN/ - REST 生产者参考:
https://servicecomb.apache.org/references/java-chassis/zh_CN/build-provider/ - REST 消费者参考:
https://servicecomb.apache.org/references/java-chassis/zh_CN/build-consumer/ - Maven Central:
https://repo1.maven.org/maven2/org/apache/servicecomb/