自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(249)
  • 资源 (3)
  • 收藏
  • 关注

原创 Netty源码 ——EventLoop源码剖析01(四十四)

使用 netty 包example下 Echo 目录下的案例代码,当我们写一个 NettyServer 时候,第一句话就是 EventLoopGroup bossGroup = new NioEventLoopGroup(1);SingleThreadEventExecutor 也是一个比较重要的类,看源码注释,说明了SingleThreadEventExecutor 是一个单个线程的线程池。分析最核心组件 EventLoop 在 Netty 运行过程中所参与的事情,以及具体实现。

2024-04-16 08:45:00 366

原创 Netty 心跳(heartbeat)——服务源码小结(四十三)

ldleStateHandler 可以实现心跳功能,当服务器和客户端没有任何读写交互时,并超过了给定的时间,则会触发用户 handler 的 userEventTriggered 方法。用户可以在这个方法中尝试向对方发送信息,如果发送失败,则关闭连接。 IdleStateHandler 的实现基于 EventLoop 的定时任务,每次读写都会记录一个值,在定时任务运行的时候。通过计算当前时间和设置时间和上次事件发生时间的结果,来判断是否空闲。 内部有 3 个定时任务,分别对应读事件,写事件,读写事件

2024-04-16 08:15:00 273

原创 Netty 心跳(heartbeat)——服务源码剖析(下)(四十二)

2)如果读取操作结束了(执行了 channelReadComplete 方法设置) ,就用当前时间减去给定时间和最后一次读(执操作的时间行了 channelReadComplete 方法设置),如果小于 0,就触发事件。5)总的来说,每次读取操作都会记录一个时间,定时任务时间到了,会计算当前时间和最后一次读的时间的间隔,如果间隔超过了设置的时间,就触发 UserEventTriggered 方法。3)这里的时间计算是取读写事件中的最大值来的。然后像写事件一样,判断是否发生了写的慢的情况。

2024-04-10 15:44:06 491

原创 Netty 心跳(heartbeat)——服务源码剖析(上)(四十一)

Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一个服务----心跳机制 heartbeat.通过心跳检査对方是否有效,这是 RPC 框架中是必不可少的功能。下面我们分析一下 Netty 内部心跳服务源码实现。只要给定的参数大于 0,就创建一个定时任务,每个事件都创建。如果在指定的事件没有发生读事件,就会抛出这个异常,并自动关闭这个连接。当一个写提作不能在一定的时间内完成时,抛出此异常,并关闭连接,你同样可以在exceptionCaught 方法中处理这个异常。

2024-04-10 15:40:43 290

原创 Netty源码剖析——HandlerContext 和调度 handler 梳理(四十)

Pipeline Handler HandlerContext 创建过程梳理。ChannelPipeline 调度 handler 梳理。

2024-04-03 08:45:00 200

原创 Netty源码剖析——ChannelPipeline 调度 handler 的源码剖析(三十九)

因为出站是从内部向外面写,从tail 开始,能够让前面的 handler 进行处理,防止 handler 被遗漏,比如编码。反之,入站当然是从 head 往内部输入,让后面的 handler 能够处理这些输入的数据。2)然后,静态方法调用 Context 的 invoker 方法,而 invoker 方法内部会调用该 Context 所包含的Handler 的真正的 XXX 方法,调用结束后,如果还需要继续向后传递,就调用 Context 的 fireXXX2 方法,循环往复。

2024-04-02 08:15:00 636

原创 Netty源码剖析——ChannelHandler 创建过程(三十八)

2) 检查这个handler实例是否是共享的,如果不是,并且已经被别的 pipeline 使用了,则抛出异常。调用 newContext(group, filterName(name, handler), handler) 方法,创建一个 Context。5)如果这个通道还没有注册到 selector 上,就将这个 Context 添加到这个 pipeline 的待办任务中。1) pipeline 添加 handler,参数是线程池,name是null,handler是我们或者系统传入的 handler。

2024-04-02 07:45:00 251

原创 Netty源码剖析——ChannelHandlerContext 篇(三十七)

ChannelOutboundInvoker 和 ChannelInboundInvoker 部分源码。ChannelHandlerContext 作用及设计。

2024-03-27 08:00:00 240

原创 Netty源码剖析——ChannelHandler 篇(三十六)

ChannelHandler的作用就是处理/拦截IO事件,并将其转发给下一个ChannelHandler。Handler处理事件时分入站和出站的,两个方向的操作都是不同的,因此,Netty 定义了两个子接口继承ChannelHandler。ChannelDuplexHandler 处理出站和入站事件。ChannelOutboundHandler 出站事件接口。ChannelHandler 作用及设计。

2024-03-27 07:30:00 194

原创 Netty源码剖析——ChannelPipeline篇(三十五)

同时也能遍历内部的链表, 看看他的几个代表性的方法,基本上都是针对 handler 链表的插入,追加,删除,替换操作,类似是一个 LinkedList。可以看到该接口继承了 inBound,outBound,Iterable 接口,表示他可以。业务逻辑处理程序 - 执行实际业务逻辑(例如数据库访问)协议解码器 - 将二进制数据转换为 Java 对象。协议编码器 - 将 Java 对象转换为二进制数据。在 pipeline 的接口文档上,提供了一幅图。pipeline 的接口设计。

2024-03-20 08:45:00 762

原创 Netty源码剖析——接受请求过程源码剖析-下(三十四)

最终会调用 doBeginRead 方法,也就是 AbstractNioChannel 类的方法。追踪一下 doReadMessages 方法,就可以看得更清晰。pipeline.fireChannelRead 方法。进入 register 方法查看(步步追会到)回到 read方法,继续分析循环执行的。

2024-03-20 08:30:00 511

原创 Netty源码剖析——接受请求过程源码剖析-上(三十三)

3)仍用前面的项目来分析:进入到 NioEventLoop 源码中后,在 private void processSelectedKey(SelectionKey k,AbstractNioChannel ch) 方法开始调试最终我们要分析到AbstractNioChannel 的 doBeginRead 方法,当到这个方法时,针对于这个客户端的连接就完成了,接下来就可以监听读事件。1)从之前服务器启动的源码中,我们得知服务器最终注册了一个 Accept 事件等待客户端的连接。3)处理消息队列中的任务。

2024-03-19 08:45:00 457

原创 Netty源码剖析——bind()绑定端口的分析-下(三十二)

3)创建一个 AbstractChanndHandlerContext 对象,ChanndHandlerContext 对象是ChannelHandler 和 ChannelPipeline 之间的关联,每当有 ChannelHandler 添加到 Pipeline 中时,都会创建Context。Context 的主要功能是管理他所关联的Handler和同一个Pipeline中的其他Handler之间的交互。Init()会调用addLast(),现在进入到 addLast 方法内查看。

2024-03-19 08:00:00 240

原创 Netty源码剖析——bind()绑定端口的分析-中(三十一)

4)config().group().register(channel)通过 ServerBootstrap 的 bossGroup 注册 NioServerSocketChannel。1)基本说明: initAndRegister()初始化 NioServerSocketChannel 通道并注册各个handler,返回一个future。2)通过 ServerBootstrap 的通道工厂反射创建一个 NioServerSocketChannel。分析说明 initAndRegister()

2024-03-13 09:30:00 180

原创 Netty源码剖析——bind()绑定端口的分析-上(三十)

3.doBind源码里,核心是两个方法 initAndRegister() 和 doBind0()2.Bind()代码,追踪到创建了一个端口对象,并做了一些空判断,核心代码 doBind。1.服务器就是在这个bind()里启动完成的。

2024-03-13 08:15:00 162

原创 Netty源码剖析——ServerBootstrap 创建和构造过程(二十九)

ServerBootstrap 是个空构造器,但是有默认的成员变量,底层属性用了LinkedHashMap存ChannelOption和AttributeKey。4)handler 方法传入一个 handler 中,这个hanlder只专属于 ServerSocketChannel 而不是给SocketChannel 用。1)链式调用:group方法,将boss和worker传入,boss 赋值给 parentGroup 属性,worker 赋值给 childGroup。

2024-03-12 09:00:00 328

原创 Netty源码剖析——分析NioEventLoopGroup 的过程(二十八)

1)如果 executor是null,创建一个默认的ThreadPerTaskExecutor,使用Netty默认的线程工厂。2)根据传入的线程数(CPU*2)创建一个线程池(单例线程池)数组。3)循环填充数组中的元素。如果异常,则关闭所有的单例线程池。6)将所有的单例线程池添加到一个 HashSet 中。5)为每一个单例线程池添加一个关闭监听器。4)根据线程选择工厂创建一个线程选择器。

2024-03-12 07:45:00 215

原创 Netty源码剖析——服务器端处理(二十七)

这是一个普通的处理器类,用于处理客户端发送来的消息,简单的解析出客户端传过来的内容,然后控制台打印,最后发送字符串给客户端。服务器端处理器EchoServerHandler源码。

2024-03-05 10:00:00 289

原创 Netty源码剖析——启动过程源码剖析(二十六)

会创建 EventExecutor 数组 children =new EventExecutor(nThreads];//debug -下。随后,变量 b 调用了 group 方法将两个 group 放入了自己的字段中,用于后期引导使用[debug 下 group 方法】在 io.netty.example 包下,有很多Netty源码案例,比较适合分析。demo 源码EchoServer类的基本理解。finally 块中的代码将在服务器关闭时。main 线程阻塞等待关闭。绑定端口并阻塞至连接成功。

2024-03-05 09:00:00 825

原创 Netty重点——TCP 粘包和拆包及解决方案下篇(二十五)

按照自定义分隔符符号切割报文: DelimiterBasedFrameDecoder。基于数据包长度切割报文: LengthFieldBasedFrameDecoder。分5次进行解码,每读取到一个Message,会回复一个Message对象给客户端。要求客户端发送5个Message对象,客户端每次发送一个Message对象。按照固定长度切割报文: FixedLenghtFrameDecoder。这些解决方案全被封装到了handler中,我们可以基于Nett。可以利用靠谱的解码器(在其他编解码器中提现过)

2024-03-05 08:30:00 309

原创 Netty重点——TCP 粘包和拆包及解决方案上篇(二十四)

时,如果没有做处理,就会发生粘包和拆包的问题。TCP 粘包和拆包基本介绍。TCP粘包和拆包现象实例。

2024-02-29 08:45:00 269

原创 Netty重点——编解码器和handler的调用机制下篇(二十三)

应用实例:使用 ReplayingDecoder 编写解码器,对前面的案例进行简化。配置Log4j,在resources/log4j.properties。解码器-ReplayingDecoder(翻译为重播重放)在Maven中添加对Log4j的依赖在pom.xml。Log4j整合到Netty。

2024-02-27 09:00:00 495

原创 Netty重点——编解码器和handler的调用机制中篇(二十二)

使用自定义的编码器和解码器来说明 Netty 的 handler 调用机制。handler链的调用机制和规则。服务端发送 long-> 客户端。客户端发送long-> 服务器。本篇干货比较多,请耐心观看~~

2024-02-27 08:30:00 180

原创 Netty重点——编解码器和handler的调用机制上篇(二十一)

由于不可能知道远程节点是否会一次性发送一个完整的信息,tcp有可能出现粘包拆包的问题,ByteToMessageDecoder会对入站数据进行缓冲,直到它准备好被处理。编解码器出站入站基本说明。

2024-02-20 10:00:00 327

原创 Netty应用——Google Protobuf强化篇(二十)

服务端能接收Student PoJo/ Worker PoJo 对象(需要判断是哪种类型),并显示信息(通过Protobuf解码)客户端可以随机发送Student PoJo/ Worker PoJo 对象到服务器(通过 Protobuf 编码)客户端可以发送一个 Student PoJo 对象到服务器 (通过 Protobuf 编码)服务端能接收 Student PoJo 对象,并显示信息(通过 Protobuf 解码)

2024-02-20 09:30:00 194

原创 Netty核心——Google Protobuf篇(十九)

Netty本身的编码解码的机制和问题分析。编码和解码的基本介绍。

2024-02-20 08:30:00 359

原创 我的创作纪念日

刚开始的时候,CSDN对我来说是一个学习平台。他对我来说从一个学习平台演变为一个分享的平台,把自己学到的东西分享出来供大家学习或指正,也见证了这一路走来的艰难坎坷。目前最好的一段代码,其实也说不上有多好吧,就是结合业务实现了一套DDD的业务中台(其中有几个模块还是很纯正的DDD风味儿),当然他还很稚嫩,我会尽力完善他的。除了日常培训之外,看得最多的就是CSDN了,他可以非常体贴的提供我所需要的大部分知识,使我可以参考很多人的观点和见解。现在写博客,做一些小小的创作已经成为了日常生活中不可缺少的一部分。

2024-02-19 09:52:36 222

原创 Netty应用——通过WebSocket编程实现服务器和客户端长连接(十八)

客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服务器会感知。Http协议是无状态的,浏览器和服务器间的请求响应一次,下一次会重新创建连接。p协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器。要求:实现基于webSocket的长连接的全双工的交互。

2024-02-13 11:15:00 327

原创 Netty应用——心跳检测机制案例(十七)

Netty心跳检测机制案例

2024-02-13 10:45:00 315

原创 Netty应用——实例-群聊系统(十六)

Netty应用实例-群聊系统

2024-02-13 10:00:00 376

原创 Netty重点——ByteBuf特别篇(十五)

bytebuf

2024-02-06 09:53:58 221

原创 Netty重点——核心组件补充篇(十四)

shutdownGracefully(),断开连接,关闭线程。EventLoopGroup和其实现类NioEventLoopGroup。举例说明Unpooled获取Netty的。操作缓冲区的工具类Unpooled。容器ByteBuf的基本使用。

2024-02-06 09:15:00 304

原创 Netty重点——核心组件下篇(十三)

Pipeline和ChannelPipeline。ChannelHandler及其实现类。

2024-02-06 08:45:00 663

原创 Netty重点——核心组件上篇(十二)

Bootstrap、ServerBootstrap

2024-01-31 07:30:00 172

原创 Netty核心——异步模型(Future)篇(十一)

Future-Listener

2024-01-30 10:19:40 375

原创 Netty核心——Reactor下篇(十)

NioEventLoop内部采用串行化设计,从消息的读取->解码->处理->编码->发送,始终由IO线程NioEventLoop。非当前Reactor线程调用Channel的各种方法。任务队列中的Task有3种典型使用场景。Netty线程模型再说明。用户程序自定义的普通任务。

2024-01-30 09:15:00 402

原创 随手笔记(五十一)——Can‘t commit changes due to unresolved conflicts. Git merge失败

问题: 将dev branch 合并到master上时,idea提示出现了一个错误,Can't commit changes due to unresolved conflicts.1. 打开Terminal 输入命令 git merge dev-20240125 --allow-unrelated-histories。5. 友情提示,merge之前一定要先checkout到合并分支一下。4. 注意,不要输错分支名称,不然会提示。2. 注意,一定要输入--后面的内容。

2024-01-26 10:00:00 475

原创 随手笔记(五十)——node启动异常

解决方法:查看npm仓库替换公有仓库。

2024-01-25 15:25:28 377

原创 Netty核心——Reactor中篇(九)

Netty服务器在6668端口监听,客户端能发送消息给服务器“hello。服务器可以回复消息给客户端“hello。Netty快速入门实例-TCP服务。主从Reactor模式的优缺点。Reactor模式具备的优点。主从Reactor模式。

2024-01-23 10:30:00 1730

原创 Netty核心——Reactor上篇(八)

结合实例,服务器端用一个线程通过多路复用搞定所有的 IO 操作(包括连接,读、写等),编码简单,清晰明了.但是如果客户端连接数量较多,将无法支撑,前面的 NIO 案例就属于这种模型。Reactor/反应器: 在一个单独的线程中运行,负责监听/Select和分发事件/dispatch,分发给适当的handlers。使用场景:客户端的数量有限,业务处理非常快速,比如 Redis 在业务处理的时间复杂度 O(1) 的情况。单Reactor单线程模式优缺点分析。单Reactor多线程模式的优缺点分析。

2024-01-23 10:15:00 357

canal-master.zip

canal

2022-01-04

apache-zookeeper-3.7.0-bin.tar.gz

apache-zookeeper-3.7.0-bin.tar.gz

2022-01-04

Redis数据结构与对象总结

Redis数据结构与对象总结 数据结构与对象 简单动态字符串 SDS简介 SDS与C字符串的区别 常数复杂度获取字符串长度 O(n) O(1) 杜绝缓冲区溢出 修改字符串长度时内存重分配 空间预分配:对字符串进行增长操作时的优化,SDS API 会检查SDS当前空间是否符合修改条件,如果不符合 不但会分配修改所需空间还会分配给free属性额外的未使用空间 惰性空间释放:对字符串进行缩减操作时

2020-04-24

空空如也

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

TA关注的人

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