在微服务架构中,在一个服务的内部客户端之间共享请求和响应契约的好方法是什么

In a microservice architecture, what is the good way of sharing the request and response contracts among the internal clients of one service

我有 4 项服务,如下所示 -

  1. Notes-service -- 获取 NotesRequest 并生成 NotesResponse
  2. 提醒服务 -- 获取 ReminderRequest 并生成 ReminderResponse
  3. Todo-service -- 获取 TodoRequest 并生成 TodoResponse
  4. 个人助理服务 -- 需要 AssistantRequest 和 AssistantResponse

Personal-assistant 服务在内部调用 3 个服务,Notes-service、Reminder-service 和 Todo-service。 Notes-service 将在其中包含这两个请求和响应 pojos --

  1. NotesRequest.java
  2. NotesResponse.java

但是要在 Rest 客户端的帮助下调用它,Personal-assistant 也需要这些 pojo。 一种可能的方法是创建一个名为 common-service 的公共模块,并将每个服务的可共享请求响应对象放在 common-service 中。每个服务模块都将依赖于公共服务。

有什么好的方法可以使代码整洁和模块化并使部署独立。

我会考虑两种可能性:

1.- 使用像 swagger(或类似)这样的框架来公开 API 规范(例如通过 OpenAPI)。这可以与代码生成工具一起使用来生成客户端。并在需要使用该服务的客户端的项目中将客户端生成作为构建过程的一部分。不要对生成的代码进行版本控制,这是一种不好的做法。

2.- 在每个服务项目中创建一个合同模块,您将在其中只有合同(请求、响应和 api 接口,如 JAX-RS 接口,或 Spring接口)。此模块可用作需要该服务的客户端的项目中的依赖项。

使用哪一个取决于您使用的技术以及客户的要求和使用的标准。

更新示例

例如,使用选项 2,notes 项目将具有以下项目结构:

-notes-parent
    -notes-contract
    -notes-service

每个都有其 pom.xml.:

  • parent 只是一个容器根模块
  • contract 包含请求、响应和服务接口。这将用作要查询 notes-service
  • 的项目的依赖项
  • service 可部署服务本身。这也将使用合同作为依赖项。

并对所有服务执行此操作。每个 xxx-service 子模块都将具有它要查询的其他服务的所有 yyy-contract 模块作为依赖项。