范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Netty源码分析之设计模式在Netty框架中的应用

  如果你对设计模式不是很熟悉,建议补习一下设计模式再来阅读本章的内容。本章主要分析设计模式的应用案例,不对设计模式本身做详细讲解。1.1 单例模式源码举例
  单例模式要点回顾如下。
  (1)一个类在任何情况下只有一个对象,并提供一个全局访问点。
  (2)延迟创建。
  (3)避免线程安全问题。
  Netty中的单例模式应用非常广泛,单例模式本身也比较简单,下面列举MqttEncoder类,采用饿汉式单例的写法。饿汉式单例最大的优点就是简单,绝对线程安全。具体代码如下。
  1.2 策略模式源码举例
  策略模式要点回顾如下。
  (1)封装一系列可相互替换的算法家族。
  (2)动态选择某一个策略。
  Netty在根据CPU核数分配线程数量的一个优化时,如果是2的平方则采用PowerOfTwoEventExecutorChooser来创建EventExecutorChooser,如果不是2的平方则采用GenericEventExecutorChooser来创建EventExecutorChooser,这里用的是三元运算选择策略,具体代码如下。
  1.3 装饰者模式源码举例
  装饰者模式要点回顾如下。
  (1)装饰者和被装饰者实现同一个接口。
  (2)装饰者通常继承被装饰者,同宗同源。
  (3)动态修改、重载被装饰者的方法。
  从Netty的ByteBuf类结构图可以看到,ByteBuf的直接实现类有五个,忽略WrappedByteBuf这个类,其实直接实现类有四个。为什么要忽略掉WrappedByteBuf呢?因为它是ByteBuf装饰者的基类,本身没有任何实现功能。来看WrappedByteBuf的代码,主要功能就是保存被装饰者的引用。
  具体的装饰者,继承上面的装饰者的顶级类,在自己的构造函数中接收ByteBuf的类型的参数,并把它传递给它的父类,用户在调用装饰者时,会把创建的最上面的四种待装饰的组件类以构造方法的形式传递进去,整个体系就运行起来了。而且装饰者可以按照自己的需求重写父类的方法,或者在现在的基础上添加新的方法调用进行增强。例如UnreleasableByteBuf类,重写了release()方法,并返回false表示UnreleasableByteBuf不支持被释放。
  再比如SimpLeakAwareByteBuf类,从字面意思来看,其实是一个内存泄露感知的ByteBuf,同样继承自WrappedByteBuf。从构造方法来看,其构造参数多了一个ResourceLeak,主要用于对内存泄露的跟踪。主要差异在于增加了release()方法,代码如下。
  看到上面的代码,还是来关注release()方法。它调用release()方法,根据返回结果额外增加了一个资源泄露的监控行为。1.4 观察者模式源码举例
  观察者模式要点回顾如下。
  (1)两个角色:观察者和被观察者。
  (2)观察者订阅消息,被观察者发布消息。
  (3)订阅则能收到消息,取消订阅则收不到消息。
  Netty里面的观察者和被观察者模式一般用Promise和Future来实现。项目中用得比较多的一个方法就是channel.writeAndFlush()方法。当调用channel.writeAndFlush()方法的时候,实际上就是创建了一个被观察者ChannelFuture,来看源码。
  writeAndFlush()方法的返回值是ChannelFuture。当调用ChannelFuture的addListener()方法的时候,其实就是往ChannelFuture中添加被一个ChannelPromise,继续往下跟踪源码。
  上面的writeAndFlush()方法还有一个重载方法,其中一个参数就是ChannelPromise,通常情况下Future和Promise是成对出现的。我们发现ChannelPromise就是ChannelFuture的子类,在Promise中定义了非常多的回调方法,提供给用户去重载,用户用自己的逻辑通常实现各种Listener接口来重载达到回调通知的目的。1.5 迭代器模式源码举例
  迭代器模式要点回顾如下。
  (1)实现迭代器接口。
  (2)实现对容器中的各个对象逐个访问的方法。
  Netty里面的CompositeByteBuf这个零拷贝的实现,就使用了迭代器模式。首先看一段代码。
  这段代码把两个ByteBuf添加到一起,forEachByte就是实现了迭代器模式。那么为什么说它是零拷贝呢?
  我们找到forEachByte()的实现,在AbstractByteBuf里面,有下面这样一段代码。
  从readerIndex开始读,读到writeIndex。继续跟进forEachByteAsc0()方法,查看源码。
  继续看getByte()方法的实现,找到CompositeByteBuf类的实现。
  先找到Index对应的Component,然后迭代的时候直接返回Component的Byte内容,就实现了零拷贝。其他的ByteBuf如果迭代的话,可能会把所有的数据都拷贝一遍。1.6 责任链模式源码举例
  责任链是指多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。然后,将这些对象连成一条链,并且沿着这条链往下传递请求,直到有一个对象可以处理它为止。在处理过程中,每个对象只处理它自己关心的那一部分,不相关的部分可以继续往下传递,直到链中的某个对象不想处理,可以将请求终止或丢弃。
  责任链模式要点回顾如下。
  (1)需要有一个顶层责任处理接口。
  (2)需要有动态创建链、添加和删除责任处理器的接口。
  (3)需要有上下文机制。
  (4)需要有责任终止机制。
  Netty的Pipeline就是采用了责任链设计模式,底层采用双向链表的数据结构,将链上的各个处理器串联起来。客户端每一个请求到来,Netty都认为是Pipeline中所有的处理器都有机会处理它。因此,对于入栈的请求,全部从头节点开始往后传播,一直传播到尾节点(来到尾节点的msg才会被释放)。
  Netty的责任链模式中的组件如下。
  (1)责任处理器接口ChannelHandler。
  (2)添加删除责任处理器的接口ChannelPipeline。
  (3)上下文组件ChannelHandlerContext,可获得用户记需要的数据。
  (4)终止责任链的ctx.fireXXX()方法,可终止传播事件。
  Pipeline中所有的Handler为顶级抽象接口,它规定了所有的Handler统一要有添加、移除、异常捕获的行为。
  Pipeline中的Handler被封装进了上下文中。通过上下文可以轻松获取当前节点所属的Channel及其线程执行器。
  责任终止机制包括如下内容。
  (1)Pipeline中的任意一个节点,只要不手动往下传播,这个事件就会在当前节点终止传播。
  (2)对于入栈数据,默认会传递到尾节点进行回收,如果不进行下一步传播,事件就会终止在当前节点。
  (3)对于出栈数据,头节点使用Unsafe对象,把数据写回客户端也意味着事件的终止。
  底层事件的传播使用的就是针对链表的操作,如AbstractChannelHandlerContext类的findContextInbound()方法。
  1.7 工厂模式源码举例
  工厂模式的要点就是将创建对象的逻辑封装起来。
  我们最先接触ReflectiveChannelFactory就是专门用来创建Channel的工厂,它接收一个Class对象,然后调用Class的newInstance()方法,将创建好的对象返回去。
  Netty中的设计模式应用非常多,这里不再一一列举,希望大家花时间去探索,这样才能够有更多的收获。本章旨在为大家打开深入探索Netty的大门,有不妥之处请纠正交流。

从台积电张忠谋想起中国芯片教父张汝京我在美国前三四年是学习,后十几年是工作,所有这一切都在做准备,为了回到祖国后能为人民做点事,因为我是中国人。钱学森钱学森携妻儿回国2022年8月3日,蔡英文昨中午宴请美国众议院议长中国制造,世界第一今天早上我们大家都看到了一个巨大的钢环,从山东济南上高速,然后直奔港口,它被誉为世界第一环,我们看到它在高速上运输和行驶的过程之中,大到它几乎涵盖了所有的车道。那它为什么被称作世界丢掉代言遭网友抵制,李立群后知后觉表明立场只有一个中国8月9日晚,来自台湾省的老戏骨李立群,分享了一张世界上只有一个中国的图片,以此来表明支持统一的立场。李立群这张表明立场的图片比其他明星晚了好几天,而且很像是遭遇口碑危机之后不得已而化肥跌价降温秋肥备货热情生产企业出台保价政策刺激拿货化肥跌价降温秋肥备货热情生产企业出台保价政策刺激拿货财联社8月10日电,记者近日从化肥企业及贸易商处了解到,当前化肥生产企业因新产能投产提前收取预付款等因素,已经形成部分积压库存,湖南九旬老太29年不吃饭,身体倍棒还能下地干活,医生道出真相文星空奇谈编辑星空奇谈俗话说人是铁饭是钢,一顿不吃饿得慌!然而在我们湖南的一个山村里,却有一位老太太长达29年不吃饭,照样下地干活,精神抖擞。不过很多人可能会问,那会不会是不吃米饭为什么尿毒症越来越多?医生劝说5个原因别碰,肾会感谢你29岁的小李一个月前被诊断为尿毒症晚期,为什么会这样?这还得从三个月前说起,小李每天早上起床都感觉腰酸背痛身体浮肿,但是到晚上又会有所缓解,所以他没有太在意,以为是工作过于辛苦以及身上长红痣,一定是肝脏出问题了吗?肝病医生来揭秘今天收到一位粉丝(小杨)的私信,小杨近期身上长了许多红痣,起先小杨并没有在意,但红痣越长越多,这也不由得让小杨担心起来。小杨说之前也看了不少视频,记得有提到过肝病患者会长蜘蛛痣,尤美国顶级华裔女医生被捕,给大8岁丈夫下慢毒,家中监控录到证据于医生(YueP。Yu,音译),是一位居住在美国加利福尼亚州橘郡中部尔湾市(Irvine,居民主要是中上层家庭)的皮肤科医生,在普罗维登斯教会医院工作。据纽约邮报当地时间8月8日的医生坦言这5个检查项目,花的钱是冤枉钱,真没必要做2018年国家卫健委抽样调查职业病,发现就业人口7。76亿人中,就有超过2亿存在各类职业病。随着社会经济的迅猛发展和工作生活节奏的加快,很多人都出现了社会病职业病。于是人们开始有了莆田17岁小伙被捅身亡,家属要求查看监控被拒,向酒楼讨要说法儿子被人捅死,我只是想看看事发时的监控,你们酒楼为何不肯提供?8月8日,福建莆田一名网友爆料,一17岁小伙在涵江区某酒楼打工时被陌生人捅死,其母亲要求查看事发当天监控视频遭到拒绝。脚气难耐,奇痒无比!医生一招制敌,方法不是泡脚(声明本文仅用于科普用途,为了保护患者隐私,以下内容里的相关信息已进行处理)基本信息男,23岁疾病类型足癣治疗医院广西中医药大学第一附属医院治疗方案予以硝酸奥昔康唑乳膏卢立康唑乳膏
三星将在SDC22大会上正式发布OneUI5。0系统近日三星正式宣布,将于10月12日上午1000(北京时间10月13日凌晨1点)在美国旧金山组织SDC22三星开发人员大会。在SDC22主题演讲中,三星核心UX团队负责人HyunKi小米米家智能吸顶灯Pro发布,599元起IT之家10月11日消息,小米上新了一款米家智能吸顶灯Pro,包含卧室版和客厅版,首发价549元起。米家智能吸顶灯Pro卧室版采用圆形设计,最大功率为55W,光通量达到了3700l中国能制造一部100纯国产手机吗?自1998年中国第一部国产手机科健KCH2000上市以来,经过35年发展,中国手机行业取得了蓬勃发展,截止目前,我们已拥有了全球最大最完整的手机产业链,但即使如此,我们依然无法实现4500元装游戏电脑,性能超够用,性价比巨高最近RTX4090显卡的问世价格让人望而却步,相信很多人都在等待中端系列的RTX40系显卡,不过大概率要等到年底或者明年才能上市,目前想要装机玩游戏的同学怎么办呢?浩南给大家分享一进入分子保鲜时代TCL以健康品质领鲜冰箱行业发展北京时间2022年10月10日,TCL召开了2022年秋季新品冰箱发布会,正式发布了TCL格物系列冰箱Q10。冰箱产品作为家电领域最为成熟的家电之一,稳定发展期后如何创新始终是困扰鲁大师2022年Q3手机报告最流畅的安卓手机竟是折叠屏?进入十月份,鲁大师准备了一段时间后终于更新发布了2022年Q3季度报告,这个报告涵盖了手机性能榜手机芯片榜手机流畅度排行手机UI流畅度排行手机AI排行手机温度排行安卓新增市场占比实凯琦供应链今年圣诞亚马逊美国站爆款单品预测从亚马逊美国站发布的过往圣诞节销售情况显示,2020年平台销售额达到2000万,2021年则以五倍的速度增长,有超过10亿件商品被售出,从销售量走势来判断,今年圣诞期间的业绩也指定14岁森碟运动大片曝光,扎高马尾元气满满,露大长腿肉脸酷似爸爸饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!10月11日,田亮女儿森碟最新广告大片释出,年仅14岁的她连换多套造型拍摄写真,气质出众,引起网友们的关注。晒出的照片中关于拉皮手术,医生心知肚明,但求美者不知道的3件事抽空我都会看大家的评论,关于拉皮手术问最多的是费用其次是后遗症紧接着能不能去掉法令纹眼袋等问题,会发现大家一些想法跟医学本质差太多,今天就简单聊聊拉皮手术医生心知肚明,但求美者不知我不是来看梁咏琪的,我来看亲子装头条创作挑战赛想不到梁咏琪46岁了,依然是皮肤光滑紧致,身材保持得不错,风采不减当年,美得很有特色。你们有听过她的歌吗?想不到梁咏琪的女儿才7岁,就长那么高,长腿非常瞩目,个头快到内容场中心场?抖音电商助力美妆品牌打造新增量进入2022年,国货美妆在抖音电商迎来了新机遇。在兴趣电商升级为全域兴趣电商的基础之上,抖音电商不断推出各类IP营销和节日活动助力美妆品牌破圈生长。9。2310。6,抖音电商美妆行