【问题标题】:Should a single microservice be both public and internal simultaneously单个微服务是否应该同时是公共的和内部的
【发布时间】:2017-06-26 05:38:33
【问题描述】:

现有三个微服务:

作者
它具有 SELECT 和 CRUD 实体“作者”的能力

书籍
具有 SELECT 和 CRUD 实体“book”的能力

移动应用主机
专为移动客户端构建,以响应请求的完整数据模型,因此移动应用程序不会在其端“丰富”数据。

示例:API 'MobileHost.getAllBooksOfGivenAuthor' 将通过调用 'Authors.getAuthorData(authorId)' 并将其数据与 'Books.getBooksByAuthorIds(authorId)' 合并,从而返回作者姓名和书名:

{ 
  "author" : {
    "name" : "Winner",
    "id" : 1
  },
  "books" : [
     {
       "name" : "Book A",
       "id" : "13231231"
     }
   ]
}

我的问题是:
如果移动客户端通过“移动应用程序主机”读取数据,是否也应该通过“移动应用程序主机”“添加作者”,还是直接联系“作者”服务可以?在这种情况下是否应该代理 CRUD?

【问题讨论】:

    标签: design-patterns microservices restful-architecture


    【解决方案1】:

    这取决于你的目标。

    根据我的经验,这种“主机”或“代理”服务往往会变得越来越大,而没有任何真正的责任。将许多类、功能和职责耦合到一个地方绝对是个坏主意——随着时间的推移,这样的服务将难以维护。

    此外,如果仅需要横向扩展 Authors 服务,则横向扩展此类服务的实例可能非常困难且资源效率低下。因此,如果您要分别扩展不同的服务和活动,那么,当然,您不需要仅使用一项服务代理请求。您可以拥有多个代理服务,例如,单独扩展它们或直接调用作者服务并扩展它们而不是代理。

    但是,如果您没有看到提到的机会,那就让它尽可能简单——当需要这样做时,您将始终能够分离服务及其代理,只需将内部的所有内容分开即可。

    【讨论】:

    • 感谢您的详细回复。再问你一个问题:除了“主机”服务之外,你是否创建了内部和外部的 API?如果你这样做了,你能说出你这样做的原因吗?谢谢。
    • 由于缓存的原因,我们对 API 服务采取了混合策略。 API 缓存一些非常频繁的数据,并在查询时从缓存中返回数据。它还处理分页并仅从服务中获取特定的数据“页面”。如果有一个服务不需要任何缓存系统,我们直接调用它,因为它减少了在高负载下可能非常昂贵的服务间通信量。但是我们的 API 服务被设计为随时分离,它们遵循外观设计模式。如果我们注意到一小部分 API 服务负载很大,我们会将其取出。
    猜你喜欢
    • 2020-10-23
    • 2020-09-29
    • 1970-01-01
    • 2018-08-11
    • 2016-09-29
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2017-05-18
    相关资源
    最近更新 更多