【问题标题】:Interfaces for microservice boundaries - how to import code?微服务边界的接口——如何导入代码?
【发布时间】:2016-10-11 23:46:38
【问题描述】:

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

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

两者之间的契约是这样的:

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

如果任一服务出现构建错误,我该如何执行此操作:

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

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

我的想法是为合同创建第三个 repo,并让两个服务都依赖它。如果它包含一些 Haskell 类型,API 和 worker 都可以包含它并针对它进行类型检查。如果我这样做,我应该如何处理版本控制?他们应该将其作为 git 子模块包含,还是通过包管理器包含(这将允许取决于旧版本,这可能很糟糕)?

如果我想更新用户的架构,我将如何构建事物,以便在两个服务更新之前出现错误?

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

【问题讨论】:

    标签: git haskell rabbitmq protocol-buffers microservices


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这很有帮助。您如何处理对队列的无效输入?工作人员无法向发布消息的客户端返回错误代码。
    • 你能给我一个关于#2的链接吗?我不确定你的意思。
    • @SeanClarkHess - 你使用什么样的队列?在真正的微服务方式中,我希望您使用 AWS SES 或 Azure 队列等服务,或者您已经将自己的服务实现为服务
    • 我们正在使用 RabbitMQ
    • 我对 RabbitMQ 不是很熟悉,但这里有一个 auth 资源:rabbitmq.com/access-control.html - 关于您的问题:“我如何防止某人将无效消息放入队列” - 那真的取决于谁可以访问它,但我真的鼓励您编写代码,就好像您希望将损坏的东西放在队列中一样。您决定采取何种防御措施取决于您希望谁访问队列。
    猜你喜欢
    • 2020-09-12
    • 2020-06-27
    • 2021-04-13
    • 2020-03-27
    • 2015-07-28
    • 2021-05-17
    • 2022-08-14
    • 2016-01-07
    • 2019-04-10
    相关资源
    最近更新 更多