Skip to content

基础概念

Java Chassis 是以 OpenAPI 为基础的微服务开发框架。一个微服务提供的功能,可以通过 OpenAPI 进行描述,开发任务就是实现这些 OpenAPI 描述的功能。 可以将一个微服务开发分为两个基础性的工作:

  • 定义微服务的功能。
  • 实现微服务的功能。

Java Chassis提供了3种方式定义微服务功能:

  • Spring Web MVC: 简称SpringMVC。Spring Web MVC是Spring Boot提供的一组描述 REST 接口的注解。
  • JAX-RS: JAX-RS 是 Java SE 和 Java EE 提供的一组描述 REST 接口的注解。
  • PRC: RPC是一种简洁的开发模式,用户无需通过注解描述 REST 接口,Java Chassis通过系统默认的规则,将服务定义映射为 OpenAPI 的描述。

尽管Java Chassis支持在一个微服务中混合使用上述几种方式,项目中通常只会选择一种方式。从使用广泛性的角度,推荐Spring Web MVC。

Spring Web MVC 的例子:

@RestSchema(schemaId = "HelloWorld")
@RequestMapping("/")
public class SpringMVCExample {
  @PostMapping("/helloWorld")
  public String helloWorld(@RequestBody String name) {
    return "Hello " + name;
  }
}

JAX-RS 的例子:

@RestSchema(schemaId = "HelloWorld")
@Path("/")
public class JAXRSExample {
  @POST
  @Path("/helloWorld")
  public String helloWorld(String name) {
    return "Hello " + name;
  }
}

这两种写法总体上是等价的,他们都定义了如下使用 OpenAPI 描述的服务:

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: {}

RPC 的例子:

@RpcSchema(schemaId = "HelloWorld")
public class RPCExample {
  public String helloWorld(String name) {
    return "Hello " + name;
  }
}

这个服务使用 OpenAPI 描述如下。 可以看出 RPC 接口都会被描述为 POST 方法,参数都会使用 RequestBody 进行包装。 RPC模式通常用于使用者不关注 REST 规范的场景,Java Chassis的服务描述文件,给第三方工具测试 RPC 接口提供了便利。

openapi: 3.0.1
info:
  version: 1.0.0
servers:
- url: /
paths:
  /helloWorld:
    post:
      operationId: helloWorld
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/helloWorldBody'
          application/protobuf:
            schema:
              $ref: '#/components/schemas/helloWorldBody'
          text/plain:
            schema:
              $ref: '#/components/schemas/helloWorldBody'
        x-name: helloWorldBody
      responses:
        "200":
          description: response of 200
          content:
            application/json:
              schema:
                type: string
            application/protobuf:
              schema:
                type: string
            text/plain:
              schema:
                type: string
components:
  schemas:
    helloWorldBody:
      type: object
      properties:
        name:
          type: string
  • 使用 OpenAPI 注解

Spring Web MVC 和 JAX-RS 注解只定义了一些基础的服务描述功能,比如参数、返回值等信息。 如果需要更加细粒度的描述服务,还需要借助 OpenAPI 注解。 OpenAPI 注解可以在3种模式下混合使用。比如通过 OpenAPIDefinitionOperation 两个注解,给Spring Web MVC的服务增加了分组和接口唯一标识。 利用OpenAPI 注解能够更清晰的描述服务功能、示例、安全性等方面的约束。

@RestSchema(schemaId = "SpringMVCExample")
@RequestMapping("/")
@OpenAPIDefinition(tags = {@Tag(name = "example")})
public class SpringMVCExample {
  @Operation(operationId = "spring-mvc-example")
  @PostMapping("/helloWorld")
  public String helloWorld(@RequestBody String name) {
    return "Hello " + name;
  }
}
  • 服务定义和服务实现分离

为了更好的管理服务定义和实现,将服务定义和实现分离是一个好的工程实践。 Java Chassis提供了相关支持。

服务定义在单独的 interface 里面描述:

@OpenAPIDefinition(tags = {@Tag(name = "example")})
@RequestMapping("/")
public interface ExampleService {
  @Operation(operationId = "spring-mvc-example")
  @PostMapping("/helloWorld")
  String helloWorld(@RequestBody String name);
}

服务实现:

@RestSchema(schemaId = "SpringMVCExample", schemaInterface = ExampleService.class)
public class SpringMVCExample implements ExampleService {
  @Override
  public String helloWorld(String name) {
    return "Hello " + name;
  }
}