Netty系列之源码解析(一)

时间:2022-05-02 14:47:21

本文首发于微信公众号【猿灯塔】,转载引用请说明出处

接下来的时间灯塔君持续更新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才是:

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包下面的代码复制出来玩一玩。
Netty系列之源码解析(一)左边是服务端代码,右边是客户端代码

上面的代码基本就是模板代码,每次使用都是这一个套路,唯一需要我们开发的部分是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的了解程度可能参差不齐,灯塔君为了照顾初学者很多地方需要啰嗦一些,所以希望读者一节一节往下看,对于自己熟悉的内容可以适当看快一些,敬请期待!

365天干货不断,可以微信搜索「 猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板

Netty系列之源码解析(一)的更多相关文章

  1. Netty 核心组件 EventLoop 源码解析

    前言 在前文 Netty 启动过程源码分析 (本文超长慎读)(基于4.1.23) 中,我们分析了整个服务器端的启动过程.在那篇文章中,我们重点关注了启动过程,而在启动过程中对核心组件并没有进行详细介绍 ...

  2. JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)

    文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...

  3. Android源码解析系列

    转载请标明出处:一片枫叶的专栏 知乎上看了一篇非常不错的博文:有没有必要阅读Android源码 看完之后痛定思过,平时所学往往是知其然然不知其所以然,所以为了更好的深入Android体系,决定学习an ...

  4. quartz源码解析(一)

    本文的起因源于一次quartz的异常,在win2003正常运行的程序放在linux环境就抛出异常了,虽然找出异常没花我多长时间,不过由此加深了对quzrtz的了解:古人说,三折肱,为良医,说明经验对于 ...

  5. Sentinel源码解析二(Slot总览)

    写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...

  6. Sentinel源码解析一(流程总览)

    引言 Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性.相比于Hystrix,Sentinel的设计更加简 ...

  7. Feign 系列(04)Contract 源码解析

    Feign 系列(04)Contract 源码解析 [TOC] Spring Cloud 系列目录(https://www.cnblogs.com/binarylei/p/11563952.html# ...

  8. Netty 源码解析(三)&colon; Netty 的 Future 和 Promise

    今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...

  9. Netty 源码解析(九)&colon; connect 过程和 bind 过程分析

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第九篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...

随机推荐

  1. 我的runloop学习笔记

    前言:公司项目终于忙的差不多了,最近比较闲,想起叶大说过的iOS面试三把刀,GCD.runtime.runloop,runtime之前已经总结过了,GCD在另一篇博客里也做了一些小总结,今天准备把ru ...

  2. NSDateFormatter遇到无法转换的问题

    NSDateFormatter并不是万能的,并不是给出什么字符串都能转遍为NSDate类型,所转换的格式必须必须和你给出的格式想对应 比如说:NSString *dateStr = @"20 ...

  3. CMAKE的用法

    一.      基本使用 安装:下载二进制包后可直接解压使用 从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败 使用:cmake ...

  4. 上海Uber优步司机奖励政策(2月1日~2月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. boostrap详情解毒

    详解Bootstrap表单组件 表单常见的元素主要包括:文本输入框.下拉选择框.单选框.复选框.文本域.按钮等.下面是不同的bootstrap版本: LESS:  forms.less SASS:  ...

  6. Ubuntu &amp&semi; GitLab CI &amp&semi; Docker &amp&semi; ASP&period;NET Core 2&period;0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  7. MATLAB:图像的与、或、非、异或逻辑运算(&amp&semi;、&vert;、~、xor)

    图像的与.或.非.异或逻辑运算涉及到了&.|.~和xor符号 close all;%关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clc; clear all; I=imrea ...

  8. eclipse&period;ini参数配置

    -vmD:/jdk1.6/Java/jdk1.6.0_45/bin/javaw.exe-vmargs-Xms1024m-Xmx1024m-XX:MaxPermSize=1024m-XX:Reserve ...

  9. 大数据入门第二十二天——spark(一)入门与安装

    一.概述 1.什么是spark 从官网http://spark.apache.org/可以得知: Apache Spark™ is a fast and general engine for larg ...

  10. mybatis由浅入深day02&lowbar;7&period;4mybatis整合ehcache&lowbar;7&period;5二级缓存应用场景&lowbar;7&period;6二级缓存局限性

    7.4 mybatis整合ehcache EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速.精干等特点,是Hibernate中默认的CacheProv ...