什么是微服务

微服务通常由单体系统演化而来,将系统解耦到某种随时可以转变为微服务的状态,并维持一段事件,与业务需求无关的决策,包括何种框架,数据库等,都可以被适当推迟。

MonolithFirst - Martin Fowler

什么是微服务

小而自治的服务,面向服务架构SOA的一种延申,具有松耦合,高内聚的特点。

微服务有哪些优点?

  1. 技术异构
  2. 康威定律,适应敏捷开发
  3. 易发布,易扩展
  4. 整体可靠,隔离错误,易重构
  5. 局部扩容

微服务有哪些缺点?

  1. 分布式事务
  2. 运维要求高
  3. 架构复杂度提升

如何拆分微服务

围绕业务能力构建,微服务的大小、边界不应该只有唯一正确的答案或绝对的标准,应该根据业务和团队的实际情况来灵活划定微服务的具体粒度。

什么是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属性。

微服务如何保证事务?

  1. 分布式事务,XA新增事务协调器,采用2段提交。
  2. TCC try, confirm, cancel.
  3. saga,一种微服务架构中维护数据一致性的机制,每一个saga由一系列本地事务组成,使用补偿事务回滚操作。分协调模式,编排模式2种模式。缺乏ACID中的I,隔离性,带来一些问题,比如脏读。
  4. 事件队列,或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的部署单元。

什么是可观测的服务?

使服务更易于理解和排除故障。

  1. 健康检查API, /healthCheck
  2. 日志聚合,ELK
  3. 分布式跟踪,外部请求分配唯一ID
  4. 异常跟踪,服务把异常报告给中央服务,通知用户。
  5. 应用程序指标
  6. 审核日志记录

什么是ELK?

面向文本搜索的NoSQL数据库Elasticsearch, 聚合服务日志工具Logdash, 可视化工具Kibana。

什么是服务网格?

使用边车代理模式的虚拟化的基础设施,如Istio。

引用

  1. 《Microservices Patterns:With Examples in Java - Chris Richardson》
  2. 《Data Structures and Algorithm Analysis in Java Third Edition - MarkAllenWeiss》
  3. 《Clean Architecture - Robert C. Martin》
  4. 《凤凰架构 - 周志明》