自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 netty实现websocket握手前鉴权和针对广播的优化

现在用netty实现了websocket,决定在建立连接前添加鉴权。首先想到的就是在后面添加一个鉴权,这有一个问题。就是执行到HandshakeHandler时,服务端已经向客户端发送了101,同意握手了。这个时候如果鉴权不通过,相当于多响应了一次服务端。

2024-08-29 21:27:04 1513

原创 Spring Boot集成单元测试之如何mock

单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。驱动代码是用来调用被测函数的,而桩代码和 Mock 代码是用来代替被测函数调用的真实代码的。Stub(桩对象):Stub通常用于替代测试对象的某些部分,以便进行单元测试等测试。例如,当被测代码需要访问外部数据源或者调用其他函数时,我们可以使用Stub来模拟这些依赖项的行为,从而使得测试过程更加独立和可控。

2023-11-09 20:56:11 2889

原创 Redis 7.0 Multi Part AOF 源码解析

Mulit Part AOF源码解析

2023-03-01 15:37:59 1172

原创 分布式事务详解,并带有lcn源码解析。

为什么需要分布式事务?

2023-02-16 21:36:30 1274

原创 xxl-job源码解析(看这一篇就够了,超简约且详细)

服务端启动流程首先找到配置类 XxlJobAdminConfig 可以发现该类实现 InitializingBean接口,这里直接看 afterPropertiesSet方法即可。 @Override public void afterPropertiesSet() throws Exception { //利用静态声明的只会加载一次的特性,初始化一个单例对象。 adminConfig = this; //初始化xxjob调度器

2021-04-12 19:43:54 32561 39

原创 手写可视化逆向工程(一键生成mapper->controller->vue)

https://github.com/wangchao550586585/codegen一键生成mapper->service->controller->vue增删改查通用模板,即拿即用,无需任何修改(尚未公开,公司内部使用)设计目的 公司目前从0开发CRM,主要开发文章,视频等内容,发现通用的逻辑可直接代码生成,于是花费3天写了一个复合公司业务场景需要的可视化逆向工程脚手架.涉及技术spring-boot freemarker难点:几乎没有...

2020-12-01 23:32:34 901

原创 手写分布式id生成器

如何设计一个分布式id生成器设计目的 解决目前公司订单目前采用UUID的问题方案选型技术抉择设计草图目录结构执行结果100个线程同时创建1000个id,步长设置为100,方便测试极端情况核心代码出现问题当设置步长为100,并开启100线程时,在1这里返回-1,于是外层添加while循环,不断重试获取.程序执行完毕后,测试代码一直运行,发现不是这里代码的问题经过检测,发现没有死锁,线程都处于waiting状态在...

2020-11-17 20:36:30 447

原创 Cselect、poll、epoll、以及手写简易libevent反应堆源码

文章目录selectpollepoll反应堆select#include <stdio.h>#include <sys/socket.h>#include <stdlib.h>#include <unistd.h>#include <ctype.h>#include <arpa/inet.h>#include "warp_socket.h"#define PORT 8080/** * select * 缺点

2020-09-29 23:44:01 583

原创 IO内存以及Reactor模型(更新完了)

同步IO对文件设备数据的读写需要同步等待操作系统内核,即使文件设备并没有数据可读,线程也会被阻塞住,虽然阻塞时不占用CPU始终周期,但是若需要支持并发连接,则必须启用大量的线程,即每个连接一个线程。这样必不可少的会造成线程大量的上下文切换,随着并发量的增高,性能越来越差。select模型/poll模型通过一个线程不断的判断文件句柄数组是否有准备就绪的文件设备,这样就不需要每个线程同步等待,减少了大量线程,降低了线程上下文切换带来的性能损失,提高了线程利用率。这种方式也称为I/O多路复用技术。sele

2020-07-24 13:12:01 692

原创 java常见问题(不断更新,附源码解析)

面试过程中遇到了很多问题,之前只是看了源码,但并未深究相关问题.现在开始带着问题去看源码.KO!!! 感觉就像使用费曼学习法一样,每次面试都能提高自己.open-jdkThreadLocal添加链接描述为何存在内存泄漏问题?内存泄漏的根本原因是强引用和弱引用的生命周期不一致造成的.ThreadLocal作为一个虚引用的key,当被GC回收时,但是value,被当前线程的ThreadLocalMap持有,只要当前线程不销毁,或者没调用get/set方法(调用get/set时,会清除null为key

2020-07-24 12:25:41 2938

原创 分布式常见问题

一致性session一致性tomcat广播 优点:简单容易实现 缺点 当服务器多的时候,广播占用大量带宽,而且每台服务器保存session占用内存客户端存储 优点 服务器不需要存储 缺点 每次请求需要携带session,占用带宽 安全问题 session存储客户端,受限于cookie限制nginx固定分配一台服务器处理 4层代理hash,使用ip作为hash分配服务器 7层代理hash,使用业务属性分配,如order_id,user_id等 优点: 只需要修

2020-06-11 13:20:51 6636

原创 历史文章汇总

历史汇总

2025-02-27 11:32:11 247

原创 netty源码解析八之pipeline | 详解所有 IO 事件的触发时机以及传播路径

从以上描述中,我们也可以窥探出,Netty 引入 ChannelHandlerContext 来封装 ChannelHandler 的原因,在代码设计上还是遵循单一职责的原则, ChannelHandler 是用户接触最频繁的一个 netty 组件,netty 希望用户能够把全部注意力放在最核心的 IO 处理上,用户只需要关心自己对哪些异步事件感兴趣并考虑相应的处理逻辑即可,而并不需要关心异步事件在 pipeline 中如何传递,如何选择具有执行条件的 ChannelHandler 去执行或者跳过。

2025-02-25 20:19:40 581

原创 netty源码解析七之WriteAndFlush流程

flush0 方法这里主要做的事情就是检查当 channel 的状态是否正常,如果 channel 状态一切正常,则调用 doWrite 方法发送数据。//待发送数据缓冲队列 Netty是全异步框架,所以这里需要一个缓冲队列来缓存用户需要发送的数据//是否正在进行flush操作//再次检查是否正在进行flushreturn;//channel已经关闭或者outboundBuffer为空return;/*

2025-02-25 20:18:32 890

原创 netty源码解析六之Recycler对象池

站在业务的角度,业务线程处理的都是对象级别这个维度,并不需要知道对象池的存在。所以使用完对象后,调用对象的回收方法recycle将池化对象回收掉即可。

2025-02-25 20:16:59 888

原创 netty源码解析五之接收客户端的发送数据

Sub Reactor轮询到NioSocketChannel上的就绪,随后Sub Reactor线程就会从JDK Selector上的阻塞轮询API调用中返回。转而去处理NioSocketChannel上的。Reactor在处理Channel上的IO事件入口函数为。当前的执行线程现在已经变成了Sub Reactor,而Sub Reactor上注册的正是netty客户端NioSocketChannel负责处理连接上的读写事件。这里入口函数的参数则是IO就绪的客户端连接。此时unsafe为NioByteUns

2025-02-25 20:14:30 646

原创 netty源码解析四之接收网络连接

在创建NioServerSocketChannel的时候会创建NioServerSocketChannelConfig//设置非阻塞//相当于把本类和ServerSocketChannel存储配置中在创建NioServerSocketChannelConfig的时候会创建RecvByteBufAllocatorNioServerSocketChannel中的RecvByteBufAllocator实际类型为。

2025-02-25 20:13:11 628

原创 netty源码解析三之Reactor运转架构

OP_WRITE事件的注册是由用户来完成的,当Socket发送缓冲区已满无法继续写入数据时,用户会向Reactor注册OP_WRITE事件,等到Socket发送缓冲区变得可写时,Reactor会收到OP_WRITE事件活跃通知,随后在这里调用客户端。接着将空转次数重置0。这里会出现一个问题,倘若reactor一直阻塞等待就绪事件到来,此时来了异步任务,且没有io就绪任务到来,这里会怎么处理了?当Reactor轮训到io事件或异步任务时,会被唤醒执行,当然不会无限的执行异步任务从而影响io吞吐,这里通过。

2025-02-25 20:11:58 874

原创 netty源码解析二之启动ServerBootstrap

当通道激活完成后(所有的业务处理器添加,注册的异步任务完成,并且NioEventLoop线程绑定的异步任务完成),会调用fireChannelActive,触发通道激活事件。这里创建了一个ServerSocketChannel,并注册OP_ACCEPT事件,创建channel的配置类,该类封装了当前对象和nio原生socket。可以看出该类通过泛型T加反射创建对象的,泛型T继承channel,表示通过工厂反射创建channel类型。到现在为止,Netty服务端就已经完成了绑定端口地址的操作,

2025-02-25 20:10:15 644

原创 netty源码解析一之创建Reactor

Netty中的Reactor是以Group的形式出现的,主从Reactor在Netty中就是主从Reactor组,每个中会有多个Reactor用来执行具体的IO任务。当然在netty中Reactor不只用来执行IO任务,这个我们后面再说。中的Reactor数量取决于服务端要监听的端口个数,通常我们的服务端程序只会监听一个端口,所以只会有一个绑定端口地址接收客户端连接。也就是上篇文章笔者为大家举的例子,饭店最重要的工作就是先把客人迎接进来。里有多个Reactor线程,Reactor线程的个数可以通过系统参数。

2025-02-25 20:07:12 836

原创 令牌桶算法

【代码】令牌桶算法。

2024-12-26 14:22:45 113

原创 spring-boot 启动耗时分析

https://github.com/linyimin0812/spring-startup-analyzer/blob/main/README_ZH.md

2024-07-02 21:04:24 239 1

原创 redis内存分析

.\rdr-windows.exe show -p 8080 .\1.rdb .\2.rdb .\3.rdb .\4.rdb .\5.rdb

2024-07-02 20:43:11 176

原创 spring分布式锁

锁的持有者释放锁后,有竞争线程在等待锁,最多需要自旋100ms才能检测到锁的释放,没有主动唤醒机制。没有看门狗机制,不会自动续期,设置默认过期时间后,就剔除redis,key了。

2024-07-02 20:42:35 300

原创 处理宿主机cpu过高问题,导出火焰图

常见的火焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 等等。他们分别适合处理什么样的问题呢?

2024-07-02 20:40:41 276

原创 从0到1实现MQ

一级标题二级标题三级标题四级标题五级标题六级标题

2023-08-23 19:45:22 170

原创 nginx源码解析-clion编译

第六步:接着编译提示没conf。咱们把conf目录下nginx.conf和mime.types迁移到debug目录。以及html目录下文件迁移。第一步:新建cmake文件到auto/目录下。第五步:这个时候会爆没有log文件错误。第七步:启动成功,访问。第四步:启动nginx。

2023-08-01 18:04:51 665

原创 RocketMq图解

图解1)produce1)1:发送消息流程图2) broker2)1:broker接收消费信息流程2)2:FlushRealTimeService异步刷盘过程2)3:AllocateMappedFileService异步创建commitlog文件2)4:实时更新ConsumeQueue与Index文件3)consume总览1)produce1)1:发送消息流程图2) broker2)1:broker接收消费信息流程2)2:FlushRealTimeService异步刷盘过程2)3:Allo

2023-07-12 15:39:10 209

原创 代理服务器开发之java nio串包

最近在开发http代理服务器,部署到环境上。发现丢包很严重,偶尔能够github但是访问炒鸡慢,后来发现是被长城拦截了。用sockes5,则百度访问超时,谷歌正常。可我就想用http代理搞一个。于是写了一个客户端和服务端。客户端包括:http隧道代理服务器+websocket客户端服务端包括:websocket服务端+http隧道客户端。以及另外一个http隧道服务端。在开发过程中,websocket在65535以内的数据报文中表现不错,性能比node.js写的快了很多倍。

2023-06-08 16:32:14 214

原创 aws配置https证书

server:表示测试是否可用。避免生成过多的证书。成功之后删除server命令再次执行一次。这里说需要下载socat。​ # 超时配置。要不然会出现如下错误。

2023-05-22 13:42:30 1610

原创 netty多节点群发消息

最基本的通讯方式存在问题。

2023-03-05 17:17:50 464

原创 ConcurrentHashMap源码解析(看这一篇就够了,超简约且详细)

作者 Doug Lea 本身对这个问题有过回答,在并发编程中,null 值容易引来歧义, 假如先调用 get(key) 返回的结果是 null,那么我们无法确认是因为当时这个 key 对应的 value 本身放的就是 null,还是说这个 key 值根本不存在,这会引起歧义,如果在非并发编程中,可以进一步通过调用 containsKey 方法来进行判断,但是并发编程中无法保证两个方法之间没有其他线程来修改 key 值,所以就直接禁止了 null 值的存在。返回的时候n+1,有返回了当前值。

2023-02-11 18:11:06 1339

原创 【2021】今年总结,明年展望。

阅读书籍15本技术提升xxljob源码解析,并在公司分享。)springboot源码解析netty源码解析个人总结今年看书相较往年有所锐减,更多的时间不是放在技术和阅读上。而是走出舒适圈,基本每周都会安排爬山。喜欢独自走在荒无人烟的山上,倾听鸟叫,感受微风拂过脸颊,无比惬意,无比舒适自由,顿时心中因为都市的生活带来的压力,一扫而空。今天公司刚好给12月生日的小伙伴庆生。然后刚好有个对星座很懂的小姐姐,我无聊问了句对射手座的看法,她说射手座很浪,极其不稳定。这点我是认同度的,往年我时常给

2022-01-01 01:58:49 299

原创 springboot CORS 跨域请求解决三大方案,springboot CorsFilter解决跨域问题

https://www.cnblogs.com/fanshuyao/p/14030944.html实战代码package com.tenclass.nvwavmtool.server.common.config;import lombok.val;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.spr

2021-12-03 15:49:33 279

原创 BeanUtils.copyProperties为嘛Copy不了内部类?

@TOC今天内部类copy失败,但是封装List的却成功了。查看源码isAssignableFrom:rhsType表示是否是lhsType子类或子接口。isPrimitive:表示是否是基类,也就是不是内部类。这里内部类会失败,主要是因为这二个条件判断失败。但是List包装的成功,是因为编译后泛型擦除,导致实际比较的是ArrayList类,所以这里直接返回true。...

2021-09-07 20:35:38 1369

原创 大量time-wait,造成tomcat假死

问题定位:端口占用导致超时。通过分析堆栈,发现所有的线程都阻塞在一块了。初步怀疑tomcat连接数少了,后来看到都处于wait状态。那么就怀疑线程挣抢原因,top命令查看cpu没高峰,而且tomcat最大才10个。定位redis 游标scan命令,但是db库数据比较少,原因排除。接着怀疑xxljob频繁访问造成的,有几个一秒执行的job。然后发现堆栈信息中的确xxljob在run。查看xxljob后台,发现全部成功。没有失败的。那就纳闷了,xxljob全部成功,但是对外tomcat响应超时。xxljob

2021-07-31 00:25:20 4146

原创 执行器启动成功后,控制台一直反复报:xxl-rpc provider netty_http server caught exception

翻阅了xxljob,找到了issue。执行器启动成功后,控制台一直反复报:xxl-rpc provider netty_http server caught exception解决办法:主要是云提供商lb的健康检查造成的。执行器的9999端口,分别在阿里云和腾讯云配置了lb,而且是tcp协议的。而xxljob调度中心与执行器的心跳底层是依赖netty进行的http协议维持。解决办法如下:1:9999端口在lb上配置http协议。(这个没必要)2:关闭lb心跳检查。3:自定义tcp协议。(这.

2021-07-14 11:53:04 10323 8

原创 mybatis枚举支持通过value映射

背景之前ebean简单的 @DbEnumValue 注解就能支持通过value映射。mybatis也有支持,是 @EnumValue注解。分别支持二种映射规则。EnumOrdinalTypeHandler和EnumTypeHandlerEnumTypeHandler(默认)作用: @Override public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) thr

2021-07-01 19:18:40 600

原创 select for update引发死锁分析

问题复现读写锁冲突场景:4场直播同时准备作业。首先查询作业是否有这条记录。这里查询后添加写锁。作业准备前是没有记录的,所以这里就会造成间隙锁。假设现在只有3条数据。然后通过role查询等于4的。这里查不到数据库,就会锁住3之后的所有数据。先营造测试环境,给xxl_job_user表role字段添加唯一索引。执行如下命令:set @@autocommit=0;SHOW VARIABLES like ‘%autocommit%’;START transaction ;SELECT * F

2021-06-25 19:11:20 2631 3

原创 icmp详讲,wireshark抓包,rfc详讲

icmp详讲,wireshark抓包,rfc详讲

2021-06-22 17:30:02 312

空空如也

空空如也

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

TA关注的人

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