繁体   English   中英

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

[英]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. Reminder-service——获取 ReminderRequest 并生成 ReminderResponse
  3. Todo-service——获取 TodoRequest 并生成 TodoResponse
  4. 个人助理服务——接受 AssistantRequest 和 AssistantResponse

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

  1. 备注Request.java
  2. 备注Response.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将只是一个容器根模块
  • 合约包含请求、响应和服务接口。 这将用作想要查询 notes-service 的项目的依赖项
  • 为可部署的服务本身提供服务。 这也将使用合同作为依赖项。

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

您可以创建一个单独的模块来保留所有 json 模式(合同)以进行请求和响应,并使用 maven 插件(如 jsonschema2pojo-in-plugin-)使 object 创建成为构建过程的一部分。 您可以在每个客户端中包含此模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM