Vert.x 3 和微服务

Vert.x 3 and Microservices

微服务作为一种软件架构风格越来越受欢迎,它将更好地支持持续交付,为快速部署和关注点分离提供模型。

Vert.x 3 和 Vert.x-Apex 为构建微服务提供了一个有趣的模型。正如其中一个示例所示,一个简单的 Verticle 可以公开 HTTP 服务,因此可以使用 REST 服务。 Verticle绑定自己的tcp端口

当扩展到多个微服务以支持完整的应用程序时,您最终会有多种选择。关于哪种样式最终可以支持持续交付并最大限度地减少升级停机时间,您有什么想法吗?

选项

  1. 运行 多个 Verticle 可能是一个解决方案,所有 Verticle 都包含自己的路由,因此在 Verticle 中包含了 http 处理。 request/response 完全可以由verticle处理。这可能意味着每个 Verticle 都在它自己的 tcp 端口上运行。
  2. 使用路由器,您可以在单个端口上公开所有路径,并相应地处理它们。数据将由包含路由器的 Verticle 处理,可能会将其传递给其他 Verticle。然后,这开始看起来像是一种更单一的方法。
  3. 运行 包含服务的 vert.x 的单独实例(可能将它们聚类)。这可以使持续交付更容易使用,因为整个事情都是独立的。
  4. 其他可能的选择?

部署

在部署方面,希望在不关闭整个应用程序的情况下快速部署新服务。

单独的微服务提供了一种有趣的开发方式,但在编排和部署方面带来了一些挑战。

有什么想法吗?

我认为您必须有充分的可扩展性 理由来划分您的服务,并且没有任何一刀切的方法来处理生命周期并解决您将 运行 使这些服务相互交互的问题。无论 'verticle' 还是其他东西正在监听套接字,我认为限制 endpoints/addresses 的数量会在那个方向上引起最少的麻烦。在任何情况下,负责将给定 Verticle 关联到其套接字的代码实体都需要以某种方式将生命周期控制暴露给某个编排框架……就像它不是 Verticle 在那里监听时那样。

让我们从术语开始。

  • A verticle 是一个 Java class,通常扩展 AbstractVerticle 并实现一个 start(..) 方法。一个 Verticle 可以公开一个或多个 HTTP 端点并公开一个或多个 eventbus 个端点。
  • Vert.xapplication(以前称为 'module')内的一个顶点 运行s。一个应用程序可以包含一个或多个 Verticle。我通常保留它 1:1 以保持小而简单。
  • 一个 Vert.x 应用程序 运行 在 Vert.x instance 中。您可以 运行 一个应用程序的多个实例以增加并行化。
  • Vert.x 个实例 运行 在 Vert.x container 中。容器是具有一个或多个应用程序实例的 运行ning 进程。
  • JVM 中的 Vert.x 个容器 运行。

在使用 Vert.x 构建微服务风格的应用程序时,您通常需要小型独立的逻辑工作单元,将它们称为服务。理想情况下,这样的服务应该 运行 在它自己的进程中,是独立的并且可以独立升级。将其映射到上面的术语:将服务构建为 Vert.x 应用程序,其中包含具有服务逻辑的单个 Verticle。

Vert.x 应用程序使用由 Hazelcast 构建的分布式事件总线相互通信。这意味着多个 JVM 的 运行ning 在同一台服务器上,甚至在多个服务器上,可以通过 Vert.x 事件总线相互通信。

使用 Vert.x 构建的 Web 应用程序通常包含一个或多个 Vert.x 应用程序公开 REST 端点通过事件总线与一个或多个 Vert.x 应用程序公开(内部)事件总线端点通信.

回答您的问题:选项 3 在 Vert.x 设置中最常见,并且最接近微服务架构。您可以在那里选择 2 个选项:运行 1 个具有 REST 端点的应用程序,该端点处理所有 HTTP 调用并将事件总线上的请求处理委托给其他应用程序,或者您提供每项服务(或至少,每项服务提供最终用户的功能)它自己的 REST 端点。后者的设置有点复杂,因为有多个 HTTP 端点可以从前端连接,但它的可扩展性更高,单点故障更少。

Vert.x 目前有许多用于创建微服务架构的官方模块,我相信在您提出问题时不存在这些模块。

这些是官方的Microservices modules:

  • Vert.x 服务发现 - 发布、查找和绑定到任何类型的服务。
  • Vert.x 断路器 - 为Vert.x
  • 提供断路器模式的实现
  • Vert.x 配置 - 提供一种可扩展的方式来配置 Vert.x 应用程序。

还有更多官方模块可以派上用场:

  • 使用 Dropwizard 的指标 - 从核心组件获取指标并发送到 Dropwizard。
  • 使用 Micrometer 的指标 - 从核心组件获取指标并发送到 Micrometer。
  • Vert.x Health Check - 提供了一种公开健康检查的简单方法。
  • Vert.x Clustering - 支持 Hazelcast、Zookeeper、Apache Ignite 和 Infinicast
  • Vert.x Services - 封装可重用功能以供其他地方使用的简单有效的方法。

您可以将更多官方模块合并到您的微服务设计中。

还有一些关于如何在实践中应用它们的精彩文章:

最后,如果您想查看比 HelloWorld 更进一步的代码,请查看:

还有更多的代码(比如 API Gateway,虽然是中文自述文件)。