`
wangmuming1122
  • 浏览: 11966 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

《 Netty权威指南(第2版)》 学习感悟

 
阅读更多

                                        《 Netty权威指南(第2版)》 学习感悟

1:Netty是什么?

 

        Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序dsf。

 

        也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
       “快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。
        Netty具有如下优势:
  •        处理大容量数据流更简单
  •        处理协议编码和单元测试更简单
  •        I/O超时和idle状态检测
  •        应用程序的关闭更简单,更安全
  •        更可靠的OutOfMemoryError预防

         传输方式为:

 

  •           基于BIO和NIO的UDP传输
  •           本地传输(又名 in-VM传输)
  •           HTTP通道,可绕过防火墙

          

2:Netty可以做什么?

              netty是一套在java NIO的基础上封装的便于用户开发网络应用程序的api. 应用场景很多,诸如阿里的消息队列(RocketMQ),分布式rpc(Dubbo)通信层都使用到了netty(dubbo可以用服务发现自由选择通信层). 主要优点个人总结如下:


        1. netty是非阻塞事件驱动框架, 并结合线程组(group)的概念,可以很好的支持高并发,慢连接的场景。

         2. 编程接口非常容易,并且也较好的解决了TCP粘包/拆包的问题.netty提供了自己的ByteBuf和channel,相比于jdk的ByteBuffer和channel来说更简便灵活操作, 并提供了pipeline的概念,并针对每个contextHandler都可以由用户定义, 方便直接. 

        3. 有一些web框架已经开始直接使用netty做为底层通信服务,诸如play. 这样play就不用依赖于容器去进行部署,在没有nginx做反向代理的情况下也能支持高并发.编解码器可以随意扩展,今天是个web,明天就可以是一个ftp或email服务器,个人觉得比较灵活。
 
        《 Netty权威指南(第2版)》试读章节是服务端创建,其对原生NIO类库的使用复杂性进行了讲解,对Netty服务端穿件的时序图和步骤进行了详细说明,对Netty源码对服务端创建进行剖析,最后对新的客户端接入进行了源码层面的分析和讲解。通过本章节的学习,读者可以掌握Netty服务端创建并且可以在实际中使用,编写出高效的代码。
      Netty服务端创建时序图:
          

 
   Netty服务端创建程序:
       
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpContentDecompressor;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;

import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.innoplay.httpserver.config.ConfigInfo;
import com.innoplay.httpserver.config.ConfigProperties;
import com.innoplay.service.context.ApplicationContextUtil;

/**
 * server main entrance, netty tcp server listen on configInfo.listenPort
 * 
 */
public class HttpServer {
	
	

	/**
	 * init load config information
	 */
	private static ConfigInfo configInfo;

	private static final Logger logger = LoggerFactory
			.getLogger(HttpServer.class);

	private static ServerBootstrap bootstrap;
	

	/**
	 * start server method
	 * 
	 * @param args
	 * @throws IOException
	 */
	private void start() throws Exception {
		EventLoopGroup group = new NioEventLoopGroup(configInfo.getThreadNum());
		try {
			bootstrap = new ServerBootstrap();
			bootstrap
					.group(group)
					.channel(NioServerSocketChannel.class)
					.localAddress(
							new InetSocketAddress(configInfo.getListenPort()))
					.childHandler(new ChannelInitializer<SocketChannel>() {

						/*
						 * (non-Javadoc)
						 * 
						 * @see
						 * io.netty.channel.ChannelInitializer#initChannel(io
						 * .netty.channel.Channel)
						 */
						@Override
						protected void initChannel(SocketChannel ch)
								throws Exception {

							ch.pipeline().addLast(new HttpServerCodec());
							ch.pipeline().addLast(new HttpContentDecompressor());
							ch.pipeline().addLast(new HttpObjectAggregator(Integer.MAX_VALUE));//定义
							ch.pipeline().addLast(new HttpServerHandler());

						}
					});

			ChannelFuture f = bootstrap.bind().sync();
			logger.info(HttpServer.class.getName()
					+ " started and listen on " + f.channel().localAddress());
			f.channel().closeFuture().sync();
			
		} finally {
			group.shutdownGracefully().sync();
		}
	}

	/**
	 * main entrance
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			//program argument setting/windows/linux
			//conf.path=E:\Workspace\server\trunk\innoplay-httpserver\target\conf
			if(args != null) {
				for(String s : args) {
					if(s.startsWith("--conf.path")) {
						System.setProperty(ConfigProperties.CONFIGPATH, s.replace("--conf.path=", ""));
				        PropertyConfigurator.configure(System.getProperty(ConfigProperties.CONFIGPATH) + File.separator + "log4j.properties");   

						logger.info("System has received conf.path: {}", s);
					}
				}
			} else {
				logger.error("please setting the --conf.path=XXXX, system exited!");
				System.exit(-1);
			}
	        configInfo = ConfigProperties.loadProperties();
	        
//			ApplicationContext context = new FileSystemXmlApplicationContext(System.getProperty(ConfigProperties.CONFIGPATH) + File.separator +"applicationContext.xml");
			ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
			ApplicationContextUtil.setContext(context);
			HttpServer server = new HttpServer();
			server.start();
			
		} catch (Exception e) {
			logger.error("Server occur an error!", e.getCause());
			e.printStackTrace();
		}
	}

	public static void close() {
		if (bootstrap != null) {
			try {
				bootstrap.group().shutdownGracefully().sync();
			} catch (InterruptedException e) {
				logger.error("Server close occur an error!", e.getCause());
				e.printStackTrace();
			}
		}
	}
}
 
     相信这本书对学习Netty的爱好者有很好的帮助,对编写出高效的代码有很好的帮助。
 
 
  • 大小: 147.3 KB
分享到:
评论

相关推荐

    Netty权威指南 第2版 带书签目录 完整版

    Netty权威 第2版 带书签目录 RPC dubbo Netty权威 第2版 带书签目录 RPC dubbo Netty权威 第2版 带书签目录 RPC dubbo Netty权威 第2版 带书签目录 RPC dubbo Netty权威 第2版 带书签目录 RPC dubbo Netty权威 第2版...

    Z00317 NETTY权威指南(第2版)

    Z00317 NETTY权威指南(第2版)

    Netty权威指南第二版源代码

    《Netty权威指南第二版》源代码是一份珍贵的学习资源,由知名作者李林锋编写,专注于Java网络编程框架Netty的深入解析。这个压缩包包含的不仅是代码,更是理解和掌握Netty技术的关键。Netty是基于Java NIO(非阻塞I/...

    Netty权威指南完整版高清pdf

    总的来说,《Netty权威指南》是一本全面且深入的Netty学习资料,无论你是初学者还是有经验的开发者,都能从中获益,提升你的网络编程技能,为构建高性能、低延迟的网络应用打下坚实基础。通过阅读这本书,你将能够...

    netty权威指南 第1版(李林峰) + 源码

    《Netty权威指南》第1版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...

    netty权威指南 第二版 李林锋pdf

    《Netty权威指南》第二版是由李林锋编著的一本深入解析Netty框架的专业书籍。Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于开发高并发、低延迟的网络应用,如分布式系统、游戏服务器、云计算平台...

    Netty权威指南 第2版

    netty权威指南 第二版是一本Netty架构学习指南,由李林锋编著。本书深入剖析了Netty,更全面系统讲解底层架构、实践与源码,能够让读者更清晰地理解Netty 架构设计理念,第2版增加了MessagePack 编解码、服务端创建...

    Netty权威指南第二版

    《Netty 权威指南(第2 版)》适合架构师、设计师、软件开发工程师、测试人员以及其他对JavaNIO 框架、Netty 感兴趣的相关人士阅读,通过《Netty 权威指南(第2 版)》的学习,读者不仅能够掌握Netty 基础功能的使用...

    Netty权威指南PDF书籍

    总而言之,《Netty 权威指南》是一本深入讲解 Netty 框架的书籍,对于想要在 IT 领域提升网络编程技能的开发者来说,是不可或缺的学习资料。通过学习,你可以了解并掌握如何利用 Netty 构建高效、可靠的网络服务。

    netty权威指南 第2版(李林峰) + 源码

    《Netty权威指南》第2版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...

    Netty权威指南(第二版)

    《Netty权威指南(第二版)》是深入理解Netty的关键参考资料,它详细介绍了Netty的设计理念、核心组件以及如何利用Netty构建高效网络应用。 在Netty中,关键知识点包括: 1. **NIO基础**:Netty基于Java NIO(非...

    《Netty权威指南(第二版)》.pdf

    根据提供的信息,《Netty权威指南(第二版)》是一本专注于Netty框架的书籍,旨在为读者提供深入理解和掌握Netty所需的知识与实践技巧。以下将根据标题、描述及部分标签内容来概述Netty框架的核心知识点。 ### ...

    Netty权威指南 第2版 带书签目录 高清完整版.pdf

    《Netty 权威指南(第2 版)》适合架构师、设计师、软件开发工程师、测试人员以及其他对Java NIO 框架、Netty 感兴趣的相关人士阅读,通过《Netty 权威指南(第2 版)》的学习,读者不仅能够掌握Netty 基础功能的...

    Netty权威指南 第2版 [李林锋著作]

    Netty权威指南 第2版 [李林锋著作][电子工业出版社][2015.04][554页]

    Netty权威指南 第2版 PDF电子书下载 带书签目录2

    《Netty权威指南 第2版》还包含了书签目录,使得读者能更方便地定位到所需的内容,提升学习和查阅的效率。无论你是Java通信领域的初学者,还是经验丰富的专业人士,这本书都将成为你提升技能、解决问题的重要参考...

    Netty权威指南高清版本

    总而言之,《Netty权威指南》是一本全面而实用的Netty学习资料,无论你是初学者还是有经验的开发者,都能从中获益匪浅。通过阅读这本书,你将能够深入了解Netty框架,提高网络编程的效率和质量,为你的IT事业奠定...

Global site tag (gtag.js) - Google Analytics