微服务与单片架构[已关闭]


82

我读了一些有关微服务的文章,但我对此有些兴趣,好像是一个有趣的概念。但是我想知道,使用微服务比单片架构有什么优点和缺点,反之亦然。

微服务何时更合适,单片架构更适合。


6
马丁·福勒(Martin Fawler)就该主题写了一篇广泛的文章。我强烈建议您阅读以下内容:martinfowler.com/articles/microservices.html
Kaj

看看这篇文章microservies架构:medium.com/startlovingyourself/...
巴格瓦蒂Malav

只是微服务是作为服务器或服务进程独立运行的整个应用程序系统的一部分,它在服务器群集上运行。因此,如果在该服务上发生错误,那么它将被隔离,并且您的整个系统不会完全崩溃,这就是除了并发之外的一项优势。
LEMUEL ADANE

Answers:


75

虽然我是微服务领域的新手,但我会尽力回答您的问题。

当您使用微服务架构时,将增加关注点的分离和分离。既然您会分散应用程序。

这样一来,您的代码库将更易于管理(每个应用程序独立于其他应用程序以保持运行)。因此,如果您这样做正确将来在您的应用程序中添加新功能将变得更加容易。而采用单片式架构,如果您的应用程序很大(可能会在某个时间点假设),这可能会变得非常困难。

部署应用程序更容易,因为你是单独建立独立的微服务,并在不同的服务器上部署它们。这意味着您可以随时构建和部署服务,而不必重新构建其余的应用程序。

由于不同的服务规模较小且分别部署,因此显然可以轻松地扩展它们,其优势在于您可以扩展应用程序的特定服务(使用整体式,您可以扩展完整的“事物”,即使它只是其中的特定部分)。应用程序负载过大)。

但是,对于将来不会变得太大而无法管理的应用程序。最好将其保留在整体架构中。由于微服务架构涉及一些严重的困难。我说过,部署微服务比较容易,但这仅与大型组件相比才是正确的。使用微服务会增加将服务分发到不同位置的不同服务器的复杂性,您需要找到一种方法来管理所有这些服务。从长远来看,如果您的应用程序变大,构建微服务将为您提供帮助,但是对于较小的应用程序,保持单一是很容易的。


21
我的经验(并且我已经在两种代码库上工作过)是,整体式代码要简单得多:代码库更易于管理(功能更少!),添加功能也更容易(您只需在其中添加功能)一个地方,而不必为所有事物定义进程间API),并且部署起来要容易得多(您只需部署到一组服务器,而不是六种类型)。@Paulo的答案更为完整!
Ben Hoyt

“部署应用程序也更容易,因为您是分别构建独立的微服务并将它们部署在单独的服务器上。这意味着您可以随时构建和部署服务,而不必重新构建其余的应用程序。” -当您针对不同的服务进行多种类型的部署时,通常会使部署更加困难,而不是更加容易。具有一种配置而不是多种配置,一种配置更易于维护。
迈克尔(Michael)

当具有完全独立的功能时,将整体拆分为多个服务的最佳情况。如果您没有首先摆脱依赖关系,则可能会遇到最坏的情况-分布式整体(紧密耦合-小变化=更改每个服务)。查看更多详细信息:微服务拆分标准
uvsmtid

这个答案不是中立的,因为您可以在没有微服务的情况下构建模块化应用程序。代码库不小,因为您强制执行服务API而不是其他形式的合同,EJB或Corba服务也允许模块化。另一方面,所谓的部署包含应用程序服务器的自包含二进制文件的简单性是以灵活性为代价的,并且偏向于开发人员与生产运营/支持工程师之间的角色分离。
Jose Manuel Gomez Alvarez

158

这是一个非常重要的问题,因为一些人被微服务的所有嗡嗡声所吸引,并且需要权衡取舍。那么,微服务的优势和挑战是什么(与整体模型相比)?

好处

  • 可部署性:由于构建+测试+部署周期缩短,因此可以更灵活地推出服务的新版本。同样,可以灵活地采用特定于服务的安全性,复制,持久性和监视配置。
  • 可靠性:微服务故障会单独影响该微服务及其使用者,而在整体模型中,服务故障可能会破坏整个整体。
  • 可用性:推出新版本的微服务所需的停机时间很少,而在整体中推出新版本的服务通常需要重新启动整个整体的速度较慢。
  • 可扩展性:每个微服务都可以使用池,集群,网格进行独立扩展。部署特性使微服务非常适合云的弹性。
  • 可修改性:使用新框架,库,数据源和其他资源的灵活性更高。而且,微服务是松耦合的模块化组件,只能通过其合同来访问,因此不太容易变成一个大团团。
  • 管理:应用程序开发工作分散在较小的团队中,并更独立地工作。
  • 设计自主权:团队可以自由采用不同的技术,框架和模式来设计和实现每个微服务,并且可以独立地更改和重新部署每个微服务

挑战性

  • 可部署性:部署单元要多得多,因此有更多复杂的作业,脚本,传输区域和配置文件需要监督部署。(因此,微服务项目非常需要连续交付和DevOps。)
  • 性能:服务更可能需要通过网络进行通信,而整体中的服务可能会从本地通话中受益。(因此,设计应避免使用“聊天”微服务。)
  • 可修改性:合同的变更更可能影响部署在其他地方的消费者,而在整体模型中,消费者更有可能位于整体中,并将​​与服务同步推出。而且,诸如最终一致性和异步调用之类的改善自治性的机制也增加了微服务的复杂性。
  • 可测试性:集成测试更难设置和运行,因为它们可能跨越不同运行时环境中的不同微服务。
  • 管理:由于需要更多的运行时组件,日志文件和点对点交互,因此管理操作的工作量有所增加。
  • 内存使用:每个微服务包中通常会复制几个类和库,并且总体内存占用量会增加。
  • 运行时自治:在整体中并置了整个业务逻辑。使用微服务时,逻辑分布在微服务中。因此,在所有其他条件相同的情况下,微服务更有可能会通过网络与其他微服务进行交互-这种交互会降低自主性。如果微服务之间的交互涉及更改数据,则对事务边界的需求进一步损害了自治性。好消息是,为了避免运行时自治问题,我们可以采用诸如最终一致性,事件驱动的体系结构,CQRS,缓存(数据复制)以及将微服务与DDD绑定上下文对齐的技术。这些技术不是微服务所固有的,但实际上我已经阅读过的每位作者都提出了建议。

一旦了解了这些折衷,我们还需要知道另一件事来回答另一个问题:微服务还是整体服务哪个更好?我们需要知道应用程序的非功能性要求(质量属性要求)。例如,一旦了解了性能与可伸缩性之间的重要性,就可以权衡取舍并做出有根据的设计决策。


嘿,有趣的答案。我想知道表演是否不同。因为,微服务需要单片不需要的网络交换。但是,如果您有一百万个请求,那么即使您进行了网络交换,该处理也会被微服务所分割,在该微服务中,整体必须支持完整的请求处理,对吗?如果我们进行简单的身份验证,它将使用all块的一部分,而微服务将只提供一部分。那么,当请求量增长时,单片的性能与微服务相比是否降低了这么多?
Emixam23 '18

4
我不太理解该评论,但重点是比较作为一组微服务和同一块中的一组组件实现和部署的相同功能的性能。所有其他条件都相同,在这种情况下,由于存在本地调用而不是微服务所需的远程调用的能力,因此在整体方法中性能(特别是响应时间)往往会更好。
Paulo Merson

1
涉及多个微服务的长呼叫链是要避免的反模式,并且有一些特定的方法可以做到这一点。因此,使用微服务时,响应时间不会变差。只有,您可能会使用更多的硬件来提供相同的负载。但是,额外的硬件成本为您带来了使用独石无法轻松实现的功能(如果您正确执行微服务):更好的横向扩展性能,更高的弹性和可靠性以及更短的发布周期。
user625488

11

@Luxo很特别。我只想稍作改动,并提出其组织观点。微服务不仅允许应用程序解耦,而且还可以在组织级别提供帮助。例如,组织将能够分成多个团队,每个团队都可以在团队可能提供的一组微服务上进行开发。

例如,在像亚马逊这样的大商店里,您可能会有一个个性化团队,电子商务团队,基础设施服务团队等。如果您想使用微服务,亚马逊就是一个很好的例子。杰夫·贝佐斯(Jeff Bezos)规定,如果团队需要访问共享功能,则他们必须与另一团队的服务进行通信。参见此处的简要说明。

此外,来自Etsy和Netflix的工程师在微服务与Twitter上的整体服务时代也进行了一次小型辩论。辩论的技术性稍差一些,但也可以提供一些见解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.