TOP
0
0
【簡體曬書區】 單本79折,5本7折,活動好評延長至5/31,趕緊把握這一波!
Netty權威指南(第2版)(簡體書)
滿額折

Netty權威指南(第2版)(簡體書)

人民幣定價:89 元
定價
:NT$ 534 元
優惠價
87465
領券後再享88折
海外經銷商無庫存,到貨日平均30天至45天
可得紅利積點:13 點
相關商品
商品簡介
作者簡介
名人/編輯推薦
書摘/試閱

商品簡介

《Netty 指南(第2 版)》是異步非阻塞通信領域的經典之作,基于新版本的Netty 5.0 編寫,是很難得一見的深入介紹Netty 原理和架構的書籍,也是作者多年實戰經驗的總結和濃縮。內容不僅包含Java NIO入門知識、Netty 的基礎功能開發指導、編解碼框架定制等,還包括私有協議棧定制和開發、Netty 核心類庫源碼分析,以及Netty 的架構剖析。

作者簡介

李林鋒:Netty中國推廣者,現華為技術有限公司平臺中間件架構與設計部設計師,公司總裁技術創新獎獲得者。長期從事高性能通信軟件的架構設計和開發工作,有多年在NIO領域的設計、開發和運維經驗,精通NIO編程和Netty、Mina等主流NIO框架。目前負責華為軟件公司下一代SOA中間件和PaaS平臺的架構設計工作。

名人/編輯推薦

? ? 1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過本書你可以全面、系統地理解Netty 架構設計理念,以及異步NIO 編程。1、Hadoop、Storm、Spark、Facebook、Twitter、Ali baba都在使用Java高性能NIO通信框架Netty,本書告訴你Why,通過本書你可以全面、系統地理解Netty 架構設計理念,以及異步NIO 編程。? ? 2、本書作者為一線專家,在產品中廣泛應用了Netty等NIO框架,具有豐富的多年實踐經驗,這就使得本書內容帶有很強的實踐性,讓你更全面快速掌握Java高并發異步通信的優先選擇?框架——Netty的用法。? ??3、本書版出版后受到業界的一致好評,應讀者的要求,第2版增加了MessagePack 編解碼、服務端創建、客戶端創建、高性能之道、可靠性、安全性等內容,內容更精彩。
推薦購買:? href='#' target='_blank'>云計算網絡珠璣《 href='#' target='_blank'>實戰Java虛擬機——JVM故障診斷與性能優化《 href='#' target='_blank'>大型分布式網站架構設計與實踐》 《 href='#' target='_blank'>老碼說編程之玩轉Swift江湖》

書摘/試閱

13.2.1Netty服务端创建时序图
下面我们对Netty服务端创建的关键步骤和原理进行讲解。
步骤1:创建ServerBootstrap实例。ServerBootstrap是Netty服务端的启动辅助类,它提供了一系列的方法用于设置服务端启动相关的参数。底层通过门面模式对各种能力进行抽象和封装,尽量不需要用户跟过多的底层API打交道,降低用户的开发难度。
我们在创建ServerBootstrap实例时,会惊讶地发现ServerBootstrap只有一个无参的构造函数,作为启动辅助类这让人不可思议,因为它需要与多个其他组件或者类交互。ServerBootstrap构造函数没有参数的根本原因是因为它的参数太多了,而且未来也可能会发生变化,为了解决这个问题,就需要引入Builder模式。《Effective Java》第二版第2条建议遇到多个构造器参数时要考虑用构建器,关于多个参数构造函数的缺点和使用构建器的优点大家可以查阅《Effective Java》,在此不再详述。
步骤2:设置并绑定Reactor线程池。Netty的Reactor线程池是EventLoopGroup,它实际就是EventLoop的数组。EventLoop的职责是处理所有注册到本线程多路复用器Selector上的Channel,Selector的轮询操作由绑定的EventLoop线程run方法驱动,在一个循环体内循环执行。值得说明的是,EventLoop的职责不仅仅是处理网络I/O事件,用户自定义的Task和定时任务Task也统一由EventLoop负责处理,这样线程模型就实现了统一。从调度层面看,也不存在在EventLoop线程中再启动其他类型的线程用于异步执行另外的任务,这样就避免了多线程并发操作和锁竞争,提升了I/O线程的处理和调度性能。
步骤3:设置并绑定服务端Channel。作为NIO服务端,需要创建ServerSocketChannel,Netty对原生的NIO类库进行了封装,对应实现是NioServerSocketChannel。对于用户而言,不需要关心服务端Channel的底层实现细节和工作原理,只需要指定具体使用哪种服务端Channel即可。因此,Netty的ServerBootstrap方法提供了channel方法用于指定服务端Channel的类型。Netty通过工厂类,利用反射创建NioServerSocketChannel对象。由于服务端监听端口往往只需要在系统启动时才会调用,因此反射对性能的影响并不大。相关代码如下。
public ServerBootstrap channel(Class< extends ServerChannel> channelClass) {
if (channelClass == null) {
throw new NullPointerException('channelClass');
}
return channelFactory(new ServerBootstrapChannelFactory(channelClass));
}
步骤4:链路建立的时候创建并初始化ChannelPipeline。ChannelPipeline并不是NIO服务端必需的,它本质就是一个负责处理网络事件的职责链,负责管理和执行ChannelHandler。网络事件以事件流的形式在ChannelPipeline中流转,由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行。典型的网络事件如下。
(1)链路注册;
(2)链路激活;
(3)链路断开;
(4)接收到请求消息;
(5)请求消息接收并处理完毕;
(6)发送应答消息;
(7)链路发生异常;
(8)发生用户自定义事件。
步骤5:初始化ChannelPipeline完成之后,添加并设置ChannelHandler。ChannelHandler是Netty提供给用户定制和扩展的关键接口。利用ChannelHandler用户可以完成大多数的功能定制,例如消息编解码、心跳、安全认证、TSL/SSL认证、流量控制和流量整形等。Netty同时也提供了大量的系统ChannelHandler供用户使用,比较实用的系统ChannelHandler总结如下。
(1)系统编解码框架——ByteToMessageCodec;
(2)通用基于长度的半包解码器——LengthFieldBasedFrameDecoder;
(3)码流日志打印Handler——LoggingHandler;
(4)SSL安全认证Handler——SslHandler;
(5)链路空闲检测Handler——IdleStateHandler;
(6)流量整形Handler——ChannelTrafficShapingHandler;
(7)Base64编解码——Base64Decoder和Base64Encoder。
创建和添加ChannelHandler的代码示例如下。
.childHandler(new ChannelInitializer() {
@Override
public void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast(
new EchoServerHandler());
}
});
步骤6:绑定并启动监听端口。在绑定监听端口之前系统会做一系列的初始化和检测工作,完成之后,会启动监听端口,并将ServerSocketChannel注册到Selector上监听客户端连接,相关代码如下。
protected void doBind(SocketAddress localAddress) throws Exception {
javaChannel().socket().bind(localAddress, config.getBacklog());
}
步骤7:Selector轮询。由Reactor线程NioEventLoop负责调度和执行Selector轮询操作,选择准备就绪的Channel集合,相关代码如下。
private void select() throws IOException {
Selector selector = this.selector;
try {

//此处代码省略......
int selectedKeys = selector.select(timeoutMillis);
selectCnt ;
//此处代码省略......
}
步骤8:当轮询到准备就绪的Channel之后,就由Reactor线程NioEventLoop执行ChannelPipeline的相应方法,终调度并执行ChannelHandler,接口如图13-2所示。
步骤9:执行Netty系统ChannelHandler和用户添加定制的ChannelHandler。ChannelPipeline根据网络事件的类型,调度并执行ChannelHandler,相关代码如下。
public ChannelHandlerContext fireChannelRead(Object msg) {
DefaultChannelHandlerContext next = findContextInbound(MASK_CHANNEL_READ);
next.invoker.invokeChannelRead(next, msg);
return this;
}

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 465
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區