Web applications 基于微服务的web应用程序体系结构

Web applications 基于微服务的web应用程序体系结构,web-applications,soa,microservices,Web Applications,Soa,Microservices,我对web应用程序向微服务分化的点感到困惑——是url级别还是模型级别? 例如,假设我有一个提供3个页面的单片应用程序。假设每个页面都有一个单独的用例,我想用它们自己的微服务来支持它们。现在,以下哪一种是实现基于微服务的体系结构的正确方法: 我创建了三个不同的应用(微服务),每个都包含其中一个页面的(路由、控制器、模型、模板)。然后根据请求的页面,我将请求路由到特定的应用程序。这意味着从数据库到HTML的整个页面都由一个单独的应用程序提供服务。基本上,同一网站中的不同页面完全由后端的不同应用程

我对web应用程序向微服务分化的点感到困惑——是url级别还是模型级别? 例如,假设我有一个提供3个页面的单片应用程序。假设每个页面都有一个单独的用例,我想用它们自己的微服务来支持它们。现在,以下哪一种是实现基于微服务的体系结构的正确方法:

  • 我创建了三个不同的应用(微服务),每个都包含其中一个页面的(路由、控制器、模型、模板)。然后根据请求的页面,我将请求路由到特定的应用程序。这意味着从数据库到HTML的整个页面都由一个单独的应用程序提供服务。基本上,同一网站中的不同页面完全由后端的不同应用程序提供服务
  • 这3个微服务不处理UI内容,只处理其用例(模型、控制器、无模板)的数据,并通过RESTAPI公开这些数据。我有一个面向公众的应用程序。此应用程序仅查询三个不同的应用程序(微服务)中的数据,然后生成要返回到浏览器的html页面。在本例中,web应用程序中的所有页面都由一个应用程序提供服务,该应用程序内部使用三种不同的微服务

在软件工程中,答案是这要视情况而定。我现在无法想象有什么原因,但选项1在某些特定场景中可能很有用


然而,考虑到微服务的正式定义,选项2更好地说明了这一点。拥有微服务的主要优点之一是能够重用它。不同的应用程序对呈现信息有不同的要求和需求。让您的微服务返回数据的JSON表示将使您能够更灵活地格式化这些信息。

您的问题在于如何为微服务建模

就微服务而言,第二种方法最合适,它通过API公开其逻辑

在为微服务建模时,请始终牢记以下事实

  • 松散耦合:当服务松散耦合时,对一个服务的更改不需要对另一个服务进行更改。这个微服务的全部意义在于能够对一个服务进行更改并部署它,而不需要更改系统的任何其他部分。这真的很重要

  • 强大的凝聚力:我们希望相关行为坐在一起,而无关行为坐在其他地方。为什么?如果我们想改变行为,我们希望能够在一个地方改变它,并尽快释放这种改变


微服务的Api网关模式是您可以开始向不同服务分发或转发调用的第一个点

我们目前正在实施一种与您的第二个选项类似的体系结构。我们在做这件事时遇到了以下复杂情况:(任何人都可以随意插话,因为这仍然是一项正在进行的工作)

  • 从技术上讲,您的系统中仍然有一个单一的应用程序(面向用户的应用程序)。每次在RESTAPI中进行更改时,您都必须更改面向前端的应用程序以处理这些新更改。不要让我知道你是如何在它背后引入新的微服务的。因此,从本质上讲,您投入的微服务越多,API网关的规模就越大。()
API网关也有一些缺点。它是另一个必须开发、部署和管理的高可用组件。API网关也有成为开发瓶颈的风险。开发人员必须更新API网关才能公开每个微服务的端点。更新API网关的过程必须尽可能轻量级,这一点很重要。否则,开发人员将被迫排队等待以更新网关。尽管存在这些缺点,但对于大多数实际应用程序来说,使用API网关是有意义的

  • 为了可重用性,我设计了一个抽象层,定义了与每个微服务通信的独特行为。每个微服务都有一个具体的实现。这引入了另一层复杂性,因为现在我们必须维护我们所称的“RPC连接器”及其相应的微服务。就个人而言,这消耗了开发人员大量的时间,因为除了维护各自的微服务,他们还必须维护连接器。如果其中任何一个都过时了,公共应用程序就会失败。此外,连接器中的更改需要重新构建公共应用程序(我们目前将连接器定义为jar依赖项)
  • 虽然在另一篇文章和一篇博客中提到了这一点,但当处理多个处理自己数据库的微服务时,外键关系变得一团糟。(每个服务模式的数据库)您的前置应用程序现在面临着必须将它们缝合在一起的问题。(“我需要这些数据,但我必须在每个微服务中查找这些密钥,看看谁拥有什么。”)我不是说这是正确的方法,但如果我们处理返回的多行,那么每个ID都必须从微服务中单独解析。但我不确定这有多有效。我很乐意听取建议

将您的ui前端视为一项独立服务。因此,只要有一个后端服务满足其请求契约,您就可以插入它,ui前端服务就会正常工作。这个答案的流行语版本可能是:组合和单一责任原则(如MV*,不要将数据与呈现混合)。