架构师训练营第 1 期 - 第 10 周学习总结
本周学习了微服务架构,包括微服务介绍、微服务落地、微服务网关技术、领域驱动设计、软件组件设计原则
一、微服务介绍
巨无霸系统带来的问题
编译、部署困难 - 有时候仅仅是改了一行代码,就需要花费很多的时间进行编译、运行,反复尝试,会白白浪费很多时间
代码分支管理困难 - 复用的代码模块由多个团队共同维护和修改,代码merge经常发生冲突,导致解决冲突花费大量时间,又影响网站的发布
数据库连接耗尽 - 因为巨无霸应用经常需要集群发布,每个应用都连接着相同的数据库,这样集群部署的话数据库连接成规模的增加,容易导致数据库连接耗尽
新增业务困难 - 代码耦合严重,模块之间相互依赖,新增业务涉及到改造既有模块,难度可想而知
一般解决方案就是拆分:
纵向拆分 - 将一个大应用拆分成多个小应用,如果是新增业务,就直接独立部署成一个应用
横向拆分 - 将复用的业务拆分出来,部署成微服务,新增业务只需要调用这些微服务即可
微服务框架
企业级分布式服务ESB
服务提供者通过WSDL向注册中心描述服务接口,注册中心使用UDDI发布服务提供者的服务,服务请求者从注册中心获取服务接口信息,通过SOAP协议和服务提供者通信,调用相关服务。但是ESB的缺点也很明显:
臃肿的注册与发现机制
低效的XML序列化
开销相对较高的HTTP远程通信
复杂的部署与维护手段
所以ESB难以满足大型互联网应用高性能、高可用、易部署、易维护的要求。
微服务框架需求
微服务框架除了要满足服务注册与发现,服务调用等功能外,还需要支持:
失效转移 - 微服务需要集群部署,微服务框架可以在集群中实现失效转移,以满足服务的高可用
负载均衡 - 服务请求者可以通过负载均衡技术访问集群部署的服务提供者
高效的远程通信 - 大型互联网应用会有大量的请求,所以高效的远程通信是必然的要求
对应用侵入最少 - 微服务本身需要支持可集中式部署,也可分布式部署
版本管理 - 微服务进行升级的时候,可以兼容老的服务请求,这个支持应该是微服务本身提供的
Service Mesh服务网格
Service Mesh是一个基础设施层,用于处理服务间的通信,通常表现为一组轻量级网络代理,他们与应用程序部署在一起,而对应用程序透明
二、微服务落地
微服务架构落地
需要注意以下几点:
业务先行,技术为业务服务,技术只是手段,先理顺业务边界和依赖
先有独立的模块,后有分布式服务
业务耦合严重、逻辑复杂的系统进行微服务重构要谨慎
要搞清楚实施微服务的目的是什么,业务复用,还是开发边界清晰,还是分布式提升性能?
CQRS
在服务接口层面将查询(读操作)与命令(写操作)隔离,实现服务层的读写分离
更清晰的领域模型
针对读写分别优化,实现更好的性能
查询服务不会修改数据,更好地保护数据
Event Sourcing
将用户请求过程中的每次状态变化都记录成事件,并按照时间顺序保存到持久化存储中
利用事件溯源,可以复现任何用户状态,进行复核审计
利用事件溯源,可以监控任何用户状态变化,并在此基础上实现分布式事务
断路器
当某个服务出现故障、响应延迟或者失败增加,那么继续调用这个服务会导致调用者请求阻塞,资源消耗增加,可以使用断路器阻断故障服务的调用,一般断路器有三种状态:关闭、打开、半开
服务重试与调用超时
上游调用者超时时间要大于下游调用者超时时间之和
三、微服务网关技术
基于网关的微服务架构
一般会有一个API GATEWAY服务,所有前段的请求都会发送到API GATEWAY服务,网关服务负责转发请求到具体的微服务,如果微服务是不同的请求协议,那么网关会负责转换具体的协议并请求不同的微服务。
网关有以下作用:
统一接入,实现高性能、高并发、高可用、负载均衡
安全防护,防刷控制,黑白名单控制
流量监控与容错,可以实现限流、降级、熔断
协议适配,可以适配不同的协议,包括http、dubbo、grpc、hessian
网关微服务本身也是一个服务消费者,会注册到服务注册中心,调用服务提供者的服务
网关本身没有什么业务,主要职责是做各种校验和拦截,通过管道技术也就是责任链模式将这些职责链接起来
四、领域驱动设计
贫血模型 VS 充血模型
在事务脚本中,service、dao等对象只有方法,没有变量,所以事务脚本也叫贫血模型
领域模型是合并了行为和数据的领域对象模型。通过领域模型对象的交互完成业务逻辑,设计好了领域模型对象,就设计好了业务逻辑实现。领域模型也叫充血模型
DDD战略设计
领域驱动设计就是从领域出发,分析领域内模型及其关系,进而设计软件系统的方法。
领域
领域是一个组织所做的事情以及包含的一切
子域
把整个领域拆分多个子域进行设计。比如电商下面的子域就有用户、商品、订单、库存、物流、发票等。
限界上下文
限界上下文是指在领域边界中,任何领域对象都只表示特定于该边界内部的确切含义。限界上下文和子域具有一对一的关系,用来控制子域的边界,保证子域内的概念统一性。
上下文映射图
不同的限界上下文,会有各种交互。DDD使用上下文映射图来设计关联和交互。
DDD战术设计
实体
领域模型对象也称做实体,每个实体都是唯一的,具有一个唯一标识。实体设计是DDD的核心所在,首先通过业务分析,识别出实体对象,然后通过相关的业务逻辑设计实体的属性和方法。
值对象
并不是领域内的对象都应该设计为实体,DDD推荐尽可能的使用值对象。值对象的一个特点就是不变性,一个值对象创建以后就不能再改变了。
聚合
聚合是一个关联对象的集合,每个集合都有一个根和一个边界。边界定义了聚合内部的内容,根是聚合中包含的单个特定实体。
DDD战略设计有领域、子域、限界上下文、上下文映射图,DDD战术设计有实体、值对象、聚合、CQRS、Event Sourcing。通过战略设计,划分模块和服务的边界以及依赖关系,是微服务架构的关键。
五、软件组件设计原则
组件内聚原则
组件内聚原则讲的是哪些类应该聚合在同一个组件中,以便组件能提供相对完整的功能,而又不过于臃肿
复用发布等同原则
共同封闭原则
共同复用原则
组件耦合原则
组件耦合原则讲的是组件之间的耦合关系应该如何设计
无循环依赖原则
稳定依赖原则
稳定抽象原则
评论