- 博客(253)
- 收藏
- 关注

原创 SpringSecurity 认证流程源码详细解读
如果这些校验都通过,就会将 result 返回。没错,他就是在套娃!点进入去之后,我们来到了 AuthenticationManager 接口,但这只是一个接口,显然不是我们要的,具体的实现代码应该在实现类中,所以我们继续选择 ProviderManager ,他是 AuthenticationManager 接口的一个实现类。点进去,发现这是 AbstractUserDetailsAuthenticationProvider 接口中的方法,而且只有一个实现,那我们继续进入实现类实现的方法。
2023-05-09 08:05:47
2038

原创 谈谈你对ThreadLocal的理解
以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
2023-03-27 08:31:04
756

原创 Java锁机制详解
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。
2023-02-07 09:52:00
1302
原创 Spring Bean 生命周期
Spring Bean生命周期概述:Spring容器管理Bean的完整生命周期,包括实例化、依赖注入、初始化及销毁等环节。核心流程可分为五步:实例化对象→属性赋值→初始化→使用→销毁;若考虑BeanPostProcessor扩展点,可细化为七步:在初始化前后插入处理器回调。理解生命周期有助于在正确时机执行资源初始化/释放、避免隐蔽问题、扩展框架功能。通过注解或接口可实现自定义逻辑,不同作用域影响销毁时机。测试程序展示了典型生命周期方法的调用顺序。
2025-06-30 08:44:46
724
原创 sentinel 综合实践
摘要:本文介绍了两种Sentinel控制台的部署方式:Docker和JAR。Docker方式使用bladex定制的Sentinel镜像,提供8858端口访问控制台,支持用户名/密码认证;JAR方式直接运行官方jar包。两种方式都详细说明了SpringBoot整合步骤,包括依赖引入和yml配置,重点讲解了transport配置(控制台连接和客户端通信端口)和actuator端点暴露。还介绍了Sentinel与Nacos的数据源集成配置,用于规则持久化。
2025-06-23 08:53:36
777
原创 ShardingSpehre 分库分表原理分析
对逻辑 SQL 进行词法和语法分析,生成抽象语法树,再通过访问者模式提取转换为,用于后续路由和改写。解析获取逻辑表名,基于分库分表策略计算路由路径,确定目标数据源与实际表名,结果封装为,供后续改写与执行使用。方法遍历中的每个RouteUnit,对逻辑 SQL 进行改写,生成对应的(包含实际 SQL 与参数)。随后按目标数据库类型进行方言级 SQL 转换,最终将结果封装为,用于执行阶段。方法根据是否包含路由单元,选择走两条不同逻辑:若包含路由信息,则调用,对每个RouteUnit。
2025-05-26 08:22:57
863
原创 sentinel滑动时间窗口算法详解
Sentinel 的快速失败(Fast Fail)是一种流控策略,用于在系统压力过大时立即拒绝超出阈值的请求,以保护系统资源。其核心特点是实时判断、立即拒绝,适用于响应时间敏感、系统资源紧张的场景,如秒杀接口或抽奖接口。快速失败的实现简单,不涉及队列或等待逻辑,但可能导致部分请求被快速拒绝,影响用户体验。相比之下,固定窗口算法虽然实现简单,但存在窗口边界问题,可能导致流量突刺和限流不准确。滑动窗口算法则通过记录每个请求的时间,能够更精确地控制流量,避免固定窗口的弊端。在高并发场景中,滑动窗口或令牌桶算法是更
2025-05-22 15:29:25
1191
原创 MySQL索引及调优篇(一)
索引是数据库用于快速定位数据记录的数据结构,类似于书籍的目录。通过索引,数据库可以减少磁盘I/O操作,提高查询效率。索引的本质是排好序的快速查找数据结构,能够实现高级查找算法。索引的优点是提高数据检索效率、保证数据唯一性、加速表连接、减少分组和排序时间;缺点是增加创建和维护索引的时间、占用磁盘空间、降低数据更新速度。在InnoDB中,索引的设计通过页分裂和记录移动来保证数据页中记录的主键值有序,从而快速定位记录。索引的使用需要综合考虑其优缺点,以优化数据库性能。
2025-05-20 09:46:29
927
原创 Docker 安装 kafka (bitnami/kafka:4.0)
这条命令启动了一个基于 Bitnami 提供的 Kafka 4.0 镜像的容器,并在 KRaft 模式(即不依赖 Zookeeper)下同时担任 controller 和 broker。它设置了时区、节点 ID、监听器及广告地址,指定数据和日志存储目录,限制了文件句柄数、内存和 CPU 使用,并在主机上映射了对应端口,保证容器重启策略为“始终重启”。命令的整体概览,然后逐行详解各个参数和环境变量的作用。
2025-04-27 19:15:43
2575
原创 Dockerfile 综合实践
Dockerfile 是一个用于构建 Docker 镜像的文本文件,包含一系列的指令,每条指令对应一个步骤,最终用于自动化创建容器化应用。运行容器:1.3 Dockerfile 常用指令1.3.1 基础镜像指定基础镜像,所有指令基于此镜像执行。1.3.2 维护者信息指定镜像的维护者信息。1.3.3 设置工作目录切换到 目录,后续命令都会在此目录执行。1.3.4 复制文件将当前目录下的所有文件复制到 目录。仅复制 和 ,用于依赖安装。1.3.
2025-04-07 08:33:34
697
原创 Docker 安装 Redis(redis:7.4)
接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败。退出容器:两次 exit ,先退出客户端连接,再退出 redis 容器。获取之后,通过 Xftp 直接上传到挂载目录即可。获取之后,可以查看已获取的镜像。windows版地址——
2025-03-31 15:26:22
787
原创 docker 安装部署 canal
canal.properties 是 canal 的主要配置文件,用于配置 canal 实例的各项参数。该文件包含了连接 MySQL 数据库、消息队列、数据同步等相关的配置项。例如canal可以有多个instance,每个实例有独立的配置文件,默认只 有一个example实例。如果需要处理多个mysql数据的话,可以复制出多个example,对其重新命名, 命令和配置文件中指定的名称一致。
2025-03-24 18:03:27
971
2
原创 pnpm 启动项目报错 Did you mean to import “@babel/plugin-transform-typescript/lib/index.js“?**
网上搜了一大堆,都是清缓存、强制下载缺失依赖之类的,问了ai 也是类似结果。没想到居然是因为项目路径太深了,或者说项目名太长了,将项目名由 UClass-magin-cube-ui 改为 uc-mc-ui 问题解决。从git上将项目下载后,重新运行 pnpm i ,下载完以来后,pnpm dev 运行项目,报上面的错,问题是什么都没改。这应该是 pnpm 的问题吧,具体是因为项目路径太长还是项目名太长我也没有验证,反正是因为项目路径深导致的,改短即可。
2025-02-28 10:05:43
587
原创 面试凉经总结(一)
OAuth2 是一种授权协议,用于在不泄露用户凭据的情况下,授权第三方应用程序访问用户数据。JSON Web Token(JWT)是一种使用JSON格式传递数据的网络令牌技术,它是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任,它可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止内容篡改。JWT(JSON Web Tokens)是一种开放的标准,用于在网络应用程序和服务之间共享安全的信息。
2025-02-24 08:33:11
988
原创 Java学习笔记(二十七)
Spring Cloud Alibaba 提供了一系列组件,帮助开发者更方便地使用阿里巴巴的云计算和微服务生态。组件作用Nacos注册中心 & 配置中心,支持动态配置管理和服务注册发现Sentinel流量控制、熔断降级和系统保护RocketMQ分布式消息队列Seata分布式事务Dubbo高性能 RPC 框架对象存储短信服务任务调度1.1 Nacos(注册中心 & 配置中心)作用:作为服务发现和配置管理工具,替代 Spring Cloud Eureka 和 Spring Cloud Config。
2025-02-17 08:51:16
1135
原创 Docker 安装 Nacos 详细步骤
* nacos中JWT令牌密钥生成器<br>* 生成 nacos.core.auth.plugin.nacos.token.secret.key 的值*
2025-02-10 08:31:15
2251
原创 Java学习笔记(二十六)
`SqlSession` 是 MyBatis 框架提供的核心接口之一,**用于执行与数据库交互的操作**。它封装了数据库连接的操作细节,提供了执行 SQL 语句、提交事务、管理缓存等功能。
2025-02-05 08:32:33
668
原创 Java学习笔记(二十五)
是 Kafka 引入的一种新的分布式共识协议,用于取代之前依赖的集群管理机制。从Kafka 2.8开始,Kafka 开始支持基于 KRaft 的独立模式,计划在未来完全移除 ZooKeeper 的依赖。1.1 KRaft 的核心概念Raft 共识协议KRaft 基于 Raft 共识协议,确保在分布式环境中,多个副本能够在网络分区或节点故障的情况下保持数据一致性。Raft 协议的核心是通过选举产生一个 Leader,Leader 负责处理所有写入请求,并将变更复制到其他节点。
2025-01-27 08:11:29
841
原创 Java学习笔记(二十四)
策略模式(Strategy Pattern)是一种行为设计模式,定义了一系列算法,并将它们封装成独立的类,使它们可以互相替换而不会影响使用它们的客户端代码。策略模式的核心思想是将行为与环境解耦,使得行为可以灵活替换。适用于需要在运行时根据条件选择不同算法或行为的情况。
2025-01-20 17:17:45
1244
原创 Java学习笔记(二十三)
Before注解用于在目标方法执行之前执行前置逻辑。@After注解用于在目标方法执行之后执行后置逻辑,无论目标方法是否抛出异常。@Around注解用于在目标方法执行前后执行自定义逻辑,并可以控制是否继续执行目标方法或改变其返回值。这些注解在Spring AOP中非常有用,可以帮助开发者在不修改目标方法代码的情况下实现各种复杂的功能和逻辑。
2025-01-13 08:32:17
1444
原创 Java学习笔记(二十二)
定义:Redis Pipeline允许用户一次性发送多个命令到Redis服务器,并接收所有命令的响应。它通过将命令打包成一个请求来实现,从而减少了网络往返次数,提高了效率和吞吐量。工作原理:在使用Pipeline时,客户端不再逐条发送命令,而是将多个命令一次性打包成一个请求包发送给Redis服务器。服务器在接收到这个请求包后,不是立即返回每条命令的执行结果,而是先将所有命令依次执行完毕,然后将所有结果打包成一个响应包返回给客户端。
2025-01-06 08:44:22
798
原创 Java学习笔记(二十一)
Redis 7 提供了多种持久化机制,以确保数据的可靠性和持久性。Redis 7 提供了多种持久化机制以满足不同的应用场景和需求。在选择持久化机制时,需要根据实际的应用场景和需求来权衡持久化和性能之间的关系。例如,可以通过调整持久化的频率、使用更快的磁盘、优化磁盘 I/O 等方式来减少持久化对 Redis 性能的影响。同时,也需要关注 Redis 的监控和调优,及时发现和解决性能问题。
2025-01-02 08:28:51
730
原创 Java学习笔记(二十)
选择建议数据量小且对性能要求高:可以考虑使用save命令,手动触发,但需要注意其对Redis服务的阻塞影响。数据量大且对性能要求较高:推荐使用bgsave命令,后台异步执行,不会阻塞Redis的主进程。持久化策略除了手动执行save或bgsave命令外,还可以通过Redis配置文件中的save选项来自动触发持久化操作。例如,可以设置“save 900 1”表示在900秒内如果有至少1个键更改,则自动触发持久化操作。注意事项。
2024-12-30 08:48:41
846
原创 Java学习笔记(十九)
需要注意的是,Redis在执行持久化操作时,可能会阻塞服务器以完成数据写入磁盘的过程。综上所述,Redis 7 默认使用RDB持久化方式,这种方式具有紧凑的文件格式和快速的恢复速度,但可能存在数据丢失的风险和fork操作带来的性能影响。这些配置决定了在特定时间间隔内,如果达到指定的键变化数量,Redis将执行一次数据持久化操作,将数据保存到磁盘上的RDB文件中。RDB(Redis Database)是Redis的默认持久化方式,它通过将Redis内存中的数据以快照的形式写入磁盘文件来实现备份。
2024-12-23 08:30:41
918
原创 Java学习笔记(十八)
`@EnumValue` 是 MyBatis-Plus 框架中的一个注解,它主要用于将数据库中的枚举类型字段映射到 Java 枚举类型。通过使用 `@EnumValue` 注解,开发者可以轻松地实现枚举值与数据库字段的映射,避免了手动转换的繁琐步骤。
2024-12-16 08:35:41
1025
原创 (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:6379 -> 0.0.0.0:0:
如果没有发现占用## windows 下 docker 启动容器报错**(HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:6379 -> 0.0.0.0:0: listen tcp 0.0.0.0:6379: bind: An attempt was made to access a socket in a way forbidden by its acc端口的进程,可以尝试重启NAT网络。
2024-12-11 08:56:34
2407
原创 前端学习随笔(一)
v-bind:用于单向绑定HTML属性或组件prop到Vue实例的数据。v-on:用于监听DOM事件并在事件触发时执行相应的方法。v-model:用于在表单输入元素上创建双向数据绑定。这三个指令在Vue.js开发中非常常用,掌握它们的用法和区别对于构建高效的Vue应用至关重要。
2024-12-09 09:25:08
769
原创 Java学习笔记(十七)
注解用于启用Spring的事务管理功能,使得开发者可以通过注解来控制事务的边界和隔离级别。当在一个配置类上添加该注解时,Spring会自动配置事务管理器,并启用注解驱动的事务管理功能。注解被用于Spring Boot应用的主配置类上,以启用服务发现功能。当这个注解被添加到配置类上时,Spring Cloud会自动配置一个客户端,该客户端能够与服务注册中心进行通信,并获取服务实例的信息。这样,应用就能够参与到微服务架构中的服务发现流程中。定义是Lombok库中的一个注解,用于自动生成equals()和。
2024-12-02 08:35:45
1305
原创 Java学习笔记(十六)
网络模型Docker网络模型包括三个主要组件:容器、网络和端点。容器是运行应用程序的独立环境,网络提供容器之间和容器与外部世界之间的通信路径,而端点则是连接容器和网络的桥梁。Docker支持多种网络类型,包括桥接网络(bridge)、主机网络(host)、覆盖网络(overlay)和无网络(none)。网络驱动程序Docker网络驱动程序负责创建和管理Docker网络。常见的驱动程序包括bridge、host、overlay等。
2024-11-25 08:27:18
982
原创 pnpm : 无法加载文件 D:\Tool\environment\NodeAndNvm\node\pnpm.ps1,因为在此系统上禁止运行脚本。
【代码】pnpm : 无法加载文件 D:\Tool\environment\NodeAndNvm\node\pnpm.ps1,因为在此系统上禁止运行脚本。
2024-11-18 15:15:06
551
原创 Java学习笔记(十五)
wait方法是Object类中的一个本地方法,用于使当前线程等待,直到其他线程调用同一个对象的notify或notifyAll方法来唤醒它。wait:使当前线程无限期地等待,直到其他线程调用此对象的notify或notifyAll方法。调用此方法后,当前线程会释放它持有的对象锁,并进入等待状态。:使当前线程等待指定的时间(以毫秒为单位),直到其他线程调用此对象的notify或notifyAll方法,或者指定的时间已过。如果在等待期间被唤醒或时间到期,线程将重新获得锁并继续执行。
2024-11-18 09:45:06
1681
原创 Java学习笔记(十四)
Java中的synchronized关键字是用于控制多线程对共享资源的访问,以保证线程安全的一种手段。它可以修饰方法或代码块,确保同一时刻只有一个线程能够执行被修饰的代码段。synchronized的实现基于JVM的内置锁机制,这种锁机制在不同的竞争状态下会表现出不同的行为,即锁的不同状态。Synchronized是Java中用于控制多线程对共享资源的访问的一种手段。它通过内置的锁机制来实现线程同步,保证线程安全。Synchronized的锁状态包括无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。
2024-11-11 08:30:28
874
原创 Java学习笔记(十三)
happens-before原则是Java内存模型中判断数据是否存在竞争、线程是否安全的依据。它定义了一系列规则,这些规则规定了哪些操作必须按照特定的顺序执行,以保证程序的正确性和线程的安全性。
2024-11-06 08:26:47
1268
原创 Java学习笔记(十二)
表示使用了连接缓存。这通常发生在连接操作(如JOIN)中,当驱动表(被连接的表,如LEFT JOIN左边的表或INNER JOIN中数据少的表)没有索引时,MySQL可能会使用连接缓存来提高查询效率。MySQL的EXPLAIN语句是优化数据库查询的重要手段,其中的Extra列包含了不适合在其他列中显示但十分重要的额外信息。时,它会返回查询的执行计划,其中包含了诸如表的访问方式、使用的索引、扫描的行数等详细信息。方法被执行时,实际上是在一个新的本地线程中,由 JVM 的启动代码间接调用的。
2024-11-04 08:51:40
987
原创 Java学习笔记(十一)
分区表是指在单节点内对表数据内容按照分区键以及围绕分区键的分区策略对表进行逻辑切分。这种切分方式是一种水平分区(Horizontal Partition)策略,它将表的数据横向拆分成更小的、更易于管理的部分。分区表增强了数据库应用程序的性能、可管理性和可用性,并有助于降低存储大量数据的总体拥有成本。是 MySQLEXPLAIN命令输出的一部分,它表示查询中每个 SELECT 子句的类型。这些类型描述了查询是如何构建的,以及查询的各个部分是如何相互关联的。通过查看。
2024-10-29 09:33:34
891
原创 Java学习笔记(十)
MyISAM和InnoDB在索引结构上的主要区别在于是否使用聚集索引。MyISAM使用非聚集索引,索引与数据分开存储;而InnoDB使用聚集索引,主键索引与行记录存储在一起。这种差异导致了它们在性能、事务支持、数据一致性等方面的不同表现。在选择存储引擎时,需要根据具体的应用场景和需求进行权衡。回表是指在执行查询操作时,MySQL首先通过索引(通常是二级索引或非聚集索引)找到满足条件的记录的主键值,然后再通过主键值回到主键索引(聚集索引)中去查找完整的记录信息的过程。
2024-10-28 14:00:33
1306
原创 Java学习笔记(九)
是 Java 反射机制中的一个接口,属于包。它的主要作用是为动态代理提供处理方法调用的能力。当使用 Java 动态代理时,可以通过实现接口来定义在代理对象上调用方法时的行为。// 定义接口// 实现接口@Override// 自定义 InvocationHandler@Override// 前置增强:打印日志// 调用目标方法// 后置增强:打印结束信息// 创建动态代理实例// 调用代理实例的方法用于创建动态代理并处理方法调用。AOP。
2024-10-24 18:22:12
1673
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人