基于微服务或单体

Posted

技术标签:

【中文标题】基于微服务或单体【英文标题】:Microservice based or Monolithic 【发布时间】:2016-06-25 02:33:18 【问题描述】:

我阅读了很多关于微服务及其结构的信息,似乎在可维护性方面有很多优势。

我想用 Spring Boot 和 Phonegap 构建一个移动应用程序,它从 RESTful Web 服务中提取新闻。

所以我正在考虑将其构建为微服务,这样我就可以在不重建整个应用程序的情况下添加其他服务。因为将来我可能想添加其他服务。

但是为这么小的移动应用程序构建一个基于微服务的应用程序真的值得吗?

【问题讨论】:

【参考方案1】:

对于您的项目,微服务架构似乎有点过头了。微服务确实有很多好处,但它们确实有很多操作开销,并且在分布式服务方面增加了很多复杂性。

听起来你也只有一个主要要求就是拉新闻,在这种情况下,所有与新闻相关的服务无论如何都将成为一个微服务的一部分。

一旦您开始添加更多不同的需求域,您就可以考虑将它们构建为单独的微服务。即使这样,将功能模块化到同一服务中的组件中也是谨慎的做法,并且随着您的应用程序和系统开始增长,将功能拆分为单独的微服务。

【讨论】:

我同意你的观点,该应用程序非常小,只有一个新闻服务。但是将来我想添加其他东西,比如管理员可以发布博客的 CMS 服务等等,这就是为什么我不了解结构的原因。但是你的回答已经很有帮助了。谢谢。 没问题。即使您计划稍后添加 CMS,也没有什么可以阻止您在该阶段将 CMS 构建为单独的服务。如果您这样做,您最大的担忧很可能是安全性和能够访问多个服务,在这种情况下,为您的 REST 服务身份验证预先考虑基于令牌的方法将有很长的路要走。我建议在这个阶段拿出一些东西,非常注意代码中的模块化,并根据每个新需求(例如 CMS)评估你的系统和需求。【参考方案2】:

有一个很好的article by Fowler,他在其中提出许多以基于微服务的设计开始的项目很快就会遇到问题。相反,许多成功的基于微服务的应用程序都是从单体应用开始的。

总结一下这个原则:

...你不应该用微服务开始一个新项目,即使 您确定您的应用程序足够大,值得使用。

虽然 Fowler 没有就此发表个人意见,但他确实推测了他所谓的 Monlith-First 的好处。

...单体优先策略,您应该在其中构建新应用程序 最初作为一个整体,即使你认为它很可能会 稍后从微服务架构中受益......可能很难扩展 设计不佳但成功的软件系统,但这仍然是一个 比它的倒数更好的地方...您需要优先考虑速度...

因此,Monlith-First 方法的好处是您可以快速构建一个整体,因为通常需求是众所周知的并且相对较少。此外,您可以快速将产品推向市场,以便了解您的应用程序以及它在现实世界中的行为方式。

让我印象深刻的主要好处是,您将更清楚地了解您所支持的业务功能之间的界限自然落在您的应用程序中的哪个位置,而不是您尝试预先定义这些界限(这是必要且非常重要的)基于微服务的设计中的设计步骤)。

他继续详细介绍了如何有效地规划单体优先设计,这主要涉及保持代码美观和模块化,并着眼于未来需要的模块拆分。

...仔细设计一个整体,注意内部的模块化 软件,包括 API 边界和数据的存储方式。

根据我的经验,基于服务的方法非常适合与业务领域专家一起花费大量前期分析时间,以及一个成熟的交付团队,他们通常能够轻松地使用 soa 和基于服务的工作。

【讨论】:

好的,现在我看到了从头开始的微服务应用程序的问题,首先从单体应用程序开始的争论很少。感谢您的有用回答。 @julien - 之前有人问过这个问题:看看***.com/q/33041733/569662【参考方案3】:

创建一个微服务在未来肯定会对你有所帮助,原因如下:

    可扩展性: 微服务可以独立扩展,而不会干扰应用程序中使用的其他微服务。

    敏捷: 微服务的变化可以非常迅速,从而适应快速变化的业务场景。

    容错: 即使一个微服务发生故障,其他微服务也可以继续提供服务,从而最大限度地减少对整个应用程序的影响

    多语言持久性: 每个微服务都可以决定自己的数据库机制类型。

我已经部分介绍了微服务的优点,还有更多。

因此,如果您查看以上所有要点,绝对值得创建微服务应用程序

【讨论】:

以上是关于基于微服务或单体的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构学习与思考(12):从单体架构到微服务架构的演进历程

SkyWalking java单体和dubbo微服务请求链路跟踪,SkyWalking钉钉告警

微服务实践:从单体式架构迁移到微服务架构

如何将单体应用改造为微服务

024.微服务之服务注册与发现(基于kubernetes / SpringCloud)

微服务世纪难题:如何拆分单体?