今天是猿灯塔365篇**原创计划”第一篇。面试
接下来的时间灯塔君持续更新Netty系列一共九篇spring
当前:Netty 源码解析(一)开始编程
Netty 源码解析(二): Netty 的 Channel微信
Netty 源码解析(三): Netty 的 Future 和 Promise并发
Netty 源码解析(四): Netty 的 ChannelPipeline框架
Netty 源码解析(五): Netty 的线程池分析异步
Netty 源码解析(六): Channel 的 register 操做maven
Netty 源码解析(七): NioEventLoop 工做流程异步编程
Netty 源码解析(八): 回到 Channel 的 register 操做oop
Netty 源码解析(九): connect 过程和 bind 过程分析
今天呢!灯塔君跟你们讲:
Netty 源码解析(一)
前言:本文将介绍Netty,Java平台上使用最普遍的 NIO 包,它是对JDK中的NIO实现的一层封装,让咱们能更方便地开发NIO程序。其实,Netty 不只仅是NIO吧,可是基本上你们都冲着NIO来的。
灯塔君感受国内对于Netty的吹嘘是有点过了,主要是不少人靠它吃饭,要么是搞培训的,要么是出书的,巴不得把 Netty 吹上天去,这种现象也是挺很差的,反而使得初学者以为Netty是什么高深的技术同样。
Netty的源码不是很简单,由于它比较多,并且各个类之间的关系错综复杂,不少人说它的源码很好,这点灯塔君以为通常,真要说好代码,还得Doug Lea的并发源码比较漂亮,一行行都是精华,不过它们是不一样类型的,也没什么好对比的。
Netty源码好就好在它的接口使用比较灵活,每每接口好用的框架,源码都不会太简单。
本文将立足于源码分析,若是读者已经对Netty有些了解,或者使用过,那就更好了。
建议初学者在看完本文之后,能够去翻翻《Netty In Action》,网上也能够找到中文文字版的。
一.准备
学习源码,一开始确定是准备环境。
灯塔君喜欢用maven,也喜欢Spring Boot,因此我通常先到https://start.spring.io/准备...。
10秒搞定脚手架,而后就是导入到Intellij 中,若是用新版本的Spring Boot,可能还须要等待下载依赖,期间打开https://mvnrepository.com/搜...。
Netty分为好些模块,有netty-handler,netty-buffer、netty-transport、netty-common 等等也有一个netty-all,它包含了全部的模块。
既然咱们是源码分析,那么天然是用一个最简单的。netty-all不是最好的选择,netty-example才是:
> 1<dependency\> > 2 <groupId\>io.netty</groupId\> > 3 <artifactId\>netty-example</artifactId\> > 4 <version\>4.1.25.Final</version\> > 5</dependency\>
它不只能够解决咱们的依赖,并且example里面的示例很是适合咱们学习使用。
二.Echo例子
Netty做为NIO的库,天然既能够做为服务端接受请求,也能够做为客户端发起请求.使用Netty开发客户端或服务端都是很是简单的,Netty作了很好的封装,咱们一般只要开发一个或多个handler用来处理咱们的自定义逻辑就能够了。
下面,咱们来看一个常常会见到的例子,它叫Echo,也就是回声,客户端传过去什么值,服务端原样返回什么值。
开netty-example的源码把echo包下面的代码复制出来玩一玩。
左边是服务端代码,右边是客户端代码。
上面的代码基本就是模板代码,每次使用都是这一个套路,惟一须要咱们开发的部分是handler(...)和childHandler(...)方法中指定的各个handler,如EchoServerHandler和EchoClientHandler,固然Netty源码也给咱们提供了不少的handler,好比上面的 LoggingHandler,它就是Netty源码中为咱们提供的,须要的时候直接拿过来用就行了。
咱们先来看一下上述代码中涉及到的一些内容:
固然,也有对其余协议的支持,如支持UDP协议的 NioDatagramChannel本文只关心TCP相关的。
若是你想在EchoServer中也指定多个handler也能够像右边的EchoClient同样使用ChannelInitializer
对于不了解Netty的读者,也不要有什么压力,灯塔君会一一介绍它们,本文主要面向新手,灯塔君以为比较难理解或比较重要的部分,会花比较大的篇幅来介绍清楚。
上面的源码中没有展现消息发送和消息接收的处理,此部分灯塔君会在介绍完上面的这些内容之后再进行介绍。
下面,将分块来介绍这些内容。鉴于读者对NIO或Netty的了解程度可能良莠不齐,灯塔君为了照顾初学者不少地方须要啰嗦一些,因此但愿读者一节一节往下看,对于本身熟悉的内容能够适当看快一些,敬请期待!
365天干货不断,能够微信搜索「 猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板