自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(374)
  • 收藏
  • 关注

原创 GIt分支合并

Git 无法自动决定采用哪个修改,因此会在冲突的文件中标记出冲突的部分。简单来说,合并的分支与当前分支必定会有共同的父节点,git会依次执行要合并的分支上的每一次提交,最终与当前分支的最新一次提交一起生成一次新的提交。无论是否有冲突,在完成差异应用后,Git 都会创建一个新的合并提交。合并提交记录了合并操作的结果,将两个分支的修改整合到了一起。它采用的是一种基于内容的差异算法,也就是找出文件内容在不同版本之间的变化。的修改没有重叠,也就是没有对同一文件的同一部分进行修改,Git 会直接将。

2025-03-04 20:42:24 418

原创 CountDownLatch使用

如果计数器不为 0,线程就会被阻塞,进入等待状态;只有当计数器的值变为 0 时,线程才会从。方法会让调用它的线程(不一定是主线程,任何线程都可以调用)进入等待状态。只有当计数器的值从大于 0 减为 0 时,才会唤醒所有在。方法用于减少计数器的值,仅当计数器变为 0 时才会唤醒等待线程。的核心功能,但存在一些细节需要更精准地说明,下面详细解释。方法进入等待状态,直到计数器的值变为 0 才会继续执行。方法将计数器减 1,而其他线程可以调用。方法让调用线程等待计数器变为 0,这种表述大体上抓住了。

2025-03-01 13:28:36 482

原创 线程wait后的等待队列

本质上来说,wait和notify方法实现线程之间通信的核心思想是,当调用了wait方法的线程逻辑上的思想是此线程无法满足 wait方法之后的代码块的执行(例如生产/消费者模型中,消费者没有可消费的东西,生产者已经达到最大生产阈值了),故让此线程暂停执行,释放锁,加入到对象的等待队列中,并等待同一个对象进行唤醒。综上所述,在一般的同步和线程协作场景下,你的表述是成立的,但需要考虑到中断唤醒和虚假唤醒这些特殊情况。当线程调用某个对象的。,线程就进入该对象对应的等待队列,且需由该对象来唤醒”的规则。

2025-03-01 13:25:14 698

原创 数字签名 & HS256算法

HS256和AES、DES这种严格意义上的对称加密算法还不属于一种类型,HS256更偏向于哈希算法,只不过是一种可以融合用户自定义Token或者秘钥的哈希算法,生成的长度也是定长的。HS256是基于哈希消息认证码(HMAC)和SHA-256哈希函数的一种算法。它结合了密钥和消息数据,生成一个固定长度的哈希值,用于验证消息的完整性和真实性。发送方对原始数据(如文件、消息)使用哈希函数(如SHA-256)生成固定长度的哈希值(摘要)。非对称加密中,私钥加密的数据只能由对应的公钥解密,反之亦然。

2025-02-26 10:34:55 885

原创 多层代理模式解析Invocation

2. SpringMVC拦截器思想,MVC的拦截器思想,总体来说不是一个链式执行的过程,虽然效果和调用栈一个样,但是在代码底层执行时不是嵌套增强,而是串行增强。例如,有一个目标对象A,框架需要提供一种能力,来实现对A的增强,所谓的增强,就是可以在执行A之前做一些事,执行A之后做一些事。插件提供一个接口Advice,实现了Advice接口的类可以动态对A对象实现嵌套式增强,多个增强可以指定顺序、需使用代理模式实现。试想一下,在另一种场景下看,需要使用JDK代理模式对最终目标对象实现增强。

2025-02-17 21:22:46 313

原创 责任链模式解析FilterChain

既然chain.doFilter能进入下一个过滤器,那本质上就是方法的调用压栈和弹栈,一个方法的调用入口会执行完成所有的方法栈后才完成。所以chain内肯定知道下一个filter是哪个,同时chain肯定保存了最终的目标执行对象。基于以上分析,chain内部维护了一个过滤器集合,并知道下一个过滤器是哪个。B过滤器继续调用chain.doFilter会继续进入下一个过滤器。A过滤器调用chain.doFilter此时会进入到下一个过滤器。当所有过滤器都执行完成后,会进入目标方法。

2025-02-17 21:14:35 333

原创 递归&图解Json

这里是获取了node节点的所有子节点,但是每一个子节点依然还要获取它的子节点,这就产生了递归。那么递归必须要有结束条件,这里的结束条件就是当某一个子节点没有子节点时递归就结束了。这里的递归返回值是当前参数中node节点的子节点,这样,通过递归,每一层都是返回的都是带着自己子节点的节点。如果使用递归计算可以这样设计参数,第一个参数是当前值,第二个参数是累加值,这两个数执行累加,然后继续调用函数,将下一个值和累加值继续传递,直接最后的值为1,则累加1返回,注意,这里就是递归的结束条件。

2025-02-14 22:54:28 542

原创 深入理解时间戳

时间戳是指从1970年1月1日(通用协调时间)至当前时间的总毫秒数。它也被称为Unix时间戳(Unix Timestamp)或POSIX时间。在网络通信、数据库存储、日志记录等场景中,时间戳被广泛应用于标识事件发生的时间。

2025-02-13 21:51:22 1449

原创 基于Nacos配置中心的最佳实践

application.properties 指定公共配置,如果是根据环境区分,例如数据库url等,可以配置到Nacos不同的namespace下,这样,在基于不同环境启动项目时,就可以拉取到不同命名空间下的配置。使用spring.config.import引入的配置高于application.properties配置。order-group : 订单业务分组。member-group:会员业务分组。基于Nacos命名空间实现环境的隔离。基于分组实现业务隔离。

2025-02-11 22:41:21 155

原创 SpringBoot配置文件加载顺序

在 Spring Boot 应用中,配置文件的加载是一个重要的环节,它允许开发者根据不同的环境和需求来配置应用程序。Spring Boot 支持多种配置文件格式(如.yml.yaml),并且存在不同的配置文件加载位置和方式,这些加载源之间有特定的优先级顺序。

2025-02-11 22:05:45 744

原创 Socket通信端口绑定的逻辑实现

包含了服务器的 IP 地址和端口号,用于绑定 Socket 并监听客户端的连接请求。用于将数据写入输出缓冲区,用于从输入缓冲区读取数据。

2025-02-11 21:59:45 310

原创 java.lang.reflect.Type重要实现类

在 Java 中,是一个接口,它表示 Java 中的类型,包括原始类型、参数化类型、数组类型、类型变量和通配符类型等。以下是Type。

2025-02-10 22:42:01 364

原创 Maven的dependencyManagements锁定版本依赖

/</</</</</</</</</</</</</这里锁定的依赖版本是spring-cloud-alibaba-dependencies,是以pom方式引入的,说明这是一个pom工程,其中import作用是将spring-cloud-alibaba-dependenciesPOM 文件中的 部分导入到当前项目的 中,从而实现依赖版本的统一管理。

2025-02-09 21:23:37 1169

原创 bootstrap.yml与spring.config.import导入nacos配置

bootstrap.yml和application.yml可以看作是两种框架或者两种生态下的运行配置文件,对于springboot应用来说,但应用启动时,程序会从application.yml中配置的内容进行应用创建,例如@Value赋值等。而对于bootstrap.yml 主要作用是在应用启动早期配置并获取 Nacos 等配置中心的配置,这些配置会被合并到 Spring 应用的环境中,之后 Spring Boot 应用可以从该环境中获取并使用这些配置。

2025-02-09 18:55:05 1466

原创 monitorenter /moniterexit

在 Java 中,同步代码块通过和字节码指令来保证同一时刻只有一个线程能够进入同步代码块,下面从监视器(Monitor)的概念、和的工作流程以及锁的状态几个方面详细阐述其实现原理。

2025-02-09 13:56:31 372

原创 Spring-RetryTemplate

是 Spring 框架提供的一个用于实现重试机制的工具类,它可以帮助开发者在遇到特定异常时自动重试某个操作,以增加操作的可靠性。下面从使用场景、基本使用步骤、配置参数以及高级用法几个方面详细介绍。

2025-02-07 11:11:58 639

原创 Unicode不可见字符

防止字符连接:在一些语言文字系统中,某些字符在特定情况下可能会自动连接或合并显示。例如,在需要对特定字符或字符组进行特殊处理,使其不与周围字符产生默认的连接或合并效果时,就可以使用零宽度非连接符。标记特定文本区域:可以作为一种特殊的标记,用于在文本中划分或标识特定的区域或字符组合,以便后续的文本处理、分析或样式应用。“\u200C\u200C” 就是两个连续的零宽度非连接符,可能用于更复杂的文本控制或标记需求,比如强调某个区域内的字符都不应发生连接,或者在特定的文本处理流程中作为一种特殊的分隔标记等。

2025-01-21 15:25:31 543

原创 @RabbitListener处理重试机制完成后的异常捕获

这个重试器可以配置最大重试次数、重试之间间隔次数等策略配置,调用重试器的execute方法可以进行队列消费,如果在执行一次任务期间发生了异常,则会根据配置的重试次数以及间隔时间自动触发下一次重试,每一次重试都是在同一个线程中执行完成的,并且RetryTemplate会为每一次重试失败进行回调,提供了诸如 onOpen、onClose、onError等回调时机。这样,当耗尽完重试次数之后就会被回调到onError方法中执行自定义的异常逻辑处理。

2025-01-21 14:18:04 524

原创 自定义BeanPostProcessor实现自动注入标注了特定注解的Bean

如果是一个具体的类型则返回Class,如果是一个泛型类型,例如List,则返回ParameterizedType参数化类型,参数化类型的意思就是使用了泛型类型,并指定了泛型参数,这里的泛型参数就是PayDTO。MyConfigTest对象标注的@Component,如果是标注@Configuration注解,此时Spring会生成一个代理对象,通过代理对象拿不到原始对象的相关属性了。从容器中获取所有标注了MyAnno注解的Bean对象,并且遍历出是PayDTO类型的。

2025-01-19 21:32:01 504

原创 @LoadBalanced注解的实现原理

LoadBalanced注解通常结合RestTemplate使用,RestTemplate是SpringCloud提供的一个编程式的实现远程过程调用的组件,简单来说就是可以实现发送http请求。简而言之就是LoadBalancerAutoConfiguration这个类获取到了容器中所有的RestTemplate组件,并添加了负载均衡拦截器,这样@Bean的RestTemplate自动就有了负载均衡能力。看一下LoadBalancerInterceptor的实现,这个是实现负载均衡的关键。

2025-01-19 21:09:33 531

原创 SpringCloud -根据服务名获取服务运行实例并进行负载均衡

在引入注册中心相关的依赖后,注册中心的相关API会实现SpringCloud规范,自动给容器中存入DiscoveryClient对象,引入了Nacos,就是NacosDiscoveryClient。通过DiscoveryClient接口提供的能力可以从注册中心实时拉取服务列表。每个服务启动之后都要向注册中心发送服务注册请求,注册中心可以和各个注册客户端自定义协议实现服务注册和发现。LoadBalancerClient类会自动使用容器中的DiscoveryClient进行服务的负载均衡。

2025-01-19 20:47:26 522

原创 计算图片灰度值

获取图片的每一个像素点的字节数据,根据灰度值的加权公式计算出单个像素的灰度值,将整体灰度值相加除总像素。

2025-01-18 13:44:34 137

原创 ZXing实现图片中二维码面积占总面积的百分比

ZXing类库返回的二维码图片定点坐标的计算位置和图形分布有关。像素点的黑白程度影响算法的计算。

2025-01-18 13:41:49 120

原创 JS的事件循环机制

现象本质还是因为Js是单线程执行的,永远都是先执行主线程的代码,如果遇到ajax请求,setTimeout等回调,此时会继续执行主线程代码,等异步请求的响应成功或者定时器达到时间点后,浏览器会给此线程的任务队列中push一个回调函数,线程在执行完主线程代码后会一直循环时间队列。执行如下代码会发现先打印3,再打印1 再打印2。

2025-01-14 21:13:27 227

原创 word-break控制的几种容器换行行为详解

word-break 属性在控制换行行为时需要根据语言判断,对于中文 一个字符就是一个单词,字符换行不影响阅读理解,而对于英文来说,多个连续的字符才会是一个单词,例如中文的 早 英文为 morning。而对于下面的中文是可以在任意唯一换行。keep-all对于英文单词,会保持一个完整的单词不会换行,除非遇到空格,而对于中文遇到空格或者标点符合会换行,否则连续的中文字符也会保持在一行。浏览器的换行行为最少是基于一个字符为单位的,不会把一个字符拆开换行显示,例如 好 不会拆成 女 和 子 展示。

2025-01-14 09:54:09 532

原创 图解网络数据链路层与物理层的工作流程

知道对方的IP地址,还需要知道对方的MAC地址,这样数据链路层才能转发包,如何知道D的MAC地址,此时A需要先判断是否和D在同一个网络,假设A的子网掩码是255.255.255.0,与目标IP地址进行与运算,如果运算结果的网络部分和A的一致,则表示在同一个网络,此时需要发送ARP协议来广播IP地址是192.168.1.8的MAC是多少,此时交换机广播所有端口,会收到来自3号端口的相应,那么A就可以知道D的MAC地址了。在计算器网络通信中,数据链路层与网络层的转发是必不可少的。

2025-01-13 22:04:37 367

原创 Scanner的nextInt与nextLine方法的冲突

原因是在调用sc.nextInt();方法时最后一个控制字符是回车,输入了1和回车实际上是把这两个字符共同发送到了scanner的输入缓冲区中,而nextInt只会读取int类型,回车符不会读取,但是在调用nextLine方法时只要遇到回车符就结束,此时读取到的实际上是nextInt方法最后的一个回车,在输入缓冲区中。所以nextLine既然读到了内容,则不会再阻塞。在nextInt之后手动再调用一个nextLine消耗掉输入缓冲区中的换行符即可。控制台并没有阻塞让输入。

2025-01-12 16:55:29 203

原创 基于Socket和ServerSocket自定义协议的实现多端通信、消息发送、群聊发送

操作枚举类,定义服务端支持的操作SEND_TO_USER(1,"单发消息"),SEND_TO_GROUP(2,"群发消息"),USER_LOGIN(3,"用户登录"),CREATE_GROUP(4,"创建群聊"),LIST_ONLINE_USER(5,"列出所有在线用户"),LIST_GROUP_USER(6,"列出某个群聊的在线用户"),LIST_USER_GROUP(7,"列出当前用户加入的群聊");@Getter@Getter定义通信用到的常量。

2025-01-12 16:22:26 971

原创 基于Socket实现Http类SSE效果

不同的应用软件,例如Mysql、kafka、nacos等在与各种程序或者自己的集群交互时,都制定了类似于上述自定义实现的sse协议一样,双方约定好一次请求与响应的数据格式 开始和结束的标志。那么各个应用程序时间都可以基于Socket实现最底层的数据传输通信。客户端通过两次接收控制台输入后,发送给了服务器,服务器接收到以后将准备好的数据进行分段发送,每一段发送16个字节,并封装为一个json数据,当发送数据的长度为0时,表示服务器本次发送的数据完成,客户端可以解析了。2. 服务器输出效果。

2025-01-10 22:20:50 705

原创 CAS机制实现多线程并发访问

CAS机制由CPU提供原子操作保障(以下操作由CPU层面保证原子性,CPU保证了多线程环境下不会对CAS机制造成重复覆盖问题,一旦进入此操作就必须是一个原子操作了,可以这样理解,【CAS机制是CPU层面提供的最小粒度的同步代码块】)1. 主内存取值2. 比较期望值3. 一致则更新主内存值,不一致则更新失败多线程CAS机制下更新失败的原因,主要就是比对失败1. 一个线程工作内存中的数据在比对时,对比预期变量的值已经不一致了,导致此线程更新失败。//非CAS的自旋无法实现,

2025-01-10 21:32:55 236

原创 窗口API

窗口:在一段时间语义下的时间范围,可以是分钟、小时、甚至是天、月等。基于一段时间范围内做的数据统计、PV 、UV等。一般窗口都是结合窗口函数进行统计后输出一个结果。窗口的分类滚动时间窗口是按照事件时间或者处理时间对到达的流数据进行开窗处理,一个事件只会被分配到一个窗口,在事件时间、滚动窗口下,一个时刻由于设置了WaterMark延迟,同一时刻可能会到达多个窗口,但是一条事件数据只会被分配到一个窗口。

2025-01-10 21:31:56 533

原创 继承ArrayList,实现自定义集合的FlatMap方法

自定一个实现类,满足需求:将集合中的元素按照规则,转换一个Map集合中的元素为List,调用方法转为mapMap的Key可实现自定义,Value可实现自定义函数式接口的泛型实现,定义了两个泛型元素,K,E,这两种数据类型,有两种确定时机,

2025-01-10 21:31:18 497

原创 基于wait/notify方法 实现生产/消费者模型

当消费者每消费完一个消息,都会执行notify方法,这样可以保证唤醒所有生产/消费线程。不管是生产/消费谁拿到锁,都会判断是否达到阈值,如果达到。

2025-01-10 21:30:37 246

原创 手写模拟基于Socket通信协议

一个ServerSocket背后关联了一个请求队列,当客户端发送连接请求时,操作系统会将这个连接请求存入到当前ServerSocket的请求队列中,当ServerSocket调用accept方法,表示允许服务器接收一个客户端的连接请求,此时就会从队列中取出一个连接,操作系统建立好连接以后,创建一个新的Socket对象并返回 ,这个Socket对象绑定了进程Id,服务器IP和端口,客户端IP和端口。缓冲流write方法不发送数据。网络协议栈传输数据示例图。

2025-01-10 21:22:54 772

原创 手写@MapperScan

这个类实现了FactoryBean 接口,实现了这个接口的类Spring会进一步调用getObject方法创建Bean对象,这个Bean对象的类型是getObjectType返回的数据类型,由此,这个类型就是真正的Mapper接口类型,可以实现基于Mapper接口的自动装配。这个类封装了代理对象的核心方法,主要就是获取mapper接口上标注了@Select @Update @Delete注解的方法,解析sql参数,获取sqlsessionfactory,然后执行sql。这里简单模拟输出获取到的sql。

2025-01-08 22:38:34 274 2

原创 手写@EnableTransactionalManagement

【代码】手写@EnableTransactionalManagement。

2025-01-08 22:22:00 280

原创 事务的回滚与失效行为

创建一张测试表。

2025-01-08 21:44:58 352

原创 进程和端口号的关系

服务端的ServerSocket在accept监听客户端连接时,其实是从一个队列中获取的,所有的客户端连接请求都会被操作系统调度到ServerSocket的队列中,ServerSocket会一直从队列中获取请求连接,然后建立socket,实现数据传输。

2025-01-07 22:43:25 509

原创 Seata实现分布式事务的过程以及原理

上面说到,seata的全局事务中,每个事务是自动提交,回滚是靠undo_log回滚的,此时在执行undo_log将数据反向回滚时,seata会比对更新数据前的状态,例如库存,原有库存数量是100,扣减了10个,还剩90个,此时seata会记录表中更新后的数据,此时如果手动更新了数据,把90改成40,则seata在全局回滚的时候就会报错,因为Undo_log记录的原始数据发生了变更,与seata更新后的结果不一致,则无法实现通过undo_log回滚。此时整个全局事务的状态为回滚成功。

2025-01-07 22:38:40 710

原创 SPI机制模拟日志处理器自动适配

核心组件:SPI 机制主要涉及到服务接口(Service Interface)、服务提供者(Service Provider)和服务加载器(Service Loader)。只要按照 SPI 的规范,实现接口并在配置文件中添加对应的全限定名,框架就能自动加载新的实现,无需修改框架的核心代码。例如,在不同的环境下(开发环境用控制台日志,生产环境用文件日志)可以通过配置文件选择不同的服务提供者。解耦:使得框架和具体的实现分离。框架只定义接口,而具体的功能实现由不同的服务提供者完成,方便团队分工和模块的独立开发。

2025-01-04 15:57:52 264

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除