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 ServiceCombApache ServiceComb2026/10/12

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 微服务
消费者 APIRestTemplateBuilder / RestOperations以 cse://服务名/路径 调用其他微服务
契约SwaggerGenerator(自动)启动时生成 OpenAPI 3.0 契约到 /tmp/microservices/
生命周期SCBEngine(自动)框架内核,随 Spring 容器启动/关闭
验证curl / jps / psREST 请求验证、进程与 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

六、注意事项

⚠️ 注意:

  1. java-chassis 没有独立 CLI 工具;构建、运行、验证分别依赖 mvn、java -jar、curl。
  2. RestTemplateBuilder.create() 返回 RestOperations,声明为 RestTemplate 会编译失败(实测报 incompatible types)。
  3. 3.x 主类不要再加 @EnableServiceComb(该注解已随 2.x 移除),自动配置由 Spring Boot 3 的 AutoConfiguration.imports 完成。
  4. 服务间调用的 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/