tomcat - 将请求路由到微服务架构中相关服务的方法

标签 tomcat microservices

假设我们有 5 项服务(用户和授权、产品、订单、库存、历史)公开基于 REST 的 API,并且仅通过这些公开的 API 在服务之间进行内部通信。现在,在以微服务架构模式开发它时,这些将是不同的独立服务,它们将自力更生并通过 REST/队列相互通信。

首先让我们考虑一下,我们目前正在单个节点上部署它,其中所有 5 项服务仅部署在该单个节点上。所以一种方法是

  1. (理想) 通过 Netflix 工具链(eureka)或通过 Zookeper 建立服务发现和注册机制,在身份验证和授权后将请求定向到相关服务,例如/api/v1/Products/{id} 指向产品服务,/api/v1/order/{id} 指向订单服务等。
  2. 另一个(虽然不适合服务分布在多个节点的场景,但考虑到我们是否将所有服务都放在一个节点上并计划快速上线并且然后在下一阶段转向发现/注册、API 网关、微服务的断路器方法),其中我们将所有服务开发为单独的 Web 应用程序,部署为 tomcat(基于 Spring 的应用程序)中的单独 war ,并让 tomcat 处理基础上的重定向网址,例如 https://ip:port/ productservice/api/v1/products/{id} 被tomcat重定向到productservice webapp等等。

选项 2 将是一个可行的选项,可以将不同的服务作为单独的 webapp 开发,依赖于它自己的架构部署在单个 tomcat 实例中并从 UI 层使用,并且然后在下一阶段使用这个单独和独立服务的基本代码,并转向发现/注册方法。

但我在选项 2 中预见到的挑战是路由 - 每个服务都是单独的 war (没有发现/注册)作为每个请求的主要条目,例如 https://ip:port/ productservice/api/v1/products/{id} 在转到productservice webapp 之前需要通过一个“认证服务”应用然后被路由到适当的服务和处理此路由在单独的 war 机制中(尽管在单个实例上)具有以下选项

  1. 每个请求都需要登陆到身份验证服务应用程序(如何?可以是 URL 重定向),然后编写一些路由逻辑以将经过身份验证的请求发送到所需的基于 REST 的应用程序(服务)。此路由可以是基于 camel 的,也可以是简单的基于 DB 的——解析字符串并调用所需服务的 REST API。然后,身份验证应用将充当 API 网关。
  2. 其他是您提到的那个(缺少队列)。所有请求都到达身份验证服务应用程序(如何?可以是 URL 重定向),然后写入专用于每个服务的单独队列,其中每个服务订阅它的特定队列。

最佳答案

选项 2,因此在每个节点的单个 tomcat 实例上运行所有单独的 Web 应用程序是迈向成熟的微服务架构的非常好的第一步。事实上,您以后无论如何都需要此步骤来实现服务发现/注册。在您编写时 - 它已经为您提供了一定程度的隔离和执行独立迁移(通过单独的 war )的能力。

只需确保将用于获取服务 URL 的代码包装到一个类中,这样您只需在添加服务发现时在一个地方进行更改(相对于在您的应用程序的多个位置对服务进行硬编码 URL)。

在选项 2 上停止一段时间的缺点是您将失去按服务级别扩展的能力。您将需要回答它在您的特定场景中有多重要的问题。

我在您的帖子中没有看到您使用队列的方法。老实说,如果您的解决方案可以使用异步通信,我强烈建议您使用它(请注意,Netflix 堆栈主要针对直接 REST 通信)。

关于tomcat - 将请求路由到微服务架构中相关服务的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45964545/

相关文章:

node.js - 如何正确使用快速网关对 Web 应用程序进行身份验证?

php - 如何在微服务环境中处理文件上传?

linux - 为什么我不能在shell脚本中使用catalina启动tomcat

tomcat - Spring 启动: Send requests on another port to a custom Servlet

java - tomcat中connectionTimeout的含义

c# - RestSharp - 异步请求回复模式

tomcat - Centos服务器安装Java后Web App报错

tomcat - 部署到现有 Apache Tomcat 实例时无法让 JetBrains License Server 运行

node.js - 微服务、API 网关和前端

java - 如何改善微服务之间的通信