注:所有概念均以电商系统举栗
微服务架构的演进:单体项目 > 分布式架构 > SOA架构 > 微服务架构
1.单体项目
单体项目没啥好说的,所有的功能模块都在一个项目中,(拿电商项目来举例:用户模块,订单模块,积分模块,优惠卷模块)等都是在同一个项目下开发,使用的都是同一个数据库
优点
- 部署方便,将整个系统打包成一个war包部署到服务器即可、容易测试,在本地就可以启动一个完整的系统
- 项目架构简单,开发周期短,小型项目首选
- 开发效率高,服务之间采用本地Service调用
缺点
- 所有的功能和模块都在一个项目下,对于大型项目不利于开发,扩展和维护
- 版本迭代速度变慢,修改一处地方就必须对整一个项目进行重新编译、打包、测试、部署
- 无法按需伸缩,通过集群的方式来实现水平扩展,无法针对于某个业务进行按需伸缩,比如说我需要订单和支付功能提高性能,必须将整个项目一起进行集群化部署
2.分布式架构
概述:针对于单体项目的不足,为了适应大型项目的开发需求,许多公司将单体系统垂直拆分成若干个系统,系统之间通过网络交互来完成业务的处理,每个系统可以分布式部署(单独的部署每一个系统),这种架构称之为分布式架构
特点:垂直的拆分成一个个单体的系统,该架构也称之为垂直架构
优点
- 通过垂直的拆分,每个子系统变成小型的系统,功能简单,前期开发成本低,周期短
- 每个子系统可按需伸缩
- 每个子系统可采用不同的技术,比如说不同的语言,java、php、c语言等
缺点
- 系统与系统之间存在数据冗余,耦合性高,比如说我垂直拆分的系统都需要用到用户信息,那我垂直拆分的模块都需要调用到用户功能的接口,数据库都需要同步用户信息
- 按需伸缩粒度不够(伸缩粒度不够:拆分的粒度不够,就是拆的不够细)。比如说我需要对单独的订单管理模块进行提高性能,那我就必须把这订单模块需要依赖的模块一起提高性能,比如说用户信息是必须要的,也需要一起按需伸缩
3.SOA架构
概述:SOA架构是一种面向微服务架构,基于分布式架构,它将不同的业务功能按服务进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。也就是说这些服务之间需要通讯就是通过协议来连接
特点:
- 基于SOA的架构思想,将重用的公用模块抽取为组件(一个单体项目/服务),以服务的方式向各个系统提供服务
- 各个服务之间采用webservice,RPC等方式进行通信
- ESB企业服务总线作为系统与服务之间通信的桥梁
优点
- 将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。
- 可以针对不同服务的特点按需伸缩。也就是说,哪个模块需要单独的提高性能,就可以对这个模块进行集群化
- 采用ESB减少系统中的接口耦合
缺点
- 系统与服务的界限模糊,会导致抽取的服务的粒度过大(就是说我抽取出来的服务都是所有系统之间公用的,那一部分共用的需不需要抽取出来?抽取的服务比较模糊,系统依赖于服务),系统与服务之间耦合性高
- 虽然使用了ESB,但是服务的接口协议不固定,种类繁多,不利于系统维护
4.微服务架构
概述:基于SOA架构的思想,为了满足移动互联网对大型项目及多客户端的需求,对服务层进行细粒度的拆分,所拆分的每个服务只完成某个特定的业务功能,比如订单服务只实现订单相关的业务,用户服务实现用户管理相关的业务等等,服务的粒度很小,所以称为微服务架构。
特点
- 服务层按业务拆分成一个个的微服务,也就是每一个微服务都是一个小型的系统,单独的系统
- 微服务的职责单一,比如说我这个是订单服务的系统,那我这个服务就只做订单相关的操作
- 微服务之间通信采用Restful风格接口、RPC等轻量级协议传输
- 有利于采用前后端分离架构
优点
- 服务拆分的粒度细,有利于资源的重复利用,提高开发效率。比如说我需要新增一个其他系统,已有的服务可以支撑于这一个新的系统。开发更快
- 可以更加精准的制定每个服务的优化方案,按需伸缩。就是我每个服务都是独立的,哪一个服务需要提高性能我就只需要单独对这个系统进行集群化即可
- 适用于互联网时代,产品迭代周期更短
缺点
- 开发的复杂性增加,因为一个业务流程需要多个微服务通过网络交互来完成
- 微服务过多,服务治理成本高,不利于系统维护
微服务提供各种组件供我们使用,有如下产品
Spring Cloud 下有
- OpenFeign:服务之间通讯,基于HTTP协议用于远程调用
- Api Gateway:服务网关,微服务多个模块之间访问路径可能会变,比如说端口号,无法对外直接提供,就可以使用服务网关
- Spring Security:安全框架,认证授权,Spring家族中的产品,与Spring无缝集成,只需要导入依赖,接口就会被自动保护起来
- Config:配置中心,需要搭配远程仓库一起使用,微服务多个模块之间统一管理配置文件
- Bus、Stream:消息管道,可以无缝集成Kafka,RabbitMQ,能够做到切换中间件只需要切换依赖jar包
- Sleauh:服务追踪,微服务多个模块中可以追踪到哪一个模块的哪一个方法出错了
Spring Cloud NetFix 下有
- Eruake:注册中心,把多个模块的信息注册到注册中心,实现资源的相互调用
- Histrix:容错、服务降级、请求命令、请求合并、请求缓存,异常处理
- Robbin:负载均衡
- Feign:服务之间通讯,远程调用
- Zuul:服务网关
Spring Cloud Alibaba 下有
- Nacos:注册中心、配置中心,自带负载均衡
- Sentinel:流量防卫兵,流量限制,异常请求熔断,慢请求降级等操作
- Seata:分布式事务,四种解决策略:AT、XA、TCC、SAGA
Spring Boot就是微服务,相对于Spring Cloud来说,Spring Boot没有提供这些微服务组件