Netty5源码分析(八) -- 总结

这个系列通过七篇文章,结合Netty5的原代码

1. 分析了服务器绑定端口的过程,从整体上可以看到Netty执行的流程和主要组件

2. 分析了Netty的线程模型,解析了Reactor模式。很多人都不理解这块,被EventLoop的名称和复杂的类层次所迷惑

3. 通过比较使用Java原生的NIO API来编程的流程,再分析了Netty是如何把这些基本流程封装地,进一步地理清了Netty的封装思路

4. 分析了Netty的事件分发模型,描述了inbound,outbound事件模型,以及Pipeline, ChannelHandlerContext,ChannelHandlerInvoker, ChannelHandler等核心组件如何实现事件分发的

5. 分析了ByteBuf缓冲区和Java原生的ByteBuffer缓冲区的异同,解释了为什么NIO编程需要缓冲区这个组件

6. 分析了CodeC编解码的类层次和主要组件。CodeC是网络编程两个要处理的基本问题之一。另一个就是底层IO

7. 分析了异步调用模型,结合实例再次分析了Netty如何处理多个线程交互

Netty5源码分析(一) -- 服务器绑定过程分析

Netty5源码分析(二) -- 线程模型分析

Netty5源码分析(三) -- Channel如何注册OP_ACCEPT, OP_READ, OP_WRITE

Netty5源码分析(四) -- 事件分发模型

Netty5源码分析(五) -- ByteBuf缓冲区

Netty5源码分析(六) -- CodeC编解码分析

Netty5源码分析(七) -- 异步执行Future和Promise

时间: 2024-10-20 00:30:44

Netty5源码分析(八) -- 总结的相关文章

Netty5源码分析(一)

Netty是一个高性能.异步事件驱动的NIO框架.作为当前最流行的NIO框架,Netty在大数据分布式计算.游戏行业.通信行业等都获得了广泛应用,一些著名开源组件也是基于Netty的NIO框架构建.本文对Netty的NIO封装源码略作分析,知其然知其所以然. Netty服务端 相比于BIO,NIO的开发要复杂的多,因此开发出稳定高性能的异步通信框架一直是个难题.Netty为了对开发者屏蔽NIO通信的底层细节,对底层NIO网络通信做了封装,使开发者只需关注自己的业务实现,降低开发工作量和开发难度.

源码分析八(org.springframework.util包之StringUtils类))

一:spring框架util包中的StringUtils类主要是处理关于字符串 的功能方法,下面直接结合代码分析: //判断字符串是否为空,如果为nul或者""则返回true,否则返回false public static boolean isEmpty(Object str) { return str == null || "".equals(str); } //判断字符串是否有长度,不等于null同时长度大于0,则为true //这里重载两个hasLength方

Dubbo源码分析(八):Javassist字节码技术生成代理

Java动态编程的作用:      通过配置生成代码,减少重复编码和维护成本 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不会频繁使用反射,因为反射的性能开销较大.其实还有一种和反射一样强大的特性,但是开销却很低,它就是Javassit. Javassit其实就是一个二方包,提供了运行时操作Java字节码的方法.大家都知道,Java代码编译完会生成.class文件,就是一堆字节码.JVM(准确说是JIT)会解释执行这些字节码(转换为机

Netty5源码分析(五) -- ByteBuf缓冲区

Netty的ByteBuf缓冲区实现地比Java本身的ByteBuffer更加灵活,方便.它的类结构也比较复杂,这里只说ByteBuf核心的几个要点. 1. 最重要的是要理解为什么要ByteBuf这个组件.主要还是因为基于select / poll / epoll这种IO多路复用技术的NIO是非阻塞同步IO的模型,由于是同步IO,需要用户线程自己来处理IO的读写,由于是非阻塞的,每次调用read, write读写的字节数是不确定的,所以非阻塞同步IO必须有缓冲区这个组件来保存每次读写的中间状态,

Netty5源码分析(七) -- 异步执行Future和Promise

java.util.concurrent.Future是Java提供的接口,表示异步执行的状态,Future的get方法会判断任务是否执行完成,如果完成就返回结果,否则阻塞线程,直到任务完成. // Java FutureTask.get() public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); r

Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析

本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截图大家了解一下都有哪些文件.红色框里面的就是我们今天要分析的文件. 从命名上可以了解,这个文件夹里的文件主要包含了  场景,层,变换这三种类型的文件. 下面我们先分析Scene类 打开CCScene.h文件 /** @brief Scene is a subclass of Node that is us

Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

[题目] 原文: 1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not. FOLLOW UP Write the test cases for

ABP源码分析二十八:ABP.MemoryDB

这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库的必然要注入efUnitOfWork. 而注入了efUnitOfWork就不能在注入MemoryDbUnitOfWork了. MemoryDatabase:这是一个单例.ABP通过Dictionary<Type, object>+lock作为数据结构来实现内存数据库.其以entity的类型作为ke

Spark Job的提交与task本地化分析(源码阅读八)

我们又都知道,Spark中任务的处理也要考虑数据的本地性(locality),Spark目前支持PROCESS_LOCAL(本地进程).NODE_LOCAL(本地节点).NODE_PREF.RACK_LOCAL(本地机架).ANY(任何)几种.其他都很好理解,NODE_LOCAL会在spark日志中执行拉取数据所执行的task时,打印出来,因为Spark是移动计算,而不是移动数据的嘛. 那么什么是NODE_PREF? 当Driver应用程序刚刚启动,Driver分配获得的Executor很可能还