微服务边界的接口——如何导入代码?

Interfaces for microservice boundaries - how to import code?

我正在 Haskell 中构建一些小型服务。我想让服务之间的界限正式化,这样构建过程就会告诉开发人员是否违反了合同

举个简单的例子,假设我们有一个 API 和路由 POST /users。它应该将用户添加到用户队列中。然后我们有一个工作人员,它从队列中读取并处理新用户。

两者之间的合同如下:

  1. 交易所名为"exchange"
  2. 队列名为"users"
  3. 消息应该是序列化为 JSON(或 msgpack 或 protobuf)的用户对象
  4. 用户是:{ name : String, age : Int }

我如何强制执行此操作,以便在以下任一服务时出现构建错误:

  1. 连接到错误的队列或交换器
  2. 为用户使用了错误的架构

如果所有代码都在一个存储库中,这将很容易,但据我所知,微服务的主要目标之一是使它们独立。如何使用单独的回购协议来完成?

我想为合同创建第三个回购协议,并让两种服务都依赖于它。如果它包含一些 Haskell 类型,API 和 worker 都可以包含它并根据它对它们的实现进行类型检查。如果我这样做,我应该如何处理版本控制?他们应该将它包含为 git 子模块,还是通过包管理器(这将允许依赖于旧版本,这可能是坏的)?

如果我想更新 User 的模式,我将如何构建事物以便在更新这两个服务之前我会遇到错误?

对于使用 protobuf 的人,您将与这两个服务相关的那些文件存储在哪里? protobuf 会在实现中出现错误吗?

我想说微服务不期望编译时或构建时支持边界检查或执行是惯用的。

相反,您将在 运行 时以两种方式执行这些规则:

  1. 验证和错误处理:服务必须始终预料到不正确的输入或滥用,并准备好通过返回正确的错误代码和限制来妥善处理
  2. 利用数字签名来验证请求并执行访问策略