Skip to content

基础概念

Java Chassis 是以 OpenAPI 为基础的微服务开发框架。一个微服务提供的功能,可以通过 OpenAPI 进行描述。 微服务消费者和提供者完全解耦,开发消费者无需知道提供者的开发方式,只需要知道提供者的OpenAPI信息。

本章节介绍基于开发服务提供者-基础概念提供的 HelloWorld 契约, 描述如何开发服务消费者。

openapi: 3.0.1
info:
  version: 1.0.0
servers:
- url: /
paths:
  /helloWorld:
    post:
      operationId: helloWorld
      requestBody:
        content:
          application/json:
            schema:
              type: string
          application/protobuf:
            schema:
              type: string
          text/plain:
            schema:
              type: string
        x-name: name
      responses:
        "200":
          description: response of 200
          content:
            application/json:
              schema:
                type: string
            application/protobuf:
              schema:
                type: string
            text/plain:
              schema:
                type: string
components: {}

Restful风格 - 使用 RestOperations

RestOperations restOperation = 
    RestTemplateBuilder.create();
String result = restOperation
    .postForObject("servicecomb://provider-service/helloWorld", 
    "World", String.class);
Assertions.assertTrue("Hello World", result);

使用Restful风格开发消费者,需要关注Open API的Path、参数位置(Body、Header等)、参数类型以及响应类型,并且使用RestOperations的相关接口和参数一一对应。 其中 servicecomb://provider-service 表示目标微服务,使用目标微服务的服务名称。

RPC风格

RPC风格是一种语言有关的开发方法,更加贴近语言的使用习惯。访问服务提供者的服务,就像调用本地的API一样。

使用RPC风格,首先需要声明一个 interface 与提供者的服务对应。

interface HelloWorldService {
  String helloWorld(String name);
}

声明 interface 会使用到 Open API 的 operationId、 参数名称和参数类型、响应类型。 只需要保证方法名等于operationId, 参数名称等于Open API里面的参数名称(对于body,使用扩展属性x-name)。

使用起来就非常简单了:

@RpcReference(schemaId = "HelloWorld", 
    microserviceName = "provider-service")
private HelloWorldService helloWorldService;

String result = helloWorldService.helloWorld("World");
Assertions.assertTrue("Hello World", result);

在具体的开发实践中,开发Provider定义interface(API),然后Consumer依赖Provider发布的包,直接使用Provider的接口也是非常常见的。如果已经习惯这种使用方式,可以继续使用。 在讨论完全解耦和API依赖的好处的时候,存在非常复杂和细节的差异。完全解耦的形式,可以给独立开发带来很大的灵活性,能够提高并行开发的效率。

泛化调用 - InvokerUtils

Map<String, Object> args = new HashMap<>();
args.put("name", "World");
String result = InvokerUtils.syncInvoke("provider-service",
    "HelloWorld", "helloWorld", args, String.class));
Assertions.assertTrue("Hello World", result);

泛化调用使用服务名、契约名称、operationId、 参数直接请求服务提供者,对应到 Open API 的operationId、参数名称和参数类型、响应类型。