接下来的时间灯塔君持续更新Netty系列一共九篇

当前:Netty 源码解析(一)开始

Netty 源码解析(二): Netty 的 Channel

Netty 源码解析(三): Netty 的 Future 和 Promise

Netty 源码解析(四): Netty 的 ChannelPipeline

Netty 源码解析(五): Netty 的线程池分析

Netty 源码解析(六): Channel 的 register 操作

Netty 源码解析(七): NioEventLoop 工作流程

Netty 源码解析(八): 回到 Channel 的 register 操作

Netty 源码解析(九): connect 过程和 bind 过程分析

今天呢!灯塔君跟大家讲:

Netty 源码解析(一)


前言:本文将介绍Netty,Java平台上使用最广泛的 NIO 包,它是对JDK中的NIO实现的一层封装,让我们能更方便地开发NIO程序。其实,Netty 不仅仅是NIO吧,但是基本上大家都冲着NIO来的。

灯塔君感觉国内对于Netty的吹嘘是有点过了,主要是很多人靠它吃饭,要么是搞培训的,要么是出书的,恨不得把 Netty 吹上天去,这种现象也是挺不好的,反而使得初学者觉得Netty是什么高深的技术一样。

Netty的源码不是很简单,因为它比较多,而且各个类之间的关系错综复杂,很多人说它的源码很好,这点灯塔君觉得一般,真要说好代码,还得Doug Lea的并发源码比较漂亮,一行行都是精华,不过它们是不同类型的,也没什么好对比的。

Netty源码好就好在它的接口使用比较灵活,往往接口好用的框架,源码都不会太简单。

本文将立足于源码分析,如果读者已经对Netty有些了解,或者使用过,那就更好了。

  • 本文只介绍TCP相关的内容,Netty对于其他协议的支持,不在本文的讨论范围内。
  • 和并发包的源码分析不一样,我不可能一行一行源码说,所以有些异常分支是会直接略过,除非我觉得需要介绍。
  • Netty源码一直在更新,各版本之间有些差异,我是按照2018-09-06的最新版本 4.1.25.Final 来进行介绍的。

建议初学者在看完本文以后,可以去翻翻《Netty In Action》,网上也可以找到中文文字版的。

一.准备


学习源码,一开始肯定是准备环境。

灯塔君喜欢用maven,也喜欢Spring Boot,所以我一般先到https://start.spring.io/准备一个最简单的脚手架。

10秒搞定脚手架,然后就是导入到Intellij 中,如果用新版本的Spring Boot,可能还需要等待下载依赖,期间打开https://mvnrepository.com/搜索马上要用到的maven依赖。

Netty分为好些模块,有netty-handler,netty-buffer、netty-transport、netty-common 等等也有一个netty-all,它包含了所有的模块。

既然我们是源码分析,那么自然是用一个最简单的。netty-all不是最好的选择,netty-example才是:

12   io.netty3   netty-example4   4.1.25.Final5

它不仅可以解决我们的依赖,而且example里面的示例非常适合我们学习使用。

二.Echo例子

Netty作为NIO的库,自然既可以作为服务端接受请求,也可以作为客户端发起请求.使用Netty开发客户端或服务端都是非常简单的,Netty做了很好的封装,我们通常只要开发一个或多个handler用来处理我们的自定义逻辑就可以了。

下面,我们来看一个经常会见到的例子,它叫Echo,也就是回声,客户端传过去什么值,服务端原样返回什么值。

开netty-example的源码把echo包下面的代码复制出来玩一玩。

左边是服务端代码,右边是客户端代码。

上面的代码基本就是模板代码,每次使用都是这一个套路,唯一需要我们开发的部分是handler(...)和childHandler(...)方法中指定的各个handler,如EchoServerHandlerEchoClientHandler,当然Netty源码也给我们提供了很多的handler,比如上面的 LoggingHandler,它就是Netty源码中为我们提供的,需要的时候直接拿过来用就好了。

我们先来看一下上述代码中涉及到的一些内容:

  • ServerBootstrap类用于创建服务端实例,Bootstrap用于创建客户端实例。
  • 两个EventLoopGroup:bossGroup和workerGroup,它们涉及的是Netty的线程模型,可以看到服务端有两个group而客户端只有一个,它们就是Netty中的线程池。
  • Netty中Channel,没有直接使用Java原生的ServerSocketChannel和SocketChannel,而是包装了NioServerSocketChannel和NioSocketChannel与之对应。
 当然,也有对其他协议的支持,如支持UDP协议的 NioDatagramChannel本文只关心TCP相关的。
  • 左边handler(...)方法指定了一个handler(LoggingHandler),这个handler是给服务端收到新的请求的时候处理用的,右边handler(...)方法指定了客户端处理请求过程中需要使用的handlers。
如果你想在EchoServer中也指定多个handler也可以像右边的EchoClient一样使用ChannelInitializer
  • 左边childHandler(…) 指定了childHandler,这边的handlers是给新创建的连接用的,我们知道服务端ServerSocketChannel在accept一个连接以后,需要创建SocketChannel的实例,childHandler(…)中设置的handler就是用于处理新创建的SocketChannel的,而不是用来处理ServerSocketChannel实例的。
  • pipeline:handler可以指定多个(需要上面的ChannelInitializer类辅助),它们会组成了一个 pipeline,它们其实就类似拦截器的概念,现在只要记住一点每个NioSocketChannel或NioServerSocketChannel实例内部都会有一个pipeline实例pipeline中还涉及到handler 的执行顺序。
  • ChannelFuture:这个涉及到Netty中的异步编程,和JDK中的Future接口类似。

对于不了解Netty的读者,也不要有什么压力,灯塔君会一一介绍它们,本文主要面向新手,灯塔君觉得比较难理解或比较重要的部分,会花比较大的篇幅来介绍清楚。

上面的源码中没有展示消息发送和消息接收的处理,此部分灯塔君会在介绍完上面的这些内容以后再进行介绍。

下面,将分块来介绍这些内容。鉴于读者对NIO或Netty的了解程度可能参差不齐,灯塔君为了照顾初学者很多地方需要啰嗦一些,所以希望读者一节一节往下看,对于自己熟悉的内容可以适当看快一些,敬请期待!

netty依赖_Netty系列之源码解析(一)相关推荐

  1. maven 公共模块依赖_「spring-boot 源码解析」spring-boot 依赖管理

    问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包.三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整. 微信公众号: ...

  2. Java集合系列---List源码解析(ArrayList和LinkedList的区别)

    List源码主要讲ArrayList,LinkedList,Vector三个类 1 ArrayList ArrayList是一个底层基于数组的集合, 首先来看一下它的继承关系, public clas ...

  3. Java集合系列---Collection源码解析及整体框架结构

    集合的整体框架结构及依赖关系 1.Collection public interface Collection<E> extends Iterable<E> {} Collec ...

  4. Android-PickerView系列之源码解析篇(二)

    前言 WheelView想必大家或多或少都有一定了解, 它是一款3D滚轮控件,效果类似IOS 上面的UIpickerview .按照国际惯例,先放一张效果图: 以上是Android-PickerVie ...

  5. Java集合系列---ConcurrentHashMap源码解析

    ConcurrentHashMap是Java并发容器的一员,jdk1.8以后的基本的数据结构和HashMap相似,也是选用了数组+链表/红黑树的结构,在jdk1,.7以前则是采用了分段锁的技术.Con ...

  6. Java集合系列---LinkedHashMap源码解析

    1 首先来看一下LinkedHashMap的继承关系 public class LinkedHashMap<K,V> extends HashMap<K,V> implemen ...

  7. Java集合系列---TreeMap源码解析(巨好懂!!!)

    TreeMap底层是基于红黑树实现,能实现根据key值对节点进行排序,排序可分为自然排序和定制排序. 自然排序:TreeMap的所有key必须实现Comparable接口, 定制排序:创建TreeMa ...

  8. Java集合系列---HashMap源码解析(超详细)

    1 HashMap 1)特性: 底层数据结构是数组+链表+红黑树运行null键和null值,,非线程安全,不保证有序,插入和读取顺序不保证一致,不保证有序,在扩容时,元素的顺序会被重新打乱 实现原理: ...

  9. 美团Leaf源码——号段模式源码解析

    前言 分布式ID生成策略基本要求就是全局不重复,最好还能递增,长度较短,性能高,可用性强.关于相关的实现方案有很多,本文着重使用美团开源的分布式ID生成解决方案--Leaf. 关于Leaf,美团官方的 ...

最新文章

  1. matlab生成多组多维高斯分布数据
  2. spring-data-mongodb必须了解的操作
  3. 来,锁个痛快(6)—— 与lock相关的视图和简单实验
  4. 普通内部类里面为什么不能有static字段
  5. linux安装软件不同用户名密码,Linux的安装和基本命令
  6. php 二叉树判断节点的位置,PHP实现判断二叉树是否对称的方法
  7. python中transpose函数_对numpy中的transpose和swapaxes函数详解
  8. viewer.js实现预览效果
  9. oracle知识博客链接
  10. 【数据结构与算法】排序 冒泡、插入、选择 O(n^2)
  11. pycharm 里面配置pip,安装库
  12. 第一章节 ASP.NET Web应用程序基础(二)
  13. Ciena 在MEF16发布开放分布式NFV方案
  14. PHP正则匹配Html内容,并通过浏览器弹框下载Excel
  15. 【年中总结】衣带渐宽终不悔
  16. mysql中删除两条重复的数据,只保留一条
  17. 利用bilibili增强脚本下载B站视频+更多强大功能
  18. 浅谈云计算和大数据技术
  19. C2D 代码转设计稿是怎么实现的?
  20. brew install gpg

热门文章

  1. 用python偷偷给班级群女同学的颜值进行排名,排最后的大姐说开学要打爆我
  2. redis数据库及与python交互
  3. ollections 模块之OrderedDict
  4. 通过WiFi控制智能小车机器人制作过程详解
  5. Entity Framework (EF)/Linq To entity/ ESQL(entity sql)区别 ADO.NET Entity Framework:来自微软官方的ORM框架
  6. 每天进步一点点《PCA的简要学习》
  7. 漫步线性代数十八——正交基和格拉姆-施密特正交化(下)
  8. 【图像处理】灰度加权距离变换(GWDT)
  9. 【转】HTML中的map标签
  10. Java操作数据库详解