【发布时间】:2016-10-11 23:46:38
【问题描述】:
我正在 Haskell 中构建一些小型服务。我想让服务之间的边界正式化,这样构建过程会告诉开发人员是否违反了合同
举个简单的例子,假设我们有一个带有 POST /users 路由的 API。它应该将用户添加到用户队列中。然后我们有一个工作人员,它从队列中读取并处理新用户。
两者之间的契约是这样的:
- 交易所名为“exchange”
- 队列名为“users”
- 消息应该是序列化为 JSON(或 msgpack 或 protobuf)的用户对象
- 用户是:
{ name : String, age : Int }
如果任一服务出现构建错误,我该如何执行此操作:
- 连接到错误的队列或交换机
- 为用户使用了不正确的架构
如果所有代码都在一个存储库中,这将很容易,但据我了解,微服务的主要目标之一是使它们独立。如何使用单独的回购来完成?
我的想法是为合同创建第三个 repo,并让两个服务都依赖它。如果它包含一些 Haskell 类型,API 和 worker 都可以包含它并针对它进行类型检查。如果我这样做,我应该如何处理版本控制?他们应该将其作为 git 子模块包含,还是通过包管理器包含(这将允许取决于旧版本,这可能很糟糕)?
如果我想更新用户的架构,我将如何构建事物,以便在两个服务更新之前出现错误?
对于使用 protobuf 的人,您将这些与这两个服务相关的文件存储在哪里? protobuf 可以在实现中显示错误吗?
【问题讨论】:
标签: git haskell rabbitmq protocol-buffers microservices