- 博客(71)
- 收藏
- 关注
原创 nacos 2.5.1 心跳源码解析
可以把 gRPC 长连接想象成一条电话线正常挂断(情况一):对方说“再见”然后挂机。你立刻知道通话结束了。线路被剪断(情况二):你听到忙音或噪音,需要一点时间确认对方不在。对方突然昏迷(情况三):电话通着,但对方一直不说话。你怎么知道他还在不在?你的做法就是:每隔几秒问一句“喂,你还在吗?”(这就是如果连续问了几次都没回应,你就断定他出事了,然后挂断电话(将实例标记为不健康)。所以,结论是:通道状态检测:用于快速处理正常关闭(情况一)。应用层心跳:用于检测网络中断。
2025-08-30 11:13:45
1002
原创 如何理解 nacos 1.x 版本的长轮询机制
长轮询不是 “定时发 HTTP 请求”,而是 “客户端发请求,服务端挂起 30 秒,有更新就响应,超时才返回空”,核心是 “按需响应”,减少无效请求。Nacos 1.x 用长轮询解决服务发现的 “实时更新” 和心跳的 “存活检测”,平衡了 HTTP 协议下的实时性和资源开销。长轮询的局限性(连接无法复用、实时性有上限),促使 Nacos 2.x 改用 gRPC(基于 HTTP/2 多路复用、Protobuf 高效序列化),进一步提升性能和实时性。
2025-08-30 09:31:30
822
原创 垃圾回收器简述
java8是如何管理这 1G 的内存的?可以看到, 绿色 和 蓝色 泾渭分明 左边的就是 新生代 右边的蓝色就是 老年代 ,井水不犯河水在细致一些的话,新生代里面还是有更小的划分的:但是!即便划分的在小,java8的默认垃圾回收器,是对 整个 新生代 做操作,不会说只对 伊甸园 做操作,也不会出现只对 s0/s1 进行操作。就像一个很持家的人,手上有 绿豆和 蓝豆,必须划分好放在规定的区域才可以。
2025-08-18 14:48:29
383
原创 windows版本:Prometheus+Grafana(普罗米修斯+格拉法纳)监控 JVM
然后就可以启动项目,访问 xxxxxxxxxxx/actuator/prometheus 这个地址了。下载 windows amd64 的zip 包 下载之后修改一下 目录里面自带的 yml 文件。如果看到下面这样的文字, 这一步就完成了。官网很慢,这里我推荐使用国内的镜像。所以就有了下面的 内容。看到下面的展示就算成功。
2025-08-12 17:34:46
998
原创 写一个自己的spring-boot-starter快速启动依赖
在日常的开发中,常常回去使用别人提供的 xxx-spring-boot-starter 是否想过自己去写一个首先确认,使用的springboot的版本是多少?我这里使用的是 2.6.13的版本,所以我使用来完成自动装配如果使用2.7版本以上的springboot,那么推荐使用。
2025-08-01 09:38:20
452
原创 rabbitmq的安装和使用-windows版本
RabbitMQ 需要 Erlang 运行时环境,因此需要先安装 Erlang,再安装 RabbitMQ。现在你的 Spring Boot 应用已经可以生产和消费 RabbitMQ 消息了!来简化 RabbitMQ 集成。确定好版本之后,下面开始正式安装。Spring Boot 提供了。如果显示版本号,说明安装成功。
2025-07-31 14:49:00
676
原创 面试遇到的问题3
10>=0<010分钟未支付订单✅:Redis 单机 QPS 可达 10W+,INCR是原子操作,避免超卖。✅:直接利用 Redis 的原子性,无需额外分布式锁。INCRINCRINCRINCRREDLOCKINCRhash tagINCRstock:skuA剩余>0INCRINCR。
2025-07-29 15:33:17
995
原创 redis集群的配置和使用
这边有两台windows电脑windows电脑A-192.168.3.35windows电脑B-192.168.3.5ubuntu电脑C(在电脑B上面使用vmware模拟出来的环境)-192.168.3.151。
2025-07-24 11:12:00
464
原创 面试遇到的问题
大 Key是指存储在 Redis 中单个 Key 对应的 Value 过大(通常以 KB 或 MB 为单位),导致 Redis 性能下降或稳定性问题的现象。内存占用高:单个 Key 占用大量内存操作阻塞:对大 Key 的操作耗时过长,阻塞 Redis 单线程网络负载大:传输大 Key 消耗过多带宽持久化问题:AOF 重写或 RDB 保存时处理大 Key 效率低@Override@Override@Override@Override。
2025-07-15 23:36:43
634
原创 H2在springboot的单元测试中的应用
这正是它成为 Java 单元测试首选数据库的原因。H2 通过极简的设计实现了单元测试的核心需求——以上代码经过实地的验证,可以运行。
2025-07-12 14:19:36
989
原创 Security+JWT的方式做权限校验
本文摘要: 实现基于JWT的安全认证系统,主要功能包括: 使用JWT令牌包含用户名、ID和权限信息,2小时有效期并支持续期 提供/login/login登录接口,接收MD5加密密码(盐值jiubodou) 权限分配方案:hyl用户拥有user/employee/root权限,mang有user,jiubodou有user/employee 通过注解方式实现权限校验(只需匹配任一权限即可) 全局可访问用户上下文信息 技术实现:Spring Security + JJWT,配置无状态会话和CSRF防护 关键组件
2025-07-03 15:29:49
613
原创 springboot 中使用 websocket
文章摘要:本文介绍了Spring Boot中WebSocket的实现方式,只需两步配置即可使用:1)通过@EnableWebSocket注解和ServerEndpointExporter开启WebSocket支持;2)使用@ServerEndpoint注解编写处理类,定义连接建立(@OnOpen)、关闭(@OnClose)、消息接收(@OnMessage)和异常(@OnError)的回调逻辑。WebSocket协议基于HTTP握手升级,支持全双工通信(如电话),不同于半双工(如对讲机)和单工(如广播)。路径
2025-07-03 15:10:06
1320
原创 springboot中的事件发布和监听
本文介绍了Spring事件机制实现用户登录事件处理的完整流程:1) 定义UserLoginEvent继承ApplicationEvent;2) 在LoginService中使用ApplicationEventPublisher发布事件;3) 通过@EventListener注解创建监听器处理事件。示例展示了从事件定义、发布到监听的完整链路,并验证了同步执行效果。该机制可实现业务解耦,默认同步处理,通过@Async可改为异步方式。
2025-07-03 14:57:47
252
原创 回调函数的简单入门
本文展示了一个简单的Java代码示例,演示了如何通过接口实现方法的前置和后置处理。代码定义了QianZhi和HouZhi两个接口,分别包含前置和后置方法。CountStart类的begin方法接收一个数字参数和两个接口实例,在执行主要逻辑(打印数字)前后分别调用前置和后置方法。测试类通过lambda表达式实现了具体的前置(搬椅子)和后置(还椅子)操作。这个示例展示了Java中回调机制的基本用法。
2025-07-03 14:32:05
136
原创 @RequiredArgsConstructor
在Spring框架中,@AllArgsConstructor和@RequiredArgsConstructor是Lombok提供的两个常用注解,用于自动生成构造方法。两者的主要区别在于生成的构造方法的参数范围不同。@AllArgsConstructor会为类中所有非静态成员变量(包括final和非final)生成全参数构造方法,适用于需要注入所有字段的场景。而@RequiredArgsConstructor仅为类中所有final字段或标有@NonNull的字段生成构造方法,适用于仅需注入必需依赖的情况。在S
2025-05-20 09:03:53
888
原创 AQS和ReentrantLock
AQS通过一个FIFO(先进先出)的等待队列来管理多线程对资源的访问。它允许开发者通过继承AQS来创建具体的同步器,并利用AQS提供的模板方法来实现同步逻辑。功能:AQS主要提供了两部分功能,一是操作state变量(表示资源是否被占用),二是实现排队和阻塞机制。AQS并没有实现任何同步接口,它只是提供方法,调用这些方法可以实现锁和同步器。
2024-10-18 14:47:50
459
原创 死锁和活锁和线程饥饿
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,它们都将无法推进下去。原因:两个或两个以上的线程共同访问两个或多个相同的资源(如对象锁),并且每个线程都持有部分资源同时等待其他线程释放它所需要的资源,从而导致所有线程都无法继续执行。
2024-10-16 18:14:17
312
原创 CAS相关知识
了分层级的策略来优化性能,锁的状态由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。以下是关于这些锁状态的详细解释:==无锁状态:==这是对象的初始状态,表示没有任何线程持有该对象的锁。==偏向锁:==偏向锁是为了优化只有一个线程访问同步块的场景。当一个线程首次获取锁时,锁会进入偏向锁状态,并在对象头中记录持有锁的线程ID。此后,该线程再次获取锁时,只需比较对象头中的线程ID,无需进行额外的CAS操作,从而降低了获取锁的开销。
2024-10-16 17:02:19
745
原创 threadlocal的相关知识
开放寻址法(线性探测法)是一种解决哈希冲突的方法,属于开放寻址法的一种具体实现方式哈希函数计算:首先,使用哈希函数计算键的哈希值,以确定其在哈希表中的初始位置。冲突检测:如果初始位置已被占用(即发生冲突),则使用线性探测法查找下一个空闲位置。线性探测:从发生冲突的位置开始,依次检查下一个位置是否为空。线性探测的增量序列通常为di=1, 2, 3, …, m-1(其中m为哈希表长度)。即,如果初始位置为x,则探测过程为x+1, x+2, x+3, …, 直到找到空位置。
2024-10-16 16:06:02
698
原创 Spring的启动,以及对于一些问题的思考
因为我在学习的时候,老师教的是,最好是按照标准去使用注解,为其分类,但是在大多数情况下,没什么区别,是这样吗?所以说,可以在这个类中使用 @Bean 这类注解来向容器注入一个 bean(我们常在@Configuration中也是这是这么做的),但是的确,很少有人会这么做,为什么?如果一个本应该被标记成 @Repository 的类被 标记成了@Component 那么程序在没有出现异常的情况下可以正常运行嘛?这就是一个最简单的,也是最常见的启动springboot项目的一个方式,首先是。
2024-10-14 15:07:27
344
原创 一些关于线程之间协作的心得
首先看代码当我看完这个答复之后,我觉得 join 其实和 线程之间的执行顺序,或者说调度息息相关,它在多线程并发执行以用来提高效率方面,好像没那么明显。
2024-09-23 17:47:24
331
原创 异常处理相关心得
没有人会点击一个接口之后,立马去看日志,当我们发现线程池中的任务执行失败的时候,很可能是1个小时以后的事情了,那个时候再去翻找日志太麻烦,所以说及时通知到群里才是最可靠的。
2024-09-03 18:32:00
558
1
原创 ThreadLocal的使用
这里为了更加还原真实的线上环境,直接就用了 拦截器+统一返回+全局异常捕获+ThreadLocal,项目还是比较完整的。
2024-06-21 11:50:19
604
原创 java11运行rocketmq
java11作为一个长期支持的版本,相信有很多人是在使用的,但是 rocketMQ 是java8开发的,所以 mq的相关的 sh脚本也是在 java8的环境下编写的,所以想要 在 11的环境下运行 rocketMQ,是需要做一些改变的。我的设备是 2核 2G 的centos7设备,一般情况下还会开启 redis 和 mysql 和 运行rocketmq的可视化界面的jar包, 所以 rocketmq 的 参数我调的很小 只有128m。一、runserver.sh。
2024-05-22 11:26:32
423
原创 validation的简单使用
那么问题就是怎么写,我们找一个现成的 @NotNull复制一下,改改代码validatedBy = {MobileValidator.class}//注意,这里是需要我们自己写的String message() default "手机号码有误";Class<?Class<?/*这两个泛型,前者是注解类型 ,后者是 要检验的值是什么类型*/@Override/*s就是前端传过来的值*/@Data@ToString@NotBlank(message = "名字不能为空")
2024-05-06 15:40:09
630
原创 mybatis使用xml中的if-else/choose
最近需要使用 xml 文件来实现一些增删改查,此文对 其中的 if-else 加以说明。然后在 xml 文件中写这个方法的具体实现。首先肯定是在 mapper 里面有一个方法。那么使用 xml 怎么来使用和接收呢?有一个引用类,假设叫 Student。
2024-04-19 17:13:20
3331
原创 定时任务--静态 和 动态
动态任务就是说,从数据库中读取循环时间,数据库中只要改动,那么项目中的循环时间就会随之改变,所以说项目中引用了 mybatisplus ,而库中存的内容很简单。随着项目的启动而启动,如果需要更改循环时间,需要重启应用。
2024-02-05 11:02:23
489
原创 用Integer当作锁的时候的注意事项
这里记录了对象的地址在值变化的时候就会使用到这里的原对象的地址,所以说地址最终是不会变的。使用 AtomicInteger 就可以了。前几天看到一个经典的面试题。下面使用另外一种方式。
2023-07-28 15:16:06
270
原创 Spring源码的一些理解---事务中的动态代理
spring 的事务和动态代理是息息相关的,也常常一不注意就事务失效,那么想弄明白失效的原因要从 spring 的动态代理说起。
2023-06-20 10:16:16
696
原创 reentrantLock的使用
那么有没有其他方法来解决这个并发问题呢,其实是有的,我们使用redis,其中有一个操作就是 原子性的增加/减。8个现成循环5次,也就是说,最终redis里面值应该是 100+40=140,但是结果是130。很简单,就是将redis里面的值拿出来以后,加一再放回去,但是如果是并发场景下呢?执行结果也肯定不会是 130-40=90。同样的,如果不加锁的情况下去执行 minusNum,往redis里面放一个值,num,值设置成100。我们这里使用 ApiFox来测试一下。这样也可以保证并发情况下的数据一致性。
2023-05-23 16:30:20
247
Maven项目间依赖构建
2025-04-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅