微服务要点梳理
微服务是一种用于构建应用的架构方案。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。
- 1. 实施微服务好处
- 2. 带来的问题
- 3. Spring Cloud 组件
- 4. 限流方法(流量控制、熔断降级、系统负载保护)
- 5. 限流算法
- 6. 负载均衡方法
- 7. 分布式锁
- 8. CAP理论
- 9. BASE 理论
- 10. 分布式事务
- 11. 分布式事务框架
- 12. Seata 4种事务模式
- 13. 分布式链路跟踪
- 14. 分布式 id 生成方式
1. 实施微服务好处
- 针对特定服务发布,影响小,风险小,成本低
- 频繁发布版本,快速交付需求
- 低成本扩容,弹性伸缩,适应云环境
2. 带来的问题
- 分布式系统的复杂性
- 部署,测试和监控的成本问题
- 分布式事务和CAP的相关问题
3. Spring Cloud 组件
- 注册中心 Eureka,其他的还有 Zookeeper、Consul 和 Nacos。用于服务发现;
- 配置中心 Spring Cloud Config
- 网关 Spring Gateway 和 Zuul
- 客户端负载均衡 Ribbon,默认策略是轮询
- 断路器 Hystix
- RPC 客户端 Feign
4. 限流方法(流量控制、熔断降级、系统负载保护)
- Hystrix 熔断策略基于异常比率;限流基于 QPS,支持基于调用关系的限流
- Sentinel 熔断策略基于响应时间、异常比率、异常数;限流支持有限(并发线程数或信号量大小)
- Redis + Lua 脚本。
判断 key 是否存在,若不存在设置 key 过期时间和对应 value 为1;
若存在判断在过期时间内 key 对应的 value 值是否大于限制数量,大于返回 false,小于自增加2并返回 true。
5. 限流算法
- 计数器(固定窗口)
- 滑动窗口(Sentinel)
- 漏桶(Java 线程池)
- 令牌桶(Guava RateLimiter)
6. 负载均衡方法
- 随机
- 轮询
- 加权响应:响应时间短的权重就大
7. 分布式锁
- 数据库级别:读频繁用乐观锁,写频繁用悲观锁
- 乐观锁:基于版本号实现
- 悲观锁:基于数据库级别的 for update
- 基于 Redis 原子性操作,使用 setnx 和 expire 实现
- 基于 Rdisson 框架实现
- 基于 Zookeeper,使用 InterprocessMutex 实现
8. CAP理论
- Consistency 一致性:写之后的操作,必须返回该值。分布式系统中任意一个节点都会查询到相同的信息。
- Availability 可用性:正常响应时间,服务一直可用。只要收到用户请求,服务器就必须做出响应。
- Partition tolerance 分区容错性:区之间通讯可能失败,容忍某些区奔溃。当部分节点出现问题的时候,系统依然能正常堆外提供服务。
9. BASE 理论
- Basically Available(基本可用)
- Soft state(软状态)
- Eventually consistent(最终一致性)
10. 分布式事务
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。常用的解决方案有:
- 基于 XA 协议的 2PC (两阶段提交)和 3PC。Seata 常用模式
- 基于业务层的 TCC 方案。Try Confirm Cancel 三阶段,代码实现复杂度相对较高
- 使用应用消息队列 + 本地消息表实现的最终一致性方案。跨行转账可通过该方案实现。目前市面上支持该方案的 mq 只有阿里的 rocketmq,单消息队列可用于:
- 用户注册成功后发送邮件
- 电商系统给用户发送优惠券
- 最大努力通知。例如支付回调和其他一些回调通知
11. 分布式事务框架
- Seata:提供 AT、TCC、SAGA 和 XA 事务模式
- TX-LCN:提供LCN(2pc)、TCC、TXC 三种事务模式
- Raincat
12. Seata 4种事务模式
(AT、TCC、Saga、XA)模式分析
四种分布式事务模式,分别在不同的时间被提出,每种模式都有它的适用场景。
- AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。
- TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。
- Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
- XA模式是分布式强一致性的解决方案,但性能低而使用较少。
13. 分布式链路跟踪
- Spring Cloud Sleuth
- ZipKin
14. 分布式 id 生成方式
- UUID
- 数据库自增 ID
- 号段模式
- Redis
- 雪花算法