微服务通常由单体系统演化而来,将系统解耦到某种随时可以转变为微服务的状态,并维持一段事件,与业务需求无关的决策,包括何种框架,数据库等,都可以被适当推迟。
什么是微服务
小而自治的服务,面向服务架构SOA的一种延申,具有松耦合,高内聚的特点。
微服务有哪些优点?
- 技术异构
- 康威定律,适应敏捷开发
- 易发布,易扩展
- 整体可靠,隔离错误,易重构
- 局部扩容
微服务有哪些缺点?
- 分布式事务
- 运维要求高
- 架构复杂度提升
如何拆分微服务
围绕业务能力构建,微服务的大小、边界不应该只有唯一正确的答案或绝对的标准,应该根据业务和团队的实际情况来灵活划定微服务的具体粒度。
什么是DDD?
DDD (domain-driven design) 领域驱动设计。一种设计方法论。
服务如何通信
服务间通常使用共享数据库,Restful API或者基于事件消息进行通信。
什么是RPC,REST,gRPC?
RPC (Remote Procedure Call) 远程过程调用,是一种通信协议,主要解决三个问题:如何表示数据,如何传递数据,如何表示方法。
REST (Representational State Transfer) 表现层状态转换, 一种结构设计风格,基于HTTP协议提供的方法,用URL来标识资源,核心思想是面向资源,自定义方法可以放在资源路径末尾。POST /user/user_id/cart/book_id/undelete
gRPC (gRPC Remote Procedure Calls) Google发起的一个开源远程过程调用系统。该系统基于 HTTP/2 协议传输,使用Protocol Buffers 作为接口描述语言。
什么是JSON,XML,Protocol Buffers,Avro?
程序中通常有2中数据表现形式,一种是在内存中,对象,结构体,数组,哈希表等,另一种是将数据写入文件或者网络发送时,将其编码为字节序列(如JSON)。
JSON相对于XML更加简洁,Web默认支持,所以更为流行。Protocol Buffers,Avro 则是一些更为紧凑的二进制编码。
什么是服务发现?
基于微服务的灵活性,实例位置经常变更,服务发现维护一份服务注册表,包含实例网络位置信息。
什么是消息代理?
消除耦合,将领域事件发布至消息代理,消费方订阅异步处理。
什么是发件箱模式(OutBox)?
微服务可能需要执行“插入业务数据”和“发送事件”两个步骤,由于操作两个系统,很难保证原子性,发件箱模式在插入业务数据之后,再插入一张“待发送事件”表,定时任务去抓取数据,抛出事件,成功的消息删除或者打标记。
微服务事务
首先,CAP理论已证明,一致性,可用性和容错性并不能同时满足,倾向于放弃强一致性需求,综合性能和代码复杂度,几种方法,比较推荐基于事件队列的最终一致性。
什么是事务?
不可分割的工作单元,具有ACID属性。
微服务如何保证事务?
- 分布式事务,XA新增事务协调器,采用2段提交。
- TCC try, confirm, cancel.
- saga,一种微服务架构中维护数据一致性的机制,每一个saga由一系列本地事务组成,使用补偿事务回滚操作。分协调模式,编排模式2种模式。缺乏ACID中的I,隔离性,带来一些问题,比如脏读。
- 事件队列,或outbox模式,基于事件消息,追求最终一致性。
查询数据
当数据分布于多个服务,查询时需要一层查询组合器,如 BFF, Gateway,稍复杂的查询会变得低效,甚至无法实现。则需要另一种解决方案CQRS。
什么是BFF?
Backend For Frontend, 服务于前端的后端,从多个服务中获取数据并组装返回给前端。
什么是CQRS?
Command Query Responsibility Segregation.命令查询职责分离,读和写数据模型分离,读服务订阅写服务事件,实现读服务数据更新。
什么是API Gateway?
外部API客户端进入基于微服务应用的入口,负责请求路由,组合数据,还有身份验证,授权,缓存,日志等边缘职责。
自动化测试
自动化测试是快速、安全交付软件的基石,根据测试范围分为单元测试,集成测试,组件测试和端到端测试。
什么是单元测试?
验证单元(通常为一个类)是否正常工作,是面向技术的测试,方便重构。
什么是集成测试?
验证服务是否可以与其他服务正确交互,可以测试服务的适配器或者使用契约。
什么是组件测试?
将服务视为黑盒,单独测试服务本身,使用桩服务代替依赖项。
什么是端到端测试?
验证整个应用程序,缓慢、脆弱、耗时,应控制该测试数量,值测试少量核心场景。
什么是TDD?
测试驱动开发,先编写测试,然后编写新功能以使其测试通过。
什么是测试替身?
Test Double, 一个对象(stub/mock),负责模拟依赖项的行为。
部署
传统方法部署发布包格式,技术异构部署复杂,现代化方法一般将服务部署为容器,封装技术栈,彼此隔离,并且资源受控。
什么是CI/CD?
CI(continuous Integration)持续集成,代码提交会触发构建,以验证代码是否通过编译及相关测试,然后合并。
CD(continuous delivery)持续交付/部署。
什么是DevOps?
DevOps是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。
什么是Docker?
容器是一种轻量级的容器框架,是操作系统层虚拟化,共享内核。
容器镜像由应用程序和运行依赖组成,由服务代码和镜像描述Dockerfile来构建,通过镜像可创建一个或多个容器。
Docker Compose允许用YAML文件以声明的方式定义一组容器。
什么是Kubernetes?
简称K8s, Docker编排框架,将一组计算机资源转变为运行服务的资源池,维持服务的数量,保证服务的在线。
主要有三个功能:资源管理,调度,服务管理。集群分主节点和工作节点。
Pod是K8s的部署单元。
什么是可观测的服务?
使服务更易于理解和排除故障。
- 健康检查API, /healthCheck
- 日志聚合,ELK
- 分布式跟踪,外部请求分配唯一ID
- 异常跟踪,服务把异常报告给中央服务,通知用户。
- 应用程序指标
- 审核日志记录
什么是ELK?
面向文本搜索的NoSQL数据库Elasticsearch, 聚合服务日志工具Logdash, 可视化工具Kibana。
什么是服务网格?
使用边车代理模式的虚拟化的基础设施,如Istio。
引用
- 《Microservices Patterns:With Examples in Java - Chris Richardson》
- 《Data Structures and Algorithm Analysis in Java Third Edition - MarkAllenWeiss》
- 《Clean Architecture - Robert C. Martin》
- 《凤凰架构 - 周志明》