1、系统架构的发展
1.1、单体应用阶段
在互联网发展的初期,用户数量少,一般网站的流量也很少,但硬件成本较高。很多企业会将所有的功能都集成在一起开发一个单体应用,然后将单体应用部署到一台服务器上.一个简单的单本应用如图:
虽然应用是最初的架构,但是目前它并没有消失,还在不停的发展和演进,依然拥有巨大的市场。例如:采用MVC、MVP、MVVM开发的单体应用程序依然火爆,仍能够满足实际业务需求.
1.1.1 单体应用的优点
- 易于集中式开发、测试、管理和部署
- 无须考虑跨语言
- 能够避免功能重复开发
1.1.2 单体应用的缺点
- 团队合作困难
- 代码的维护、重构、部署都比较难
- 稳定性、可用性(停机维护)、扩展性不高
- 需要绑定某种特定的开发语言
1.2 垂直应用阶段
为了应对更高的并发、业务需求和解决单体应用的缺点,需要根据业务功能对单体应用的架构方法进行演进,如图:
- 拆分后的系统可以解决高并发、资源按需分配的问题
- 可以针对不同的模块进行优化和资源分配
拆分应有两种方式:水平拆分和垂直拆分
1.2.1 水平拆分
水平拆分是指根据业务来拆分应用.例如,原应用中包含订单、会员两个部分,拆分后可以将其拆分成订单系统和会员系统
其优点是:拆分后保证业务之间的相互影响较小,能合理地分配硬件资源(不同的业务对浏览和性能的要求是不一样的).但是这样可能会导致整个系统存在"重复造轮子"的问题,而且难于维护
1.2.2 垂直拆分
垂直拆分是根据调用方法对系统进行拆分.比如,会员系统可以垂直拆分为普通用户和企业用户
其优点是:能按需分配资源和流量,各个垂直调用之间互不影响;但是同样是"重复造轮子"
1.3 分布式系统阶段
在分布式系统中,各个小系统之间的交互是不可避免的,此时可将核心业务作为独立的服务抽取出来,
逐渐形成稳定的基础服务,如图:
其优点是:对基础服务进行了抽取,服务之间可以相互调用,提高了代码的复用和开发效率
其缺点是:业务间耦合度变高;调用关系错综复杂;系统难以维护;在搭建集群后,很难实现负载均衡
1.4 服务治理阶段
在服务治理(SOA)架构中,需要一个企业服务总线(ESB)将基于不同无图协议的服务节点连接起来,它的工作是转换、解释消息和路由。服务治理架构如图:
SOA解决了以下问题:
- 服务间的通信问题:引入了ESB、技术规范、服务管理规范,从而解决了不同服务间的通信问题
- 基础服务的梳理问题:以ESB为中心梳理和规整分布式服务
- 业务的服务化问题:以业务为驱动,将业务单元封装到服务中
- 服务的可复用性问题:将业务功能设计为通用的业务服务,以实现业务逻辑的复用
随着业务复杂性、需求多变性和用户规模的不断增长,敏捷开发和DevOps(一种过程、方法的统称,用于促进开发、运维和质量保证部门之间的沟通、合作和整合)变得特别重要。
1.5 微服务阶段
微服务(Microservices)架构是指:将系统的业务功能划分为极小的独立微服务,每个微服务只关注于完成某个小的任务。系统中的单个微服务可以被独立部署和扩展,且各个微服务之间高内聚、松耦合的。微服务之间采用轻量化通信机制暴露接口来实现通信。
微服务系统架构如图:
1.6 服务网络阶段
服务网格(Service Mesh)独立于服务之外运行,是服务间通信的基础设施层。服务网络类似于在每个服务上粘贴的功能模块。如图:
服务之间通过Sidercar(边车)进行通信,所有Sidercar和网络连接就形成了Service Mesh。
组件说明:
- SiderCar主要负责服务发现和容错处理
- 数据平台: 处理服务间通信,并实现服务发现、负载均衡、流量管理、健康检查等
- 控制平台: 管理并配置Sidercar,以执行策略和收集数据
2、主流的微服务框架
2.1 Dubbo
2.1.1 Dubbo概述
Dubbo致力于提供高性能和透明化的远程服务调用方案和SOA服务治理方案。Dubbo也是采用了Spring的配置方式,对应用没用API没有侵入。
2.1.2 Dubbo的核心功能
- 面向接口的高性能RPC调用
- 智能负载均衡
- 服务的自动注册与发现
- 高度的可扩展
- 运行期流量调度
- 可视化的服务治理与运维
2.2 Spring Cloud
2.2.1 Spring Cloud概述
Spring Cloud是基于Spring boot的一个快速开发微服务的框架。它提供了开发微服务所需的一些常见组件。
- 服务发现(Spring Cloud通过DiscoveryClient接口实现类,让服务中心发现服务)
- 断路器(底层服务出现故障可能导致用户级联故障,Spring Cloud 采用断路器机制解决问题。电路关闭,不进行通信,电路打开进行通信)
- 智能路由(路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务)
- 微代理(统一代理控制请求入口,弱化各个微服务被客户端记忆功能)
- 控制总线(利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化)
- 一次性令牌(使用一次就失效)
- 全局锁(在并发时全局锁定资源)
- 领导选举(基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举的抽象和实现)
- 配置管理(Spring Cloud 利用配置中心统一管理配置)
- 分布式会话(Springcloud微服务项目中,使用redis实现简单高效的session共享)
- 集群状态(集群的健康状态)
Spring Clou使得构建大型系统变得非常容易和低成本。小型项目可以采用SpringBoot进行架构,当需要升级到微服务架构时,可以使用Spring Cloud方便地对其进行升级。
2.2.2 Spring Cloud核心功能
- 分布式、版本化配置
- 服务注册与发现
- 路由
- 负载均衡
- 断路器
- 分布式消息传递
3、服务网络(Service Mesh)框架lstio
3.1 lstio概述
lstio将流量管理添加到微服务中,提供了连接、安全、管理和监控微服务的方案。
3.2 lstio 核心功能
- 流量管理
- 安全
- 监控功能
- 平台无关性
4、比较Dubbo、Spring Cloud和lstio
对比项 | Dubbo | Spring Cloud | lstio |
---|---|---|---|
学习曲线 | 一般 | 平滑,有大量成熟的实例 | 资料较少 |
开发效率 | 低 | 高 | 高 |
集成性 | Jar包依赖的问题多 | 基于Spring Boot,更加便于业务落地 | 目前只在Kubernets上支持比较好 |
文档 | 齐全 | 英文文档齐全 | 齐全 |
支持言语 | Java、Node.js等 | Java、Kotlin、Groovy | 与语言无关 |
开源社区 | 活跃度低 | 活跃度高 | 活跃度高 |
客户端负载均衡 | 无 | Ribbon | Envoy |
批量任务 | 无 | Spring Bathc | 无 |
总结:
Spring Cloud 是Spring家庭产品,一直保持着更新和完善。Spring Cloud的一站式解决方案对于资金和技术实力有限的中小型互联网公司来说是极佳的选择。Spring Cloud 在现阶段或未来较长时间内是最为稳妥的微服务框架。