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

时间:2016-10-11 15:34:13

标签: git haskell rabbitmq protocol-buffers microservices

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

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

两者之间的合同如下:

  1. 交换被命名为“exchange”
  2. 队列名为“users”
  3. 消息应该是序列化为JSON(或msgpack或protobuf)的用户对象
  4. 用户是:{ name : String, age : Int }
  5. 我如何强制执行此操作,以便在任何一项服务时出现构建错误:

    1. 连接错误的队列或交换
    2. 使用不正确的用户架构
    3. 如果所有代码都在一个存储库中,这将很容易,但我了解它们的微服务的主要目标之一是使它们独立。如何通过单独的回购来完成?

      我有想法为合同创建第三个回购,并且两个服务都依赖于它。如果它包含一些Haskell类型,那么API和worker都可以包含它并检查它们的实现。如果我这样做,我应该如何处理版本控制?它们应该包含它作为git子模块,还是通过包管理器(允许取决于旧版本,这可能是坏的)?

      如果我想更新User的架构,我将如何构建内容以便在更新之前在两个服务中出现错误?

      对于使用protobuf的人,您在哪里存储与这两个服务相关的文件?可以在实现中使用protobuf表面错误吗?

1 个答案:

答案 0 :(得分:1)

我认为微服务不习惯于边界检查或执行的编译时或构建时支持。

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

  1. 验证和错误处理:服务必须始终期望错误的输入或滥用,并准备好通过返回正确的错误代码和限制来优雅地处理它
  2. 利用数字签名对请求进行身份验证并实施访问策略