- 微服务
- 分布式基础
- 分布式系统的演进和定义
- 单体应用
- 容量限制、单点故障
- 集群应用
- 无状态:请求间无关,任意伸缩
- 有状态
- 单一服务:完全隔离,容错性差
- 共享信息池:信息池单点故障
- 信息一致:同步延迟,一致性问题
- 分布式应用
- 拆分部署子应用
- 集群与分布式
- 区别:多节点做相同任务、协同做一种任务
- 广义的分布式
- 只要面临信息池同步及一致性问题
- 分布式系统的基本问题
- 网络通信、节点故障、网络分区、三态问题成功失败超时
- CAP 定律
- 无法同时满足一致性、可用性和分区容忍性,需权衡一致性和可用性。
- 一致性级别
- 强一致性、弱一致性、会话一致性、用户一致性、最终一致性
- 分布式事务
- 2PC 协议
- 两阶段提交,存在协调者单点故障
- 3PC 协议
- 三阶段提交,增加超时自动提交
- TCC 协议
- 业务层面2PC、保证幂等、允许空回滚
- BASE 理论
- 基本可用、软状态、最终一致性
- 共识算法
- 定义:保证共识达成最终一致性
- Paxos 算法
- 特点:最早、复杂、zk
- 原理:提议者、接受者、学习者、多轮消息交换和投票
- Raft 算法
- 特点:易于理解、易于实现
- 日志复制:复制状态机模型,相同初始+相同输入=相同结束,操作日志
- Leader选举:领导者、跟随者、候选人、任期、心跳机制、超半数当选
- 写入:Leader添加日志、复制日志、超半数成功
- 读取:非Leader确保日志最新来保证强一致性
- 一致性哈希
- 场景:负载均衡、分布式存储
- 作用:防止映射关系大规模失效
- 原理:哈希环、虚拟节点、顺时针最近
- 幂等
- 定义:多次请求影响一致
- 作用:超时重试
- 实现:唯一索引、乐观锁、防重token
- 分布式锁
- 原理:通过节点外的共享存储实现
- 数据库悲观锁、乐观锁、redis、zk、etcd
- 微服务基础
- 微服务架构特点
- 小型化、独立部署、松耦合、自治、隔离、弹性
- 基本问题
- 分布式问题
- CAP
- 组织架构问题
- 康威定律、系统与组织异质同态
- 服务拆分
- 拆分的原则
- 单一职责、高内聚低耦合、演进式拆分、避免复杂依赖
- 拆分的方法
- 按业务领域拆分、避免服务间强一致性、按性能、按业务重要级别,按组织和团队拆分
- 通信方式
- 通信模式
- 同步、异步、发布订阅
- 接口协议
- RESTful、RPC、消息队列
- 按场景选择:低延迟RPC、强一致性RPC实现TCC、最终一致性消息队列、大规模流kafka、一对多发布订阅、对外RESTful或gRPC、前后端RESTful
- 服务编排
- Orchestration(编制)
- 中心指挥手、编排引擎
- Choreography(编排)
- 去中心化、消息协作形成流程
- 服务治理
- 服务发现
- 自动注册和发现、IP动态变化、分布式KV存储
- 统一配置管理
- 集中配置存储、多环境切换
- 可观测性
- 监控、日志、链路追踪、告警
- Prometheus、Grafana、OpenTracing、Jaeger、ELK、OpenTelemetry
- RPC
- RPC 协议构成
- 接口、传输协议TCP/HTTP、序列化协议JSON/ProtoBuf
- RPC 框架构成
- 模块:客服端服务端接口存根,网络传输、序列化
- 形式:依赖库、代码生成工具集
- 一次 RPC 调用的流程
- 服务端IO模型
- 同步阻塞IO、同步非阻塞ID、同步多路复用IO、异步IO
- 服务端线程模型
- 单线程、多线程短连接、多线程长连接、线程池
- 服务端 reactor 模式
- reactor为多路复用器、单reactor单线程、单reactor多线程(协程)、主从reactor多线程
- 常用 RPC 框架
- gRPC
- Google、CNCF、protobuf、二进制高性能、HTTP2、多路复用、流式RPC
- API网关
- 定义
- 架构模式、聚合API、统一入口
- 功能解析
- 路由
- 请求转发、路由规则如URL、HTTP方法、请求头等
- 负载均衡
- 加权轮训、一致性哈希、最小连接数
- 反向代理
- 代理服务端响应、安全性、缓存
- 重试
- 固定时间重试、指数退避重试
- 熔断
- 避免雪崩、时间窗口故障率、阈值
- 限流
- 固定窗口、滑动窗口、漏桶、令牌桶
- 协议转换
- HTTP、HTTPS、RPC转换、安全性、兼容性
- 认证鉴权
- 用户名密码、OAuth2.0、OIDC
- 灰度发布
- 滚动发布、蓝绿发布、灰度发布/金丝雀发布
- 统一对外接口
- 安全、利用路由、协议转换、认证鉴权、接口文档swagger
- 健康检查
- 主动检查、被动检查、探针
- 版本控制
- 多版本共存、路由控制访问
- 接口mock
- 模拟响应、提前测试
- 数据缓存
- 存储磁盘或内存,结合http头缓存控制实现
- 日志
- 记录请求和响应,工具ELK
- 监控
- 粒度、指标、metrics接口、prometheus、grafana
- 全链路追踪
- 可观测性、traceId、上下文传递、zipkin、OpenTracing、OpenTelemetry
- 数据聚合
- 减少开发、增加复杂、不建议
- API网关设计重点
- 高性能
- 非阻塞IO、epoll、Netty、NIO
- 高可用
- 集群部署、解决突发流量/下游不可用/配置中心故障等
- 高扩展
- 热插拔、动态配置
- API网关选型
- apisix
- CNCF、OpenResty、Nginx、Lua、高性能、热插拔、多插件