专题1 分布式ID
唯一ID来标识,全局唯一
方案
1.UUID
缺点:1.空间占用多
2.不能生成递增有序的数字,索引效率下降
2.数据库主键自增
缺点:1.并发性能不高,受限于数据库性能
2.分库分表,需要改造,较复杂
3.自增容易泄漏数据量
3.Redis自增
缺点:1.数据丢失
2.自增容易泄漏数据量
4.雪花算法(snowflake)
缺点:时钟回拨
方案总结
1.号段模式
比如100、200、300...... , 当第一台服务器申请,获取100,则分配1—100范围的号段;当第二台服务器申请,获取200,则分配101—200范围的号段.........
2.雪花算法
开源组件
1.百度 uid-generator
uid-generator
特点:只支持雪花算法,无人维护
2.滴滴 tinyid
tinyid
特点:只支持数据库号段,多DB,高可用,java-client
适合对id有高可用需求
3.美团 Leaf (推荐)
Leaf
特点:号段模式,需要使用数据库;
雪花算法,使用了zookeeper, 上报服务器标识到zk;
适合多种场景的分布式id
文档中有针对号段模式和雪花算法的代码实践;
专题2 分布式session
1.传统Session
Cookie和Session ---- 再去熟悉下原理
Cookie的跨域问题
2.Spring-Session
Spring-Session-Redis方案的使用
微服务多模块下解决session共享问题
redis.conf文件中的bind参数
3. Token + Redis
4.JWT
jwt的使用
java-jwt
jwt实现拦截器和token认证
Spring拦截器
5.OAuth2
专题3 分布式任务调度
非分布式调度框架
@Scheduled
@Scheduled注解
fixedDelay参数:从上一次任务结束到下一次任务开始的固定时间间隔(毫秒)
fixedRate参数:从上一次任务开始到下一次任务开始之间的时间间隔(毫秒)
cron参数:[秒] [分] [小时] [日] [月] [周]
@Scheduled与多线程
@Scheduled实现多个任务并发执行
@Async注解
@Async注解失效的原因
[@Async注解失效的原因]](https://blog.csdn.net/weixin_43241706/article/details/121555913)
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
return threadPoolTaskScheduler;
}
分布式调度框架
推荐使用xxl-job
xxl-job
xxl-job调度中心管理界面搭建
xxl-job和springboot的整合
路由策略
xxl-job文档
高级配置:
- 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
FIRST(第一个):固定选择第一个机器;
LAST(最后一个):固定选择最后一个机器;
ROUND(轮询):;
RANDOM(随机):随机选择在线的机器;
CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
分片广播----一个任务,分配给多台执行器共同来完成
阻塞处理策略
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
专题4 分布式限流
压测工具
常见限流原理
漏桶算法
令牌桶算法
单机版限流组件:Guava RateLimiter
1.令牌桶算法
guava limiter的使用
分布式限流组件: Sentinel
1.控制台和java客户端
sentinel接入
sentinel的配置及简单使用
sentinel官方文档
sentinel 官方文档
sentinel 主流框架适配
sentinel控制台jar
自定义限流处理逻辑
public class CustomUrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
//TODO
}
}
Sentinel控制台中的流控规则持久化
控制台中的流控规则默认是保存在内存中的,需要自己来实现持久化
在生产环境使用Sentinel
1.Sentinel控制台将流控规则推送到zookeeper
Sentinel流控规则持久化到zookeeper
持久化到zookeeper
2.Zookeeper推送流控规则到Sentinel客户端
分库分表
拆分方式
1.水平拆分
每个表结构都一样
2.垂直拆分
一个多字段的表拆分成多个表
分库分表解决方案
- ShardinSphere
- Mycat
ShardingSphere
分库规则
分表规则
Docker搭建主从数据库
分布式事务
要解决的问题:比如创建订单失败,则商品系统不应该扣减库存。
解决方案:
Seata
分布式事务 Seata 及其三种模式详解
本次分享的视频回顾以及PPT 查看地址
RestTemplate和Seata
@GlobalTransactional
Seata的使用
注:RestTemplate需要Spring托管,不要自己new,不然分布式事务不起作用。