01前言
随着技术日新月异的发展,最近几年微服务和分布式技术成为主流。每一个好的解决方案不一定是直接设计出来的,但每一个优秀的架构都必须承受得住业务的考验和需求驱动的积累。最初我们开发系统都是在单个的应用上进行开发、测试、部署和运维等。每次新的需求迭代都将可能涉及到整个系统的修改,尤其是庞大而臃肿的业务系统需要进行大量的数据增删改查操作,开发起来变得非常麻烦。为了应对更高的并发和业务需求,解决单个应用的缺点,把庞大复杂的单体应用按照业务拆分成多个子业务模块,可进行垂直拆分或水平拆分,从而达到更高效的开发、更好的管理和维护的目的,这就是所谓的分布式系统。
02单体架构
2.1 定义
一个归档包(可以是JAR、WAR、EAR或其它归档格式)包含所有功能的应用程序,通常称为单体应用。而架构单体应用的方法论,就是单体应用架构。
2.2 单体应用举例
单体应用集成了前端页面和后端接口服务及业务逻辑和数据操作于一体的单个完整系统,Struts1、Struts2及SSH、SSM架构的系统等,单个应用囊括了所有业务模块。
2.3 单体架构示意图
2.4 单体应用优缺点
2.4.1 优点
- 易于集中式开发、测试、管理、部署。
- 无需考虑跨语言。
- 能避免功能重复开发(相对分布式)。
2.4.2 缺点
- 团队合作困难
- 代码的维护、重构、部署都比较难。
- 稳定性、可用性(停机维护)、扩展性不高。
当用户规模越来越大时,单体应用可以通过集群来应对。如通过DNS、Nginx或硬件F5分配集群中的服务器来提供服务。它的缺点(开发效率低、可维护差稳定性查)导致需要对单体应用进行拆分,垂直拆分或水平拆分。
03分布式架构
3.1 微服务定义
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。
3.2 微服务举例
市面上目前典型主流的微服务架构有SpringBoot、SpringCloud、Dubbo,微服务兴起的时代,除了官方几个代表的框架外,各大厂商也开始了各自开源的分布式框架。除了上面说的Dubbo外,还有腾讯的Tars,京东的JSF,新浪的Motan等。
3.3 示意图
3.4 优缺点
3.4.1 优点
- 每个业务模块独立开发、测试、部署和管理。
- 每个业务模块之间相互的影响小,按需分配资源。
- 所有业务模块既是独立,又组成一个完整整体。
- 可通过配置进行上游调用的升级或降级。
- 支持高并发、高扩展、高可用等大型系统。
3.4.2 缺点
- 资源耗用相对单体应用增大,每个业务模块需单独部署。
- 分布式数据一致性问题(CAP)。
- 系统维护成本加大,需要更多的人工介入。
- 业务间耦合度变高,调用关系错综复杂。
尽管分布式微服务给开发人员带来极大的使用便利性和系统性能上的优越性。但也暴露了分布式难以解决的一些问题,著名的CAP理论就是其中的一个典型。不过整体来说还是利大于弊,选择分布式微服务架构是未来的趋势,也是淘汰旧技术的必经之路。
04总结
从单体架构到分布式微服务架构,我们可以把单体应用简单分为水平拆分或垂直拆分两种方式。如一个电商系统,包含:商品模块、会员模块、物流模块、支付模块、订单模块几个核心模块。水平拆分,单体应用把所有这些模块集中在一个电商系统里面,水平拆分后分为:商品系统、会员系统、物流系统、支付系统、订单系统。垂直拆分,会员系统可按会员等级分为:普通用户、VIP用户、超级VIP用户等。