单体架构与微服务架构

【单体架构】

1. 什么是单体架构

一个归档包(例如war格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的方法论,我们称之为单体应用架构。

2. 单体架构示例图

3. 单体架构的缺陷

- 复杂性高。整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐……整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。

- 技术债务。随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。

- 部署频率低。随着代码的增加,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响范围大、风险高,这使得单体应用项目上线部署的频率较低,从而又导致两次发布之间会有大量功能变更和缺陷修复,出错概率较高。

- 扩展能力受限。单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。

- 阻碍技术创新。单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和架构,想要引入新的框架或技术平台非常困难。

由于单体架构的缺陷日益明显,所以越来越多的公司采用微服务架构范式解决上面提到的单体架构中的问题。

不同于构建单一、庞大的应用,微服务架构将应用拆分为一套小且互相关联的服务。

【微服务架构】

1. 什么是微服务架构

简而言之,微服务架构风格的开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API轻量的机制来相互通信。

这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

2. 微服务架构示例图

3. 微服务架构的特性

- 每个微服务可独立运行在自己的进程里;

- 一系列独立运行的微服务共同构建起整个系统;

- 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,如订单管理、用户管理等;

- 微服务之间通过一些轻量的通信机制进行通信,如REST API进行调用;

- 可以使用不同的语言与存储技术;

- 全自动的部署机制;

4. 微服务架构的优势

- 易于开发和维护。一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对比较简单,整个应用是由若干个微服务构建而成,所以整个应用也会维持在可控状态;

- 单个微服务启动较快。单个微服务代码量较少,所以启动会比较快;

- 局部修改容易部署。单体应用只要有修改,就要重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可;

- 技术栈不受限。在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈;

5. 微服务架构的挑战

- 运维要求较高。更多的服务意味着更多的运维投入。在单体架构中只需要保证一个应用的正常运行;而在微服务中,需要保证几十甚至几百个服务的正常运行与协作,带来了巨大的挑战;

- 分布式固有的复杂性。使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都带来了巨大的挑战;

- 接口调整成本高。微服务之间通过接口进行通信。如果修改某个微服务的API,可能所有使用了该接口的微服务都需要做调整;

- 重复劳动。很多服务可能都会使用到相同的功能。而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,导致代码重复。

【总结】

构建复杂的应用的确非常困难。单体式的架构更适合轻量级的简单应用。如果你用它来开发复杂应用,那真的会很糟糕。微服务架构模式可以用来构建复杂应用,当然,这种架构模型也有自己的缺点和挑战。

原文发布于微信公众号 - JAVA高级架构(gaojijiagou)

原文发表时间:2018-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BeJavaGod

分布式系统的那些事儿(七) - 微服务架构体系

微服务的出现,标志了又一个新的里程碑,似乎你不知道微服务就代表你好像out了一样。微服务是业务服务化,将SOA更好的延续了下去。配合restful也能够更好的提...

35220
来自专栏平凡文摘

阿里,百度,腾讯一线互联网公司中,Java开发的招聘标准(文末福利)!

21360
来自专栏大数据文摘

资源 | 被GitHub和微软伤了心?这有9个开源代码版本控制系统

事实上,当前有很多GitHub的替代解决方案,能为你做分布式版本控制(DVCS)。下面就来看看有哪些替代工具。

13330
来自专栏程序你好

微服务体系架构的10个最佳实践

切换到微服务体系结构将解决所有软件体系结构问题,对吧?好吧,它不会。但微服务的实施确实也有很大的价值。

18130
来自专栏灯塔大数据

盘点|Java程序员在用的大数据工具

据日前的一则大数据工具使用情况调查,我们知道了Java程序猿最喜欢用的大数据工具。 问题:他们最近一年最喜欢用什么工具或者是框架? 受访者可以选择列表中的选项...

42170
来自专栏用户2442861的专栏

我决定把 Expper 文章收藏和分享网站的源码开源了

网站地址:https://www.expper.com Github 地址:https://github.com/Raysmond/expper

37010
来自专栏CSDN技术头条

架构物联网:一种新的解决方案

本文将通过对几个项目的介绍,让读者完全了解并掌握如何架构物联网。 几周前我们在捷克的Linux大会“OpenAlt”上提出了这样的观点:物联网(IoT)是基于微...

35690
来自专栏逸鹏说道

ENode简介与各种教学视频资源汇总

ENode是什么 ENode是一个.NET平台开源的应用开发框架,为开发人员提供了一套完整的基于DDD+CQRS+ES+(in-memory)+EDA架构风格的...

469100
来自专栏BestSDK

谷歌版“小程序”上线,增加“立即试用”功能

今年1月份,Google在 I/O 开发者大会上正式宣布了Instant Apps。在这大半年里,Google 拉上了众多开发者共同改善 Instant App...

42080
来自专栏EAWorld

微服务模式系列之一:整体式架构

译者自序: 熟悉我的朋友都知道,我很不喜欢翻译东西,因为在两种语言的思维方式之间做频繁切换对我来说是件很痛苦的事情。但是这次不一样,公司和同事的大力支持降低了我...

30780

扫码关注云+社区

领取腾讯云代金券