netty
文章平均质量分 68
morris131
这个作者很懒,什么都没留下…
展开
-
Netty对NIO中Selector的优化
Netty对底层Selector的优化netty在创建NioEventLoop时会封装一个JDK底层的Selector属性:private Selector selector;private Selector unwrappedSelector;nio中Selector的实现public abstract class SelectorImpl extends AbstractSelector { protected Set<SelectionKey> selectedKeys原创 2021-01-05 18:00:53 · 2235 阅读 · 1 评论 -
netty源码之FastThreadLocal
FastThreadLocalFastThreadLocal是ThreadLocal的一个变种实现,FastThreadLocal比ThreadLocal的性能更高,但是也有一定的局限性。ThreadLocal的使用ThreadLocal同一线程在某地方进行设置,在随后的任意地方都可以获取到。从而可以用来保存线程上下文信息。例如Spring的事务管理,用ThreadLocal存储Connection,从而各个DAO可以获取同一Connection,可以进行事务回滚,提交等操作。package com原创 2021-01-05 16:32:33 · 1743 阅读 · 2 评论 -
netty解码器之ReplayingDecoder
解码器之ReplayingDecoderReplayingDecoder继承了ByteToMessageDecoder,是一个解码器,是ByteToMessageDecoder的一个特殊变体。ReplayingDecoder和ByteToMessageDecoder的区别ReplayingDecoder和ByteToMessageDecoder最大的不同在于,ReplayingDecoder允许让你实现decode()方法,就像已经接收到所有所需的字节,而不用去检查所需字节的可用性。假设现在自定义协原创 2020-12-29 16:19:48 · 3734 阅读 · 0 评论 -
netty之ByteBuf的使用与分类介绍
ByteBuf当我们使用NIO进行数据传输的时候,往往需要使用到缓冲区Buffer,常用的缓冲区就是JDK中的NIO类库提供的java.nio.Buffer。实际上,7种基本类型(Boolean除外)都有自己的缓冲区实现。对于NIO编程而言,我们主要使用的是ByteBuffer。从功能角度而言,ByteBuffer完全可以满足NIO编程的需要,但是由于NIO编程的复杂性,ByteBuffer也有其局限性,它的主要缺点如下:ByteBuffer长度固定,一旦分配完成,它的容量不能动态扩展和收缩(Buf原创 2020-12-28 16:49:09 · 4393 阅读 · 2 评论 -
Netty源码之Channel系列
源码之Channel系列NioServerSocketChannel的继承关系图:NioSocketChannel的继承关系图:ChannelJDK中的Channel是NIO类库的一个重要组成部分,是java.nio.SocketChannel和java.nio.ServerSocketChannel最顶层的接口,它们用于非阻塞的IO操作。类似于NIO的Channel,Netty提供了自己的Channel和其子类实现,用于异步IO操作和其他相关的操作。io.netty.channel.Cha原创 2020-12-22 14:40:20 · 2325 阅读 · 0 评论 -
netty源码之Future和Promise
netty源码之Future和Promise从名字可以看出,Future用于获取异步操作的结果,而Promise则比较抽象,无法直接猜测出其功能,下面我们一一来了解。JDK中的FutureFuture来源于JDK的java.util.concurrent.Future,它用于代表异步操作的结果,相关API如下所示。// java.util.concurrent.Futurepublic interface Future<V> { // 通过cancel可以尝试取消异步操作,原创 2020-12-18 20:04:30 · 3564 阅读 · 4 评论 -
Reactor之多工作线程与主从模式
多线程、主从Reactor多工作线程模式单线程的reactor模式并没有解决IO和CPU处理速度不匹配问题,所以多线程的reactor模式引入线程池的概念,把耗时的IO操作交由线程池处理。package com.morris.reactor.multiworker;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.channels.SelectionKey;import java.nio原创 2020-12-17 17:33:27 · 6319 阅读 · 3 评论 -
Reactor模式和NIO
Reactor模式不管是普通的WEB服务还是分布式服务,它们都有一个相似的结构,可以分为五个部分:接收请求:通过IO从网络中读取到请求的字节流。解码请求:将字节流转换为我们熟悉的请求对象。处理服务:通过得到的请求对象,执行一些业务逻辑。编码响应:将我们要响应的对象编码成通过网络传输的字节流。发送响应:通过IO将响应字节流发送到网络中。通过以上五步,我们可以轻松看到,IO在网络服务中起着举足轻重的作用。传统的服务设计每个handler都有自己的一个线程,处理来自一个客户端的请求,可以想原创 2020-12-16 20:08:40 · 6318 阅读 · 1 评论 -
netty源码之ChannelHandler
netty源码之ChannelHandlerChannelHandler类似于Servlet的Filter过滤器,负责对I/O事件或者IO操作进行拦截和处理,它可以选择性地拦截和处理自己感兴趣的事件,也可以透传和终止事件的传递。基于ChannelHandler接口,用户可以方便地进行业务逻辑定制,例如打印日志、统一封装异常信息、性能统计和消息编解码等。ChannelHandlerChannelHandler的继承关系:由于ChannelHandler是Netty框架和用户代码的主要扩展和定制点,原创 2020-12-15 14:17:01 · 6915 阅读 · 0 评论 -
netty源码之ChannelHandlerContext
源码之ChannelHandlerContext在netty中,ChannelHandlerContext代表了一个ChannelHandler和ChannelPipeline之间的关系,Netty会把ChannelHandler包装进ChannelHandlerContext的实例DefaultChannelHandlerContext,然后把ChannelHandlerContext作为元素来组成链表,所以ChannelHandlerContext中一定有获得ChannelHandler和Channe原创 2020-12-10 09:37:56 · 11647 阅读 · 0 评论 -
netty源码之ChannelPipeline
netty源码之ChannelPipelineNetty中ChannelPipeline和ChannelHandler机制类似于Servlet和Filter过滤器,实际上都是职责链模式的一种变形,主要是为了方便事件的拦截和用户业务逻辑的定制。Netty的Channel过滤器实现原理与Servlet的Filter机制一致,它将Channel的数据管道抽象为ChannelPipeline,消息在ChannelPipeline中流动和传递。ChannelPipeline持有IO事件拦截器ChannelHand原创 2020-12-08 17:14:56 · 15476 阅读 · 0 评论 -
服务器推送技术之短轮询、长轮询、SSE和Websocket
服务器推送技术服务器推送技术干嘛用?就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新就可以及时获得更新的信息。大家平时在上各种视频网站时,对视频节目进行欢乐的吐槽和评论,会看到各种弹幕,当然,他们是用flash技术实现的,对于我们没有用flash的应用,一样可以实现弹幕。又比如在股票网站,往往可以看到,各种股票信息的实时刷新,上面的这些都是基于服务器推送技术。Ajax短轮询Ajax短轮询就是用一个定时器不停的去网站上请求数据。下面的代码实现浏览器页面实时显示服务器的当前时间。服务器端原创 2020-12-07 16:23:19 · 15903 阅读 · 2 评论 -
netty对keepalive和idle的支持
netty对keepalive和idle的支持为什么需要keepalivekeepalive就是心跳,一个人的心跳证明人还活着,那么在网络通信的双方如何证明对端还活着着,两个服务之间使用心跳来检测对方是否还活着。为什么要检测对方是否还活着呢?假如客户端因为某种原因(停电宕机、终止运行)没有发送关闭连接的数据包,那么服务器就会一直维持着连接,占用服务器资源,后面需要使用连接的时候还会报错。有了心跳,服务器就能及时释放资源。TCP中的keepaliveTCP keepalive核心参数如下:$ sy原创 2020-12-04 15:19:59 · 16260 阅读 · 1 评论 -
netty对websocket的支持
netty对websocket的支持什么是WebSocket?WebSocket是一种在2011年被互联网工程任务组(IETF)标准化的协议。WebSocket解决了一个长期存在的问题:既然底层的协议(HTTP)是一个请求/响应模式的交互序列(半双工),那么如何实时地发布信息呢?AJAX提供了一定程度上的改善,但是数据流仍然是由客户端所发送的请求驱动的,还有其他的一些或多或少的取巧方式(Comet)。WebSocket规范以及它的实现代表了对一种更加有效的解决方案的尝试。简单地说,WebSocket提原创 2020-12-03 16:47:47 · 12492 阅读 · 0 评论 -
netty源码构建
netty源码构建构建步骤github源代码地址:https://github.com/netty/netty。使用git clone:git clone git@github.com:netty/netty.git。$ git clone git@github.com:netty/netty.gitCloning into 'netty'...Warning: Permanently added the RSA host key for IP address '192.30.255.112'原创 2020-11-30 17:17:37 · 23260 阅读 · 3 评论 -
基于netty构建http服务器
基于netty构建http服务器基于Netty构建Http服务的流程如下:Client向Server发送http请求。Server端对http请求进行解析。Server端向Client发送http响应。Client对http响应进行解析。流程图如下:服务器端实现package com.morris.netty.protocol.http;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf原创 2020-11-24 16:31:21 · 18076 阅读 · 0 评论 -
UDP协议格式以及在java中的使用
UDP协议格式以及在java中的使用UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。UDP适用于DNS、视频音频等多媒体通信、广播通信(广播、多播)。例如我们常用的QQ,就是一个以UDP为主,TCP为辅的通讯协议。UDP报文格式如下:UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,源端口:数据发送方的端口号.目的端口:数据接收方的端口号。长度:UDP数据报的原创 2020-11-20 11:38:18 · 23966 阅读 · 11 评论 -
netty编解码器与序列化框架分析
netty编解码器分析编码(Encode)也称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)也称为反序列化(deserialization),用于把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如 RPC 调用),需要使用特定的编解码技术,对需要进行网络传输的对象做编码或者解码,以便完成远程调用。Java序列化Java默认提供的序列化机制,原创 2020-11-10 16:57:39 · 16497 阅读 · 1 评论 -
网络IO之NIO
网络IO之NIONIO库是在JDK1.4中才引入,弥补了原来的I/O(BIO)的不足,它是一个高速的、面向块的I/O。NIO有两层含义:在java层面:nio称为new io,是一套全新的操作io的api。在OS层面:nio称为no-blocking io,系统调用socket函数可以设置一个NONBLOCK的参数,实现调用方法时不会阻塞线程。与BIO的主要区别面向流与面向缓冲BIO是面向流的,面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能原创 2020-11-09 15:58:05 · 25029 阅读 · 10 评论 -
Java网络IO模型、阻塞与非阻塞、同步与异步
网络IO模型阻塞式I/O默认情况下,所有的套接字的方法都是阻塞的,如上面的accept、recv。对应的代码如下:package com.morris.bio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.n原创 2020-11-06 17:48:41 · 16802 阅读 · 0 评论 -
网络IO之NIO的演变过程
NIO演变过程本文会使用strace命令一步一步跟踪程序底层所产生的系统调用来分析NIO的演变过程。NIO的阻塞模式package com.morris.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketCh原创 2020-11-05 11:49:27 · 23504 阅读 · 4 评论 -
NIO之ByteBuffer的使用
NIO之ByteBuffer的使用NIO中有三大组件:Channel、Selector、Buffer,今天就来讲讲Buffer的使用。Buffer的继承结构:Buffer为java中的每个数据类型都提供了对应的实现类,但是实际使用中用得最多的还是ByteBuffer。ByteBuffer的创建在堆上创建:log.info("freeMemory:{}MB", Runtime.getRuntime().freeMemory() / _1_MB);ByteBuffer allocate = By原创 2020-11-04 17:04:20 · 25796 阅读 · 4 评论 -
手写一个RPC框架实现远程调用
手写一个RPC框架实现远程调用一个RPC框架需要解决哪些问题?通信问题代理问题序列化问题服务实例化注册中心注册中心实现服务提供者注册服务,消费者订阅服务。package com.morris.service.regcenter;import com.morris.service.vo.RegisterVo;import com.morris.service.vo.ServiceAddress;import lombok.extern.slf4j.Slf4j;import j原创 2020-11-03 17:49:15 · 13085 阅读 · 0 评论 -
Java网络IO之BIO
BIOBIO:blocking IO,也就是阻塞IO。本文会从linux内核开始分析为什么会阻塞,阻塞在哪呢?单线程BIO服务器端一个线程实现的服务器端代码如下:public class SingleThreadServer { public static final int PORT = 8899; public static void main(String[] args) throws IOException { ServerSocket serverSo原创 2020-11-02 14:48:38 · 20402 阅读 · 8 评论 -
netty之TCP粘包拆包问题解决
TCP粘包拆包问题解决什么TCP粘包和拆包问题假设客户端向服务端连续发送了两个数据包,分别用ABC和DEF来表示,那么服务端收到的数据可以分为以下三种情况:第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象。第二种情况,接收端只收到一个数据包,这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。第三种情况,接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。为什么会发生TCP粘包和拆包发生TCP粘包的原因:原创 2020-07-10 16:39:46 · 18582 阅读 · 0 评论