- 博客(93)
- 收藏
- 关注
原创 Seata学习(五):Seata TCC模式练习
2)Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤。1)TCC 是一种侵入式的分布式事务解决方案,需要业务系统自行实现 Try,Confirm,TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,TCC 模式,不依赖于底层数据资源的事务支持,即TCC模式也支持其他非关系型数据库的。务系统有着非常大的入侵性,设计相对复杂,但优点是 TCC 完全不依赖数据库,能够实现。该操作为成功,二阶段直接执行commitMethod。
2025-08-18 11:04:03
1028
原创 Seata学习(四):Seata XA 模式练习
1)TM 向 TC 请求发起(Begin开启)、提交(Commit)、回滚(Rollback)全局事务。II)持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来。4)传统基于 XA 应用的迁移:传统的,基于 XA 协议的应用,迁移到 Seata 平台,1)业务无侵入:和 AT 一样,XA 模式将是业务无侵入的,不给应用设计和开发带来。连接数据库,查询统计库存,就看到当前的 50。2)应用程序(AP)通过TM通知订单库(RM)和商品库(RM),来创建订单和减库存,
2025-08-15 16:46:00
766
原创 Seata学习(三):Seata AT模式练习
行”业务SQL“更新数据,更新之后再次保存数据”redo(redo log,即更改之后的数据)“,在数据被更新前,保存下来"undo(undo log,即原数据,更改之前的数据)",然后执。在一阶段中,Seata会拦截“业务SQL“,首先解析SQL语义,找到要更新的业务数据,在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,如果之前的一阶段中有本地事务没有通过,那么就执行全局回滚,否在执行全局提交,全局事务“提交/回滚”完成后会释放所有资源和删除所有日志。
2025-08-14 16:34:58
1081
原创 Seata学习(二):Seata介绍和安装
seata 下载解压后,进入conf 目录,修改registry.conf 与 file.conf 文件,来配置seata注册。数据库(如:seata),并执行seata 1.4.2 解压包中的文件 seata-server.sql,来创。事务管理器给每个参与者发送Prepare消息,每个数据库参与者在本地执行事务,并写。Undo日志是记录修改前的数据,用于数据库回滚,Redo日志是记录修改后的数据,业务层⾯的分布式事务解决⽅案,TCC,Try-Confirm-Cancel 模式,是⼀种通过三个。
2025-08-13 16:48:03
1113
原创 Seata学习(一):分布式事务介绍
III)I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事。IV)D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要。II)C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。性C,但是网络是不可靠的,所以我们系统就需要保证分区容错性P,也就是我们必须容忍。
2025-08-13 11:06:57
820
原创 Sentinel(四):Sentinel热点规则
范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和。参数索引对应 @SentinelResource 标注的资源方法的参数列表中参数的位置,从0开始。1)value:代表资源名称,必需项,因为需要通过resource name找到对应的规则,若 统计时长内,指定位置的参数的请求的QPS达到配置的 “单机阈值”,则触发限流。当指定位置的参数等于指定的参数值的请求,在统计时间内的qps达到 参数例外项中。参数例外项的限流规则的优先级要高于基本的热点规则,若某个参数配置了“参数例外项”,
2025-06-25 15:15:26
1131
原创 Sentinel(三):Sentinel熔断降级
进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误),当请求触发熔断后,在熔断时间段内所有的请求都没拒绝,过了熔断时长,请求可以再。在统计时长内,异常请求数超过配置的“异常数”,后续在熔断时长内的请求会被直接拒绝。当统计时长内,异常请求占比超过阈值后,后续在熔断时长内的请求会被直接拒绝,数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内新的。若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT ,
2025-06-24 17:03:51
1365
原创 Sentinel(二):Sentinel流量控制
II)Wam Up:根据codeFactor(冷加载因子,默认3)的值,从“阈值/codeFacotor” 开始,2)给请求资源 “testA” 添加流控规则,testA 关联 testB,并配置testB的QPS为1。给请求testA配置流控,阈值类型选择 “QPS”,单机阈值配置为 1,流控模式选择“直接”,然后在浏览器或PostMan 中快速访问 “/testA”,当达到限流上限后的请求直接返回异常,III)排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。
2025-06-24 10:59:02
1434
原创 Sentinel(一):Sentinel 介绍和安装
目一般直接引入spring-cloud-starter-alibaba-sentinel,该依赖中包含了 Sentinel 核心库,在工作中,如果需要集成 Sentinel ,需要深入 Sentinel 的核心库;Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、对比与其他的产品而言,如:Hystrix,Sentinel 不需要我们自己手动搭建监控平台,而且它有。(FallBack),而不是长时间的等待或者抛出调用方法无法出的异常,这样就保证了。
2025-06-19 16:51:44
1596
原创 Nacos基础使用(二):nacos作为配置中心
spring.cloud.nacos.config.file-extension” 来配置。(nacos-config-client)”、 “spring.profiles.active(dev)” 、“file-extension” 可以推导。空间 public;2)在新加的命名空间 “DEV”中新增配置文件 “nacos-config-client-dev.yaml”,并设置分组。nacos配置项 “spring.cloud.nacos.config.prefix” 来配置。
2025-06-18 15:30:56
2304
原创 Nacos基础使用(一):nacos介绍和nacos作为服务注册中心
1)在mysql 中创建nacos的数据库,数据库名称推荐是“nacos-config”(我这里是nacos);修改完成后,重启nacos后,就可以发现nacos把用户配置数据存储到了数据库nacos下的。然后进入到Nacos安装目录下的conf目录中,在刚创建的数据库中(如:nacos)运行。就会有一个derby,当有多个Nacos节点的时候,就会出现一致性问题,所以Nacos支持了外部。Nacos 是 服务注册中心与配置中心的组合,nacos即能作为服务注册中心使用,也能作为。
2025-06-17 15:43:52
1987
原创 负载均衡器:Ribbon和LoadBalance
更加直观说就是ribbon就是简化上边方法createOrder中的这段代码的小组件,不过他比我们的代码要强大一些,他给他们提供了丰富。策略,@RibbonClient和@RibbonClients 需要标注在 @Configuration 配置类上。有bug,不支持使用;@RibbonClient 可以用来为某个服务指定Ribbon的负载均衡策略(如:shop-stock),跟Ribbon 一样,LoadBalancer也提供了注解 @LoadBalancerClient 和。
2025-06-14 19:23:04
1563
原创 Dubbo学习(一):Dubbo介绍
Provicer 暴露的对外提供服务的接口并不是在 Provicer 项目中定义的,该服务接口。是单独定义在一个项目中,Provicer 中对外的服务需要实现该接口,然后由Consumer。1)定义正常的service服务,该服务正常使用spring提供的@Service 注解,或spring提供的。Registry 是服务注册中心(提供服务注册与发现),放置所有Provider对外提供的信息。consumer 是远程服务的调用者,在 consumer 中通过api中定义的服务接口来执行远程调用。
2025-06-06 16:46:31
983
原创 Shiro(八):JWT介绍
Signature 是将通过将编码后的header、编码后的payload、一个密钥和header中指定的。JWT(JSON Web Token,JSON Web令牌)是一种开放标准(RFC 7519),用于在网络应。Refresh Token 向服务端请求新的JWT,即:短期JWT令牌 + 长期刷新JWT。例如,服务器可以生成具有声明 “以管理员身份登录”(一般在 claims 中声明) 的令牌,并将。JWT令牌未被篡改;在实际工作中,一般给JWT设置较短的过期时间,当客户端jwt令牌过期后,执行。
2025-05-09 16:14:57
606
原创 Docker(三):DockerFile
2)Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,启动容器时指定的运行命令,如:docker run -d 镜像名 运行命令。I)如果用户启动容器时指定了运行命令,ENTRYPOINT不会被运行命令覆盖,而 CMD。src:可以是一个本地文件或压缩文件,也可以是一个url,如果src是一个url,那么ADD 就。1)Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。
2025-05-05 10:54:09
2716
4
原创 Shiro学习(七):总结Shiro 与Redis 整合过程中的2个问题及解决方案
参考开源项目shiro-redis,新定义一个ShiroSession 并继承 SimpleSession,在 ShiroSession。通过Debug 发现,Shiro默认创建的Session是 SimpleSession,且每次访问Session。Session 时,先从ThrealLocal 中读取,若 ThreadLocal 中的Session 不存在或已经过期,则。中定义一个标志位 isChange,只有 lastAccessTime 之外的属性发生改变时,isChange被设置。
2025-04-28 16:55:41
917
原创 Docker(二):docker常用命令
2.2、在指定目录下(如 /root/docker)创建目录 mysql/mysql、mysql/conf、mysql/log,分别用于。存放Docker中mysql7容器的运行数据、配置文件、日志;1)执行命令:docker exec -it mysql5.7 bash 进入容器mysql5.7中。如:以上边容器 mysql5.7 为例来进入容器中的mysql bash,并设置 mysql 权限,使之可以远。docker exec 进入容器并在容器中打开新的终端,可以在容器的终端中执行命令,并将。
2025-04-27 18:47:35
1426
5
原创 Docker安装与介绍(一)
该命令可能会报错误:Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.命令:wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo。
2025-04-19 19:05:48
1059
原创 Shiro学习(六):Shiro整合CAS实现单点登录
(2)因为我们导入的包不是 spring-boot-shiro shiro整合springboot 的包,所以需要自己手。CAS Server的5.x版本更改为使用gradle构建,平时更多的是使用Maven,这里采用CAS的4.x。CAS下载完成后使用IDEA打开CAS Server,并修改一些配置信息,将CAS Server进行打包,Pac4jRealm已经实现了具体的认证流程,我们不需要重写认证;CAS Client是一个项目中的具体业务服务,并且在需要认证或授权时,找到CAS Server即。
2025-04-06 18:24:30
1739
原创 Shiro学习(五):Shiro对权限的缓存
shiro 默认提供的jvm缓存是 MemoryConstrainedCacheManager,它是把权限角色信息缓存到。RedisCache需要实现 org.apache.shiro.cache 包下的接口 Cache,Shiro 中虽然默认提供了基于JVM内存的缓存机制,但是默认是没开启,权限角色信息并不会。Shiro 中执行权限角色校验时,默认也是优先从缓存中查询用户权限信息,若缓存中查询不到。由前边的学习中了解,用户的角色权限一般存储在数据库中,每次进行权限校验时都要从。
2025-04-04 11:51:15
903
原创 Shiro学习(四):Shiro对Session的处理和缓存
装配的 SessionManager;的Session,并默认将Session保存到类 HttpServletSession 中的 HttpSession 属性中;由上边可以知道,默认情况下Shiro是将Session 保存到了Web 容器的HttpSession 中,但通过。在Shiro 与Web(如:SSM、springboot)环境中,Shiro 认证成功后默认使用的是Web容器。的逻辑,即:先从HttpRequest 域 中获取Session,若获取不到再从Redis 中查询Session;
2025-04-03 16:01:53
1267
原创 Shiro学习(三):shiro整合springboot
由 配置类 ShiroWebFilterConfiguration 初始化 ShiroFilterFactoryBean 时可以发现,过滤器。,所以需要我们手动装载 SecurityManager 去覆盖Springboot 自动装载的 SecurityManager。另外在 shiro-spring-boot-web-starter 包下的文件 spring.factores 中的配置类。只会注入 Shiro 自身默认提供的Relam,这里需要把自定义的Realm注入到 SecurityManager。
2025-04-02 17:25:00
1236
原创 Shiro学习(二):Web中整合Shiro
DelegatingFilterProxy 是 Spring Framework 提供的一个特殊的 Filter 实现类,用于将 Filter 的。目标 Filter Bean 名称,指定要委托的 Spring 容器中的 Filter Bean 的名称,如果不设。DelegatingFilterProxy 默认使用Filter 名称作为目标Bean 的名称,如Shiro与Web 整合时,可以使用Shiro自带的Relam,若自定义Relam,请参考上一篇中的CustRelam,这里不。
2025-03-30 12:28:25
1230
原创 Shiro学习(一):Shiro介绍和基本使用
Shiro 的设计目标是简化企业级应用程序的安全性开发过程,同时保持代码的简洁和易于维护。1)IniRealm:基于 .ini文件的配置,从Shiro.ini读取用户 认证/授权 和 角色数据。Realm,安全数据源, 是连接Shiro 与 安全数据的桥梁(如:JDBC数据库数据、LADP、SimpleAccountRealm是Shiro 提供的一个最基本的 Realm 内存实现,适用于快速原型开发。SecurityManager 是Shrio 的核心,管理所有的安全操作,协调所有安全组件,
2025-03-25 16:39:55
1322
原创 任务调度之Quartz(二):Quartz体系结构
2)triggerFired():Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler。5)triggerComplete():Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个。如:在分钟字段中使用 0/15,则表示为 0,15,30 和 45 秒,而 5/15 在分钟字段。1W,如果 1 号是星期六,结果匹配的是 3 号星期一,而非上个月最后的那。如 :6#3 表示当月的第三个星期五(6 表示星期五,#3 表示当前的第三个),而。
2025-01-07 23:15:14
901
原创 BitMap(位图)学习
因为 1byte = 8bit,而bitmap是用下标 index 的bit值表示 value=index 的值是否存在(0-值不。若bit[idx]=0,则说明值为idx的值不在数组中,在bitmap中 bit[1]、bit[4]、bit[5]、存在,1-值存在),所以对于字节数组 byte[] b,b[0] 记录的是 [0,7] 的数据,b[1] 记录的是。bitmap(位图):使用一个bit位来表示指定数据值是否存在;由于bit的值只能是0或1,所以 0表示value的值不存在,1表示存在;
2025-01-05 18:50:02
950
原创 java实现一个kmp算法
Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;Kmp 算法的核心是利用匹配失败的信息,尽量减少模式串与主串的匹配次数,以达到。Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度。1、什么是KMP算法。
2025-01-01 19:26:11
317
原创 基于DFA算法实现敏感词过滤
即将敏感词存储在Map 中,每个敏感词的第一个字是外层Map的key,而Map 的value也是Map。1)如果匹配key的isEnd是1,说明和敏感词对应上了,下次就跳到敏感词的后面继续。类型的,我们称之为内层Map,其存储敏感词的下一个字和标识符(用于标识到前一个字时敏。匹配外层key,敏感词树中,一个外层循环key表示一个敏感词。态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是。拿到后,先基于最外层的key进行匹配,如果匹配上了,继续向内部的key匹配,
2024-12-02 17:42:21
594
原创 任务调度之Quartz(一):Quartz基本使用
与Scheduler有关的事件包括:增加一个job/trigger,删除一个job/trigger,scheduler。在Quartz 中Job并不能直接执行,需要把Job包装成JobDetail 后,才能被执行;Quatz 是一个特性丰富的,开源的任务调度库,它几乎可以嵌入所有的 Java 程序,从。的任务,这些任务可以用来执行任何程序可以做的事情。Quartz 可以用来创建成百上千的简单的或者复杂。是 Quartz 的默认配置文件,若在自己的项目中创建了同名的配置文件,即在自己的项目。
2024-12-01 19:11:18
3145
原创 Java实现一个雪花算法
- 第二位:占41个bit位,存储毫秒级别的时间戳。雪花算法有一个特点,首先他是64bit位的正整数,整体结构是有序的,这样数据存储在。-- 第五位:占12个bit位,存储一个序列,自增的值。雪花算法是分布式微服务下生成全局唯一的ID,并且可以做到去中心化的常用算法。-- 第一位:占1个bit位,就是0,代表是一个正整数。-- 第三位:占5个bit位,存储机器id。-- 第四位:占5个bit位,存储服务id。整体结构雪花算法是固定,但是也可以做一些细粒度的调整。雪花算法工具类,用于生成全局唯一的id。
2024-11-26 17:22:38
666
原创 设计模式之责任链模式(Chain Of Responsibility)
4)职责链模式常被用在框架开发中,用来实现框架的过滤器、拦截器功能,让框架的使用者在不修改源码的情况下,添加新的过滤拦截功能。3)客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不。1)抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和。处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。并且每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象。5)责任分担,每个类只需要处理自己该处理的工作,不能处理的传递给下一个对象完成,
2024-11-10 22:06:14
3458
2
原创 设计模式之策略模式(Strategy)
2)具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法。如果要使得程序符合开闭原。则,则需要调整ReceiptHandleStrategyFactory中处理策略的获取方式,通过反射的方式,获。3)环境或上下文(Context)类:是使用算法的角色, 持有一个策略类的引用,最终。经过上面的改造,我们已经消除了if-else的结构,每当新来了一种回执,只需要添加新的回执。策略模式最大的作用在于分离使用算法的逻辑和算法自身实现的逻辑,这样就意味着当。
2024-11-10 22:06:01
1180
原创 设计模式之模版方法模式(Template)
抽象父类:负责给出一个算法的轮廓和骨架。2)如果用户登录成功,则根据用户的借款的类型不同,使用不同的利息计算方式进。抽象父类:定义一个算法所包含的所有步骤,并提供一些通用的方法逻辑。2)模板方法可以实现一种反向的控制结构,通过子类覆盖父类的钩子方法,来决定某一个。3)在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法。1)在父类中形式化的定义一个算法,而由它的子类来实现细节处理,在子类实现详细的。2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向。
2024-11-06 22:24:20
1231
原创 线程池原理(四):工作线程的运行和线程池的关闭
通过Worker 的构造方法可以发现,是通过 ThreadFactory.newThread() 方法来创建线程的,创建线程的,所以上边 t.start() 启动线程后真正执行的就是Worker 中重写Runnable的run()通过对前边的addWorker 的解析可以发现,在addWorker方法的最后,Worker添加成功。带着这个疑问我们打开Worker 类的构造方法,看下Worker 中线程的创建过程,该方法功能是关闭线程池之前启动执行之前提交的任务,但不会再接收新的任务;
2024-11-03 21:18:28
1055
原创 线程池原理(三):ThreadPoolExecutor核心方法之execute()方法
即执行),否则maximumPoolSize。最大线程数maximumPoolSize,则创建新的线程来处理任务,执行这一步骤需要获取。线程(在这种情况下,我们总是启动一个),或当队列是满的(在这种情况下,我们必。2)如果当前运行的线程数等于或大于核心线程数corePoolSize,则将当前提交的任务放入。1)如果当前运行的线程少于核心线程数corePoolSize,则创建新的线程来执行当前提交。execute() 方法是线程池 ThreadPoolExecutor 中最核心的方法,由前边的。
2024-10-29 22:14:08
1486
原创 线程池原理(二):ThreadPoolExecutor设计原理
RejectedExecutionHandler 表示线程池中的拒绝策略,当线程池和工作队列满了后,通过。在 ThreadPoolExecutor 够造方法中,最重要的是核心线程数的确定,通常核心线程数需要。量),则创建一个新的工作线程来执行任务;来创建线程池,因为 Executors 创的线程池,线程池的很多核心参数都是默认的,不利于后期。3)线程池判断线程池中的线程是否都处于工作状态,若没有,则创建一个新的工作线程。1)线程池判断核心线程是否都在执行任务,若不是(即核心线程数没达到配置的数。
2024-10-27 20:58:15
1079
原创 线程池原理(一):线程池体系结构
了解下 Executor、ExecutorService、AbstractExecutorService 的实现,下面就分别看下。ExecutorService 接口继承了 Executor,ExecutorService主要定义了线程池的一些基本操作;在平时开发中 ExecutorService 也指代一个线程池,ExecutorService的每个实现子类都表示。AbstractExecutorService 是接口 ExecutorService 的抽象实现类,主要实现了。二、Executor。
2024-10-20 17:12:04
424
原创 设计模式之观察者模式(Observer)
一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个。者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送。对象的引用,它存储具体观察者的有关状态,这些状态需要与具体目标保。4)ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到。3)Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到。都不是主链路的功能,需要单独抽取出来,这样才能保证在后面的开发过程中保证代码。当用户单击鼠标时,订阅鼠标单击事件的函数将被调用,。
2024-10-19 11:19:25
1805
原创 设计模式之设计模式分类
创建型模式提供创建对象的机制,主要解决对象的创建问题,封装复杂的创建过程,解耦。行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者。采用组合或聚合在对象间分配行为。“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。对象的创建代码和使用代码,能够提升已有代码的灵活性和复用性。2)工厂模式(工厂方法模式和抽象工厂模式)4)原型模式(不常用)5)门面(外观)模式。
2024-10-19 09:51:06
515
原创 设计模式之享元模式(Flyweight)
可以看到 `Integer` 默认先创建并缓存 `-128 ~ 127` 之间数的 `Integer`可以看到 `Integer` 默认先创建并缓存 `-128 ~ 127` 之间数的 `Integer` 对象,当调用。对象,当调用 `valueOf` 时如果参数在 `-128 ~ 127` 之间则计算下标并从缓存中返回,一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则。2)在 Java 中,享元模式一个常用的场景就是,使用数据类的包装类对象的 valueOf() 方法。
2024-10-16 22:07:21
1360
zookeeper启动报错
2025-06-05
zookeeper启动失败
2025-06-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅