实施微服务架构的意义

Implications of implementing a microservice architecture

我是第一次踏上 learning/implementing 微服务架构之旅,我有一些与它的影响相关的问题。

对于某些背景,我打算使用的 techstack 在非常全面的意义上是 AWS 上的 dockerized spring-boot 微服务 运行。

所以我想知道的是...

首先,鉴于每个微服务都应该是完整的堆栈,包括单独的数据库,这是否意味着我需要 3 个单独的实例来运行我选择的任何数据库?我猜答案是肯定的。所以,我想我真正的问题是,这不是比具有单个数据库的整体应用程序消耗更多的硬件资源吗?数据库非常需要内存...

不仅如此,如果我是 运行 5 个微服务,那么 运行 单个 spring-boot 应用程序所需的全部内存将需要 5 倍,对吗?在我看来,这需要比单体应用程序多得多的内存,对吗?

如果您使用 Oracle 作为数据库呢?它对许可有什么影响?如果每个微服务都需要一个单独的数据库,会不会变得非常昂贵?

是否还有其他需要考虑的许可陷阱?或者在开始此旅程之前应该 consider/be 意识到 MSA 的任何其他一般陷阱?

编辑: 此外,鉴于每个微服务都是全栈的,如果我想要为每个微服务提供一个看起来一致的前端(微服务需要一个前端)怎么办?我还没有看到任何好的建议。特别是考虑到(如果它们被称为“12 因素”),代码库应该位于每个微服务的单独存储库中。这如何是最好的 managed/achieved?

这是一个很大的清单,但我会试一试:

数据库: 是的,他们应该有自己的数据库。这并不一定意味着他们自己的数据库服务器,这是一个扩展问题,但您当然不想将它们耦合在一起。绝对最干净的方法是在物理上将它们分开,但从许可的角度来看,彼此没有权限的单独模式可能就足够了。

内存: 是的,这肯定需要更多space的程序区。这通常是无关紧要的,因为程序的数据通常远远超过 program/framework 内存。我相信 spring 引导框架需要大约 18 mb 到 运行。除非你有一个非常小的服务,否则你将需要一个数量级(或两个)的 RAM 来 运行 你的服务,此时 spring 框架是一个舍入误差。甚至 JVM 本身也可能压倒一切。您可以进行一些测试,但请不要花任何时间优化 2-3 MB 的 RAM...在演出或更多演出时进行优化。

许可:除了上面对数据库实例的评论外,这太宽泛了,无法解决。如果您是个人许可 products/libraries,那么您将不得不查阅您的许可协议以了解它将如何爆发。一些由 "server" 许可,一些由 "application" 许可,一些由过程许可。

UI:这个我不是很懂。微服务被组装成一个应用程序。该应用程序有 UI。服务本身通常没有 UI。此应用程序通常是一个单独的应用程序服务器,或者有时只是一个 HTML 页面,其中包含 javascript 以调用服务。

根据您的了解,下面的某些内容可能有点重复,但让我们看看其中的某些部分是否仍然对您有用。

微服务的理念是围绕单一职责或相当普遍的单一领域来设计每个服务。这意味着您将有不同的服务来处理产品 API、订单 API、购物篮 API 和客户 API。正如您已经猜到的那样,这意味着您将在不同的数据库和服务之间拆分所有这些数据并相互协作,永远不会直接访问它们自己的数据库。

这允许您将所有业务逻辑包含在一个地方并实现服务:

  • 独立发布和部署
  • 可替换且更容易升级
  • 独立缩放
  • 更简单、更快的发布
  • 更容易测试

影响

更多的东西可以下降

这种方法的含义自然是更复杂的部署基础设施和更多可能出错的事情,因为服务通常通过 REST API 通过 HTTP 相互通信,但有时通过 pub-sub、Protocol Buffs 或 Thrift ,或其他 light-weight 消息传递协议。这会导致通信、延迟等可能超时

您将不得不考虑 "things can go down" 场景,而不是在整体中,并根据您的要求进行处理。有一些库和工具可以帮助您,例如 Spring-Cloud-Netflix Netflix Hystrix 中的项目包装以提供断路器支持,帮助您处理远程服务通信超时。

资源使用

当涉及到资源使用时,这取决于您如何看待它。多项服务相结合很可能会比整体使用更多的资源,特别是如果您考虑多个数据库实例等。但是让我举一个例子,例如部署到 AWS 并使用 AWS 提供的 Auto-scaling 支持。

在单体中,您将扩展整个应用程序。当应用程序的负载增加时。这意味着您将启动更多的 EC2 机器,即使它只是承受压力的特定代码片段。

在微服务架构中,您可以根据使用情况自行扩展每个服务。这可以导致更好的资源利用率,并且最终会更多 cost-effective,因为每个服务将只使用单体应用的一小部分。

关于UI

的几句话

我认为 UI 也应该被视为一项单独的服务。它应该只提供 UI 本身,而不是某些操作的业务逻辑——这是每个微服务的责任。因此,如果您有网上商店,您最终可能会获得以下服务:

  • 前端UI
  • 购买服务
  • 篮子服务
  • 用户服务
  • 产品服务
  • 订购服务
  • 送货服务
  • ...可能还有很多。

您的 UI 应该具备的唯一逻辑是如何显示不同类型的数据,然后与底层服务进行通信。但是,UI 也可以由许多不同的服务组合!例如,Amazon 有许多不同的服务为您看到的每个页面和部分提供支持,或者 UI 可以由不同的 UI 服务生成和显示。这完全取决于您希望将服务缩小到多小。

我强烈推荐您阅读 Sam Newman 的一本非常好的书 "Build Microservices" - 它涵盖了很多这些内容以及更多内容。它还应该回答随着时间的推移可能会出现的许多不同问题,因为您对微服务的美丽世界的了解越深入。