spring(Boot)扩展点整理
SpringBoot的主要功能都是依靠它内部很多的扩展点来完成的,今天来做个总结和记录
1、SpringApplicationRunListener1.1、基本概念从命名我们就可以知道它是一个监听者,分析springboot启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。对于开发者来说,基本没有什么常见的场景要求我们必须实现一个自定义的SpringApplicationRunListener
12345678910111213public interface SpringApplicationRunListener { //刚执行run方法时 void started(); //环境建立好时候 void environmentPrepared(ConfigurableEnvironment environment); //上下文建立 ...
雪花算法(Snowflake)原理分析
1、概念雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为Snowflake IDs或snowflakes。这种算法由Twitter创建,并用于推文的ID
雪花算法几个特性
生成的ID分布式唯一和按照时间递增有序,毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
不依赖数据库等三方系统,稳定性更高,性能非常高的。
可以根据自身业务特性分配bit位,非常灵活。
2、snowflake算法实现细节2.1、拆解64bit位snowflake生成的id通常是一个64bit数字,java中用long类型。
1、1bit-不用,因为二进制中最高位是符号位,1表示负数,0表示正数,生成的id一般都是用整数,所以最高位固定为0.2、41bit-用来记录时间戳(毫秒).41位可以表示2^41−1个数字,如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2^41-1,减1是因为可表示的数值范围是从0开始算的,而不是1。也就是说41位可以表示2^41-1个毫秒的值,转化成单位年则是:(2^41−1)/(1000∗60∗60∗24∗3 ...
Stream 流式编程:并行流
1、基本概念Stream是工作中经常用到的集合操作工具,Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。同时它提供的parallelStream方法能够充分利用多核CPU的优势,使用多线程加快对集合数据的处理速度
相对于顺序流而言,并行流在执行某些中间操作时,会自动将数据分成若干个小块,并在多个线程中进行处理,最终将结果合并起来。可以通过调用parallel()方法将顺序流转换为并行流
例如,我们可以使用以下代码使用并行流对一个整数列表进行求和:
12List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.parallelStream() .mapToInt(Integer::intValue) .sum();
这里,parallelStream()方法创建一个并行流,mapToInt()方法将Stream中的元素转换为int类型,sum()方法对所有元素求和。
需要注意的 ...
西方哲学史
1、智慧的痛苦1.1、什么是哲学关于哲学错误的看法:
(1)哲学是科学:它不具备一门科学知识应该具备的最基本特征:普遍性和必然性(2)哲学是让人聪明的学问:哲学的理论学说都处在众说纷纭,莫衷一事的处境中。那么你想想学哲学会让你聪明还是糊涂(3)哲学是讲道理的学问:哲学是讲大道理的,可是哲学这个大道理大到什么程度,大到没有办法去印证的程度。那么道理道理之间的冲突就变成没有道理 哲学往往被看做是为意识形态服务的工具,今天是这样一种政策,理论家们就要给我论证它的理论基础,非常完善的一套逻辑,过一段时间政策变了,还是这群哲学家,仍然还可以给你论证那套基础。不恰当的讲,可以把煤球论证成黑的,也可以论证成白的。 科学知识的对象 -> 现实性 哲学的对象 -> 理想性,带有乌托邦的性质,它是人们不满足于这个世界,而为它建立的一个理想世界,但每个人不同的时代社会和所处的环境,使人们对这个理想的境界理解不同(4)哲学无用,无用只用,是为大用。所有学科都比哲学有用,但是是唯有哲学是自由的学问,因为所有的学科都有前提,都有它服务的对象,但唯独哲学是为了自身而被追求的知识。哲学是 ...
异步非阻塞编程:CompletableFuture
1、背景我们都知道可以通过继承Thread类或者实现Runnable接口两种方式实现多线程。但是有时候我们希望得到多线程异步任务执行后的结果,也就是异步任务执行后有返回值,Thread和Runnable是不能实现的。当我们需要返回值的时候怎么办呢? Java 1.5 推出的Callable和Future接口就解决了这个问题。但是因为Future有几个局限,由于这几个局限,在Java1.8就推出了加强版的Future类:CompletableFuture
Future用于表示异步计算的结果,只能通过阻塞或者轮询的方式获取结果,而且不支持设置回调方法,Java8之前若要设置回调一般会使用guava的ListenableFuture。 CompletableFuture对Future进行了扩展,可以通过设置回调的方式处理计算结果,同时也支持组合操作,支持进一步的编排
2、Future使用假如我们现在有如下需求:
老板正在开会,开会过程中发现少一份材料,通知秘书去整理,在秘书整理过程中老板这边还在继续开会,秘书整理完以后将材料给到老板手中。
需求分析:
老板开会是主线程,不能中断。秘书就是异步 ...
sharding-jdbc实现自动按月分表
1、基本需求1、 项目中我们希望 能够按照时间、类别来添加表。但是sharding-jdbc 是固定配置 的 actual-data-nodes 参数。也就是说我们需要提前创建好分表或者分库。那么我们需要如何来实现动态创建表,并且动态刷新 actual-data-nodes 呢。
2、思路就是写个定时器来动态创建表 ,在创建表的时候 动态刷新 actual-data-nodes 实现动态创建表被shard加载。
2、功能实现2.1、添加依赖12345678910<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version></dependency><dependency> <groupId>org.apache.shar ...
快乐源泉
1、段子
小明考了零分, 老师把小明拽到讲台前说道:“大家都看看, 这就是平时注意力不集中, 不好好听我讲课, 竟然考了零分, 大家要以此为鉴!” 这时,小明泪流满面地说:“老师,啥时候考的试呀, 下回能不能到门外通知我一下?”
天气预报说今晚会有台风登陆,但是一直没登陆,你知道是为什么吗?因为台风忘记密码
唉!模拟地震没有地震;模拟火灾没有火;那为什么模拟考试就有考试了啊啊啊!
司机:你们为什么要去四十公里外的地方吃饭 我:看小红书推荐的 司机:现在还看书的年轻人不多了
两程序员聊天,程序员甲抱怨:”做程序员太辛苦了,我想换行……我该怎么办?”程序员乙:”敲一下回车。”
你为家乡脱贫做出了什么贡献?我出门打工,减少贫困人口
野外有野生龟,家有家规
大熊猫点外卖,笋到家了
大多数人回家的第一句话是“妈,我回来了。”如果妈妈不在家,第一句话一定是:“爸,我妈呢?”
不偷不是意大利,不抢不是法兰西,又偷又抢英吉利,再开两枪是美帝
结婚并不是人生的最优解,他只是亲戚朋友父母的一种期望而已,如果你物质生活丰富,精神世界富足,婚姻对你而言只是锦上添花而已。来到这个世界上你是自己的主角,这辈子也没 ...
分布式事务解决方案seata
1、概念1.1、背景在微服务架构下,由于数据库和应用服务的拆分,导致原本一个事务单元中的多个DML 操作,变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作,而传统的数据库事务无法解决这类的问题,所以就引出了分布式事务的概念。分布式事务本质上要解决的就是跨网络节点的多个事务的数据一致性问题,业内常见的解决方法有两种
a. 强一致性,就是所有的事务参与者要么全部成功,要么全部失败,全局事务协调者需要知道每个事务参与者的执行状态,再根据状态来决定数据的提交或者回滚b. 最终一致性,也叫弱一致性,也就是多个网络节点的数据允许出现不一致的情况,但是在最终的某个时间点会达成数据一致。
在分布式事务的实现上,对于强一致性,我们可以通过基于 XA 协议下的二阶段提交来实现,对于弱一致性,可以基于 TCC 事务模型、可靠性消息模型等方案来实现。
1.2、常见分布式事务解决方案1、seata阿里分布式事务框架2、消息队列3、sage4、XA
他们有一个共同的特点,都是两阶段(2PC),两阶段是指完成整个分布式事务,划分为两个步骤完成。实际上这四种方案分别对应着分布式事务的四种模式:AT,TCC, ...
Linux运维笔记
1、Linux终端1.1、终端组成部分[root@localhost ~]#
1、root:表示当前终端登录的用户名2、@:表示在3、localhost:当前登录的主机名4、~:当前终端的工作目录5、#:表示身份标识符
1.2、Linux关机命令1、shoutdown -h now:正常关机2、halt:关闭内存3、init 0:关机,和shoutdon -h一样。只不过shutdown可以通过 -r now重启
2、Linux系统与文件2.1、Linux文件系统在 Linux 系统中有一个重要的概念:一切都是文件
/bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里/sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等/etc: 存放系统管理和配置文件/home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示/usr : (Unix S ...
Redisson 框架中的分布式锁
实现分布式锁通常有三种方式:数据库、Redis 和 Zookeeper。我们比较常用的是通过 Redis 和 Zookeeper 实现分布式锁。Redisson 框架中封装了通过 Redis 实现的分布式锁,下面分析一下它的具体实现
1、关键点
原子性:要么都成功,要么都失败
过期时间:如果锁还没来得及释放就遇到了服务宕机,就会出现死锁的问题。给 Redis 的 key 设置过期时间,即使服务宕机了超过设置的过期时间锁会自动进行释放。
锁续期: 因为给锁设置了过期时间而我们的业务逻辑具体要执行多长时间可能是变化和不确定的,如果设定了一个固定的过期时间,可能会导致业务逻辑还没有执行完,锁被释放了的问题。锁续期能保证锁是在业务逻辑执行完才被释放。
正确释放锁: 保证释放自己持有的锁,不能出现 A 释放了 B 持有锁的情况。
2、实现2.1、引入依赖1234567<!-- pom.xml文件--><dependency> <groupId>org.redisson</groupId> <artifactId>redi ...