《Netty入门到超神》
文章平均质量分 77
《Netty入门到超神》
墨家巨子@俏如来
EasyJF开源团队成员,10 年Java开发及项目管理经验,在企业中承担项目经理、架构师等职位,喜欢研究技术,执着于对技术底层的探索及源码的剖析;喜欢写文章,享有阿里云专家博主、CSDN博客专家、Java领域优质创作者、华为云开发者联盟成员/技术博主(CSDN搜索-墨家巨子@俏如来)代表作《SpringCloud入门到精通》,《SpringCloud源码深度剖析》,《SpringBoot入门到精通》,《Spring源码深度剖析》等等
展开
-
十三.Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
前言学过dubbo的应该知道dubbo底层基于Netty实现,为了加强对Netty的理解,这篇文章我们来仿照dubbo手撸一个简易版本的RPC框架结构理解先来看一张图原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释:首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接原创 2021-12-11 22:52:17 · 985 阅读 · 1 评论 -
十二.Netty入门到超神系列-TCP粘包拆包处理
前言TCP是面向连接的,服务端和客户端通过socket进行数据传输,发送端为了更有效的发送数据,通常会使用Nagle算法把多个数据块合并成一个大的数据块,这样做虽然提高了效率,但是接收端就很难识别完整的数据包了(TCP无消息保护边界),可能会出现粘包拆包的问题。粘包拆包理解下面我用一个图来带大家理解什么是粘包和拆包解释一下第一次传输没有问题,数据1和数据2没有粘合,也没有拆分第二次传输,数据1和数据2粘在一起传输了,出现了粘包第三次传输,数据2被分为了2部分,数据2_1 第一份和数据1粘.原创 2021-12-07 16:16:42 · 2670 阅读 · 3 评论 -
十一.Netty入门到超神系列-Netty使用Protobuf编码解码
前言数据在传输的过程中需要进行编码和解码,本篇文章主要是探讨Netty中的编码解码器。Netty中的编码解码当我们的Netty客户端和服务端进行通信时数据在传输的过程中需要进行序列化,比如以二进制数据进行传输,那么我们的业务数据就需要有相应的编码器进行编码为二进制数据,当服务端拿到二进制数据后需要有相应的解码器进行解码得到真实的业务数据。如下图:在Netty提供了一些编码解码器如下:StringEncoder : 针对于字符串的编码器StringDecoder : 针对于字符串的解码器Ob原创 2021-12-07 12:07:19 · 1933 阅读 · 0 评论 -
十.Netty入门到超神系列-基于WebSocket开发聊天室
前言在很多的网站中都嵌入有聊天功能,最理想的方式就是使用WebSocket来开发,屏幕面前的你如果不清楚WebSocket的作用可以自己去百度一下,Netty提供了WebSocket支持,这篇文章将使用Netty作为服务器,使用WebSocket开发一个简易的聊天室系统。服务端Netty提供了 WebSocketServerProtocolHandler ,它能够把平台的Http协议升级为WebSocket的WS协议,服务端代码如下public class NettySocketServer {原创 2021-11-19 13:29:19 · 3022 阅读 · 1 评论 -
十.Netty入门到超神系列-基于Netty群聊系统
前言本章节基于Netty做一个聊天室案例加强Netty的熟练度,案例的效果是服务端可以广播某客户端的消息给所有客户端。每个客户端监听键盘输入来获取消息,然后发送给服务端。服务端服务端一样的需要创建BossGroup 和 WorkGroup , 然后使用ServerBootStrap 来配置Netty和启动Netty。public class NettyGroupChatServer { public static void main(String[] args) { new原创 2021-08-15 22:31:49 · 876 阅读 · 2 评论 -
九.Netty入门到超神系列-Netty开发Http服务器
前言这章我们使用Netty来写一个Http服务器类似于Tomcat ,当然Netty和Tomcat是有很多的异同的,比如通信协议,Tomcat是一个基于Http协议的Web容器,而Netty能够通过codec自己来编码/解码字节流 ,因此Netty可以通过编程自定义各种协议,我们今天的目的还是对Netty练练手。基于Netty的Http服务器我这里要实现的案例就是客户端(浏览器或者Postmain)请求服务器,发送GET或者Post请求,服务器拿到请求中的参数,然后返回一个消息给客户端.对于Net原创 2021-08-10 23:43:03 · 670 阅读 · 5 评论 -
八.Netty入门到超神系列-Netty入门&核心类
下面是Netty的下载地址:https://bintray.com/netty/downloads/netty/ ,由于Netty5出现重大BUG被官方废弃,所以我们使用Netty4进行学习。原创 2021-08-09 00:04:46 · 722 阅读 · 10 评论 -
七.Netty入门到超神系列-Netty介绍和线程模型
前言千呼万唤始出来,经过5章的NIO学习,终于迎来了Netty。撸起袖子,准备好卫生纸,一起来看吧。Java NIO的问题经过前面章节的学习你应该能感受到NIO的问题,就是类比较多,方法也比较多,而且复杂,开发工作量和难度都非常大,还需要考虑网络问题、数据丢包和异常流的处理等等。NIO是底层API,它的实现依赖于操作系统针对IO操作的APIs,使用NIO会经常发现代码在Linux上正常运行,但在Windows上就会出现问题。JDK的NIO还有一个Epoll Bug,它会导致 Selector 空轮询原创 2021-08-08 17:44:42 · 1136 阅读 · 3 评论 -
六.Netty入门到超神系列-Java NIO零拷贝实战
前言这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。传统IO拷贝服务端服务端主要是接收一下客户端传输过来的数据//普通拷贝 - 服务端public class SocketServer { public static void main(String[] args) throws Exception { //创建ServerSocke原创 2021-08-06 23:45:40 · 2105 阅读 · 8 评论 -
五.Netty入门到超神系列-零拷贝技术
前言本篇文章我们来来探讨一下Linux中的几种“零拷贝”技术,我们在 java nio,netty,kafka,RocketMQ等框架中多多少少都有听到这个概念,从听名字也能感知到它在文件拷贝,IO传输的性能上做出了很大贡献。IO与零拷贝DMA传输原理DMA ( direct memory access ):直接内存拷贝,数据拷贝不经过CPU,可以解放了CPU,下面以读取文件数据到内存为例来演示:解释一下图中的步骤应用进程发起read命令, 调用CPU 读取数据,此时CPU会将用户进行从用户原创 2021-08-05 17:43:22 · 1126 阅读 · 10 评论 -
四.Netty入门到超神系列-聊天室案例
前言前面我们队NIO的三大核心做了学习,这章我们来基于NIO来做一个聊天室案例。聊天室案例先来看下我们要实现的效果对于服务端而言需要做如下事情selector监听客户端的链接如果有“读”事件,就从通道读取数据把数据转发给其他所有的客户端,要过滤掉发消息过来的客户端不用转发对于客户端而言需要做如下事情select监听服务端的“读”事件如果有数据从通道中读取数据,打印到控制台监听键盘输入,先服务端发送消息服务端代码public class GroupChatServer {原创 2021-07-31 23:33:31 · 843 阅读 · 7 评论 -
三.Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
前言上一章节我们理解了Java NIO三大核心,以及重点讲解了Buffer的原理和几个使用场景,其中也用到了channel。这一章我们来理解一下selector,结合channel来做一个c/s通信。理解SelectorSelector 选择器,也叫多路复用器,可以同时处理多个客户端连接,多路复用器采用轮询机制来选择有读写事件的客户端链接进行处理。通过 Selector ,一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这解决了传统同步阻塞 I/O 一连接一线程模型,架构的性能、弹性伸原创 2021-07-31 08:36:05 · 3858 阅读 · 20 评论 -
二.Netty入门到超神系列-Java NIO 三大核心(selector,channel,buffer)
前言写数据到文件 //使用NIO向磁盘写一个文件 @Test public void nioWriteTest() throws IOException { //文件输出流 FileOutputStream fileOutputStream = new FileOutputStream("d:/1.txt"); //获取通道 FileChannel channel = fileOutputStream.getChannel(原创 2021-07-31 08:33:06 · 1358 阅读 · 16 评论 -
一.Netty入门到超神系列-BIO、NIO、AIO的认识
前言本文章是《Netty入门到超神系列》第一章,主要介绍java的三大I/O模型:BIO,NIO,AIO,因为Netty采用了NIO模型,要透彻Netty就得懂NIO原理,NIO又是在BIO基础进行演变,所以我们得对这些I/O都要有一些了解。I/O概述I/O其实是Input,Output的缩写,意思是输入和输出,比如:把磁盘中的一个文件读入Java内存中,站在Java内存的角度来看就是输入即input, 可以使用Java提供的输入流如:InputStream#read 来实现。如果是把一个段文本内容从原创 2021-07-31 08:26:39 · 1656 阅读 · 10 评论