分布式的各种解决方案

在这里插入图片描述
在这里插入图片描述

专题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

token登录验证

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 分布式限流

压测工具

Apache Bench (ab) 压测工具

常见限流原理

漏桶算法

在这里插入图片描述

令牌桶算法

在这里插入图片描述

单机版限流组件: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.垂直拆分
一个多字段的表拆分成多个表

分库分表解决方案
  1. ShardinSphere
  2. Mycat
ShardingSphere

官方文档

分库规则
分表规则

Docker搭建主从数据库

分布式事务

要解决的问题:比如创建订单失败,则商品系统不应该扣减库存。
在这里插入图片描述
解决方案:
Seata
分布式事务 Seata 及其三种模式详解
本次分享的视频回顾以及PPT 查看地址

RestTemplate和Seata

@GlobalTransactional
Seata的使用
注:RestTemplate需要Spring托管,不要自己new,不然分布式事务不起作用。

Feign和Seata (生产环境常用)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值