随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此在不断的更新。从单一应用,到垂直拆分,到分布式服务,到SOA,以及现在火热的微服务架构,还有在Google 带领下来势汹涌的Service Mesh。我们到底是该乘坐微服务的船只驶向远方,还是偏安逸得过且过?
其实生活不止眼前的苟且,还有诗和远方。所以我们今天就回顾历史,看一看系统架构演变的历程;把握现在,学习最火的技术架构;展望未来,争取成为一名优秀的Java工程师。
1.1.1 集中式架构在软件设计中,经常使用的经典的 3 层模型,即表示层、业务逻辑层和数据访问层。
表示层:通常是网页、UI等主要用于和用户交互,也称为交互层。
业务逻辑层:主要是用于处理业务逻辑,例如登录的时候根据用户输入的信息经过业务逻辑层的处理之后才能展现给用户。
数据访问层:用于操作数据库,用户在表示层会产生大量的数据,通过数据访问层对数据库进行读写操作。
虽然在软件设计中划分了经典的 3 层模型,但是对业务场景没有划分。一个典型的单体应用就是将所有的业务场景的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。
简单来说集中式架构就是一个应用把所有功能都部署在一起。以网上商城为例,如图1-1所示。
图1-1 集中式架构图
优点:
- 系统开发速度快
- 易于测试、部署
- 适用于并发要求较低的系统
缺点:
- 代码耦合度高(你调用我,我调用你),后期维护困难
- 扩展能力受限
- 单点容错率低,并发能力差
很多传统的互联网公司或者创业型公司早期都会使用这样的架构,因为这样的架构足够简单并且能够快速开发和上线。
1.1.2 垂直架构当访问量逐渐增大,单一应用无法满足需求,此时为了应对更高的并发和业务需求,我们根据业务功能对系统进行拆分。这种架构就是垂直架构,相比于集中式架构,垂直架构将应用分解成了多个小模块,它们相互独立,互不影响。如图1-2所示。
图1-2 垂直架构图
优点:
- 可以把单台机器变成多台机器的集群,解决了并发问题
- 可以针对不同模块进行优化
- 方便扩展,容错率提高
- 系统间相互独立,减少业务的耦合度
缺点:
- 服务之间相互调用,如果某个服务的端口或者ip地址发生改变,系统调用需要手动更改
- 搭建集群之后,实现负载均衡比较复杂
当服务器的负载越来越高,场景越来越复杂集中式架构不能满足我们需求的时候可以选择垂直架构
1.1.3 分布式架构当垂直应用越来越多,应用之间交互不可避免,这时候我们就需要将核心的业务提取出来作为独立的服务,并逐渐使其形成稳定的服务中心,从而使前端应用能够更快的响市场的需求。如图1-3所示。
图1-3 分布式架构图
优点:
- 将基础服务进行了抽取,系统间相互调用,提高了代码复用和开发效率
缺点:
- 系统间耦合度变高,调用关系错综复杂,难以维护
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。SOA结构如图1-4所示。
图1-4 SOA结构图
优点:
- 简化系统的开发
- 有更好的适应性和扩展性
- 简化了提供,寻找和使用服务的过程
- 通过共同资源的利用,减少了开支缺点:
- 降低了系统的性能
- 存在太多没有意义的文件信息
- 运维、测试部署困难
SOA结构可以在最大程度上避免共享业务的重复建设,资源连接瓶颈等问题。那么被拆分出来的服务是否也需要以业务功能为维度来进行拆分和独立部署,以降低业务的耦合以及提高容错性能呢?
微服务架构就是这样一种解决方案,从名字上来看,微服务就是针对可重用业务服务的更进一步优化,比如用户服务拆分的更细,如用户注册服务,用户鉴权服务等。
图1.1.5
优点:
- 复杂度可控:因为体积小,复杂度低,开发,维护会更加简单。
- 技术选型更灵活: 因为每一个微服务属于独立的项目,所以可以结合业务特性选择相应的技术栈。
- 独立部署: 由于每个微服务都是一个独立运行的进程,所以可以实现独立部署。
缺点:
- 微服务架构整个应用分散成多个服务,定位故障点非常困难。
- 稳定性下降。服务数量变多导致其中一个服务出现故障的概率增大,并且一个服务故障可能导致整个系统挂掉。事实上,在大访问量的生产场景下,故障总是会出现的。
- 服务数量非常多,部署、管理的工作量很大。
- 开发方面:如何保证各个服务在持续开发的情况下仍然保持协同合作。
- 测试方面:服务拆分后,几乎所有功能都会涉及多个服务。原本单个程序的测试变为服务间调用的测试。测试变得更加复杂。
- 这么多小服务,如何管理他们?
- 这么多小服务,他们之间如何通讯?
- 这么多小服务,客户端怎么访问他们?
- 这么多小服务,一旦出现问题了,应该如何自处理?
- 这么多小服务,一旦出现问题了,应该如何排错?
上面提到的微服务的跳转,为了解决这些问题就必须引入更多的技术,进而使得微服务架构的实现变得非常复杂。
图1.2.2
1.2.3 微服务架构下的技术挑战微服务架构主要的目的是实现业务服务的解耦。随着公司业务的高速发展,微服务组件会越来越多,导致服务与服务之间的调用关系越来越复杂。同时,服务与服务之间的远程通信也会因为网络通信问题的存在变得更加复杂,比如需要考虑重试,容错,降级等情况。那么这个时候就需要进行服务治理,将服务之间的依赖转化为服务对服务中心的依赖。除此之外,还需要考虑:
- 分布式配置中心
- 服务路由
- 负载均衡
- 熔断限流
- 链路监控
这些都需要对应的技术来实现,我们是自己研发还是选择市场上比较成熟的技术拿来就用呢?如果市场上有多种相同的解决方案,应该如何做好技术选型?以及每个技术解决方案中的底层实现原理是什么?
1.3 微服务架构的常见解决方案1.3.1 ServiceComb
图1.3.1
Apache ServiceComb,前身为华为云的微服务引擎CSE(Cloud Service Engine)云服务,是全球首个Apache微服务顶级项目。它提供了一站式微服务开源解决方案,致力于帮助企业、用户和开发者将企业应用轻松微服务上云,并实现对微服务应用的高效运维管理。
1.3.2 SpringCloud
图1.3.2
SpringCloud是一系列框架的集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot开发风格一键启动和部署。
SpringCloud并没有重复造轮子它只是将目前各家公司开发的比较熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.3.3 SpringCloud Alibaba
图1.3.3
SpringCloud Alibaba致力于微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用。
依托SpringCloud Alibaba,只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统.
1.4 Spring Cloud Alibaba1.4.1 组件介绍Spring Cloud Alibaba 是阿里巴巴集团下开源组件和云产品在Spring Cloud 规范下的实现。2018年10月31日,Spring Cloud Alibaba 正式入驻Spring Cloud 官方孵化器,并发布了第一个预览版本。2019年8月1日在Alibaba仓库发布第一个毕业版本。
Spring Cloud Alibaba主要为微服务开发提供一站式的解决方案,使开发者通过Spring Cloud 编程模型轻松地解决微服务架构下的各类技术问题。以下是Spring Cloud Alibaba生态下的主要功能组件,这些组件包含开源组件和阿里云产品组件,云产品是需要付费使用的。
- Sentinel: 流量控制和服务降级。
- Nacos: 服务注册与发现。
- Nacos: 分布式配置中心。
- RocketMQ: 消息驱动。
- Seata: 分布式事务。
- Dubbo: RPC通信。
- OSS: 阿里云对象存储。
它的优势有很多,简单整理了如下两点:
- Alibaba的开源组件在没有织入Spring Cloud生态之前,已经在各大公司广泛应用,所以集成到Spring Cloud 生态使得开发者能够很轻松地实现技术整合及迁移。
- Alibaba的开源组件在服务治理上和处理高并发的能力上有天然的优势,毕竟这些组件都经过数次双11的考验,也在各大互联网公司大规模应用过。