
Netty
文章平均质量分 92
木棉上的光
公众号:不止于Java
Github:https://github.com/cyxpdc?tab=repositories
邮箱:1142439493@qq.com
展开
-
Netty初了解(10w TPS)
1.简介Netty虽然底层原理是NIO,却实现了异步,是一个异步NIO框架2.高性能三大主题传输、协议、线程性能包括两方面:服务端的处理性能、请求的性能3.异步非阻塞模型3.1 NIO基本操作流程(服务端):3.2 架构服务端:第六步中,不再是直接单线程阻塞处理,而是使用了一个实现了handle接口的类,调用handleAccept方法来处理新的客户端接入,此方法是从线...原创 2019-04-27 22:03:03 · 2233 阅读 · 0 评论 -
《Netty深入剖析》一、二:Netty基本组件和Netty服务端启动
1 Netty基本组件1.1 网络通信之Netty模型NioEventLoopNioEventLoop#run方法对应着Bio的while(true)轮询,里面存放业务逻辑代码;对应着两个Thread:一个是服务端的监听,一个是对客户端的读写用法:创建两个NioEventLoopGroup,一个bossGroup一个workerGroup;bossGroup是服务端的监听,,w...原创 2019-08-31 11:17:51 · 359 阅读 · 0 评论 -
《Netty深入剖析》之三:NioEventLoop
3 NioEventLoop3.1 NioEventLoop创建流程:深入到MultithreadEventExecutorGroup的构造方法接下来分析这三个子过程3.1.1 ThreadPerTaskExecutor作用每一次执行任务的时候,都会创建一个线程(execute方法)NioEventLoop线程命名规则:nioEventLoop-1(第几个NioEventLoo...原创 2019-08-31 21:32:05 · 520 阅读 · 0 评论 -
《Netty深入剖析》之四:新连接接入
4 Netty新连接接入新连接接入处理逻辑:4.1 检测新连接流程:在3.3的processSelectedKeys方法里:创建NioSocketChannel,封装了NIO的SocketChannelwhile循环条件为allocHandler.continueReading()是用来控制连接接入的速率,默认一次性最大16个连接(maxMessagePerRead),如果超过就结束;...原创 2019-08-31 23:05:13 · 271 阅读 · 0 评论 -
《Netty深入剖析》之五:大动脉Pipeline
5 pipeline5.1 pipeline的初始化5.1.1 pipeline在创建Channel的时候被创建AbstractChannel的构造方法中会进行创建DefaultChannelPipeline即服务端和客户端channel被创建的时候创建5.1.2 pipeline节点数据结构:ChannelHandlerContext接口扩展自AttributeMap, Channe...原创 2019-09-02 08:44:18 · 333 阅读 · 0 评论 -
《Netty深入剖析》之六:ByteBuf及内存管理
6 内存分配:ByteBuf最底层作用将数据从底层IO里面读到ByteBuf,传递给应用程序,应用程序处理完之后,再把数据封装成ByteBuf传回给IO主要内容:内存与内存管理器的抽象不同规格大小和不同类别的内存的分配策略内存的回收过程6.1 ByteBuf结构及重要API结构:三个指针:readerIndex、writerIndex、capacity写数...原创 2019-09-03 09:12:52 · 912 阅读 · 0 评论 -
《Netty深入剖析》之七:Netty解码
7 Netty解码将二进制数据流解析成自定义协议数据包ByteBuf两个部分:1.解码器基类2.常见的解码器分析7.1 解码器基类ByteToMessageDecoder解码步骤流程1.使用一个累加器cumulation(类型为ByteBuf)来累加字节流2.调用子类的decode方法进行解析(callDecode(),去累加器读取数据)3.如果解析到了ByteBuf,则将解...原创 2019-09-03 22:30:59 · 453 阅读 · 0 评论 -
《深入剖析Netty》之八:Netty编码
8 Netty编码和writeAndFlush()如果调用writeAndFlush(),且有对应的编码器,那么Netty就能将对象变成字节流,最终写到socket底层总过程图:涉及两个重要的自定义handler:Encoder、BizHandler;最后传到head,通过底层unsafe写到socketBizHandler:public class BizHandler extends...原创 2019-09-04 13:24:49 · 224 阅读 · 0 评论 -
《Netty深入剖析》之九:Netty性能优化工具类解析
9 Netty性能优化工具类解析两大性能优化工具类:FastThreadLocal、Recycler(实现了轻量级对象池机制,主要用于ByteBuf)9.1 FastThreadLocal的实现机制https://www.jianshu.com/p/14f461568008:核心图对于jdk的ThreadLocal来讲,其底层数据结构就是一个Entry[]数组,key为ThreadLoc...原创 2019-09-05 22:32:48 · 354 阅读 · 0 评论 -
《Netty深入剖析》之十:Netty设计模式的应用
10 设计模式10.1 单例模式三个原则:全局只有一个实例(private 构造方法)、延迟加载(static)、避免多线程同步创建(static、synchronized)例子:ReadTimeoutException、MqttEncoderReadTimeoutException:public final class ReadTimeoutException extends Time...原创 2019-09-06 20:26:35 · 465 阅读 · 0 评论 -
Netty自定义序列化编解码器的解决粘包/半包问题的编解码方案方案二:完全自定义
继Netty自定义序列化编解码器的解决粘包/半包问题的编解码方案方案一:使用LengthFieldPrepender与LengthFieldBasedFrameDecoder原理通过改造编解码器,将LengthFieldPrepender与LengthFieldBasedFrameDecoder的功能直接写在自定义编解码器中,这样就不需要使用LengthFieldPrepender与Len...原创 2019-07-05 09:09:53 · 886 阅读 · 0 评论 -
Netty自定义序列化编解码器的解决粘包/半包问题的编解码方案方案一:使用LengthFieldPrepender与LengthFieldBasedFrameDecoder
通过扩展MessageToByteEncoder和ByteToMessageDecoder来自定义编解码器原理使用int数据类型来记录整个消息的字节数组长度,然后将该int数据作为消息的消息头一起传输服务端接收消息数据时,先接收4个字节的int数据类型数据,此数据即为整个消息字节数组的长度,再接收剩余字节,直到接收的字节数组长度等于最先接收的int数据类型数据大小,即字节数组的长度类似...原创 2019-07-05 09:00:32 · 816 阅读 · 0 评论 -
Netty对JBoss Marshalling序列化的解决粘包/半包问题的编解码方案
解码工具:MarshallingDecoder编码工具:MarshallingEncoder代码1.MarshallingSerializeServer:服务器/** * @author pdc */public class MarshallingSerializeServer { public void bind(int port) throws Exception ...原创 2019-07-04 13:06:44 · 367 阅读 · 0 评论 -
Netty源码分析(二):客户端操作之EventLoopGroup、group()、option()
EventLoopGroup顾名思义,为事件循环组,可以理解为线程组,类似Filter、Intercept,都是循环链路先看看类图:可以看到最上层为Executor,接下层为ExecutorService,即线程池,印证了Event是通过线程来分发的,本质就是线程池切入点中,new了一个NioEventLoopGroup,咱们来说道说道,直接看最深层的构造方法:protected Mu...原创 2019-05-05 10:38:01 · 955 阅读 · 0 评论 -
Netty源码分析(三):客户端操作之发起TCP连接
发起TCP连接经过Netty源码分析(一):客户端操作之channel()和Netty源码分析(二):客户端操作之EventLoopGroup、group()、option()后,Netty这时候大概初始化结束了,那么客户端是如何发起TCP连接的呢?在channel方法中,我们调到connect方法会调用initAndRegister,初始化和注册channel,那么完毕且经过一些参数检查之...原创 2019-05-05 10:41:30 · 1230 阅读 · 0 评论 -
Netty杂项
双子星Promise和Future作用:是实现异步非常重要的一环;也使无锁化串行的实现变得可控,channel中的线程谁先完成无所谓,拿到结果进行回调这一步控制好即可。这样能大大提高CPU利用率流程、分工::线程不断地与Promise交互,线程执行完之后,Promise通知Future,Future来决定调用哪个回调方法;两者必须成对出现,Promise保存线程执行状态,用来通知Future;...原创 2019-05-05 17:08:16 · 143 阅读 · 0 评论 -
Netty源码分析(一):客户端操作之channel()
注:以im系统为基础开始分析,源码会截取最重要的一部分,而不是全部,以观全貌代码可参考https://github.com/cyxpdc/DistributedServiceFramework/tree/master/src/main/java/com/pdc/im1.首先回顾一下同步、异步、阻塞、非阻塞:同步异步是相对于IO而言的,在同一时间,只能完成一个操作,则为同步(NIO);能同...原创 2019-05-01 15:58:57 · 1046 阅读 · 0 评论 -
Netty源码分析(四):关于ChannelPipeline和addLast
ChannelPipeline1.架构设计:Channel都有且仅有一个ChannelPipeline与之对应,Channel包含了ChannelPipeline,ChannelPipeline内部包含了N个handler,每一个handler都是由一个线程去执行;ChannelPipeline内部维护了一个由ChannelHandlerContext组成的双向链表,头为HeadContex...原创 2019-05-06 23:49:39 · 12076 阅读 · 1 评论 -
Netty字符串类型消息粘包/半包问题解决方案一示例代码:DelimiterBasedFrameDecoder+StringDecoder
原理使用特殊的字符,将其作为数据包的结束位置,使TCP能够区分完整的业务应用数据边界,按照边界完整地接受Netty传输的数据;此特殊字符需要保证正式报文数据里面不会出现相同的字符,以免破坏消息传输的完整性代码1.DelimiterBaseServer:服务器/** * 服务器 * @author pdc */public class DelimiterBaseServer...原创 2019-07-04 00:23:05 · 1254 阅读 · 0 评论 -
Netty字符串类型消息粘包/半包问题解决方案二示例代码:LineBaseFrameDecoder+StringDecoder
原理检测字节数组中含有的“\n”或“\r\n”换行符,并一次作为字节数据包的结束位置;注意,若业务数据存在换行符,需要进行转义案例1.LineBaseServer:服务端/** * @author pdc */public class LineBaseServer { public static void main(String[] args) throws Exc...原创 2019-07-04 11:12:06 · 662 阅读 · 0 评论 -
Netty字符串类型消息粘包/半包问题解决方案三示例代码:FixedLengthFrameDecoder+StringDecoder
原理按照开发者指定的固定长度对消息进行解码案例1.FixedLengthServer/** * @author pdc */public class FixedLengthServer { public static void main(String[] args) throws Exception { int port = 8080; ...原创 2019-07-04 11:15:00 · 321 阅读 · 0 评论 -
Netty对Protobuf的解决粘包/半包问题的编解码方案
protobuf编解码内置方案解码工具类:ProtobufDecoder+ProtobufVarint32FrameDecoder编码工具类:ProtobufEncoder+ProtobufVarint32LengthFieldPrepender原理代码:1.user.protosyntax="proto2";package netty.protobuf;option j...原创 2019-07-04 11:20:20 · 6442 阅读 · 0 评论 -
Netty对Java内置序列化的解决粘包/半包问题的编解码方案
性能比不过protobuf序列化协议,不过与Java有天生的亲和性解码工具:ObjectDecoder编码工具:ObjectEncoder代码使用Netty对Protobuf的解决粘包/半包问题的编解码方案中的user.proto1.JavaSerializeServer/** * @author pdc */public class JavaSerializeServer ...原创 2019-07-04 12:52:55 · 328 阅读 · 0 评论 -
《Netty深入剖析》之十一(终):Netty高并发性能调优
11 高并发性能调优11.1 单机百万连接调优11.1.1 如何模拟百万连接使用两台虚拟机,一台服务端一台客户端如何模拟呢?情况1:一台Client一台Server,只能有6w连接,因为Client只剩下大概6w个端口可以去连接服务端优化1:可以使用多个Client去连接服务端,要开启十几台虚拟机,麻烦优化2:服务端启动8000~8100端口,且因为TCP是一个四元组概念:源ip、...原创 2019-09-06 20:28:12 · 2122 阅读 · 0 评论