`
san_yun
  • 浏览: 2639014 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

netty的一点学习笔记

 
阅读更多

原文:http://macrochen.iteye.com/blog/1608383

主要参考在这篇 文章, 写的非常好.

netty主要是一个异步的nio server/client framework

它采用了event driven模式

netty主要针对异步(asynchronous)请求的处理

netty channel可以理解为传输请求的另外一种抽象, 是netty最核心的概念, 它既可以表示一个socket, 也可以表示一个file, 总之就是I/O的一个抽象.

channel提供了一个网络连接和向目标对象写数据的接口, 而对于异步方式来说, 没有读的概念(通过listener来监听返回数据), Channel的返回结果会放在ChannelFuture中

netty不仅实现异步, 也有同步实现, 不过是内部也是采用的future机制

channel分server和client两种

channel由ChannelFactory创建, 它需要提供两个线程池: boss线程池, worker线程池, boss线程池用来监听连接, 将接受到的数据传给worker线程池处理, 一般只会有一个boss thread.

worker thread应该注意的一点是千万别被block和deadlock, 否则会导致整个吞吐量上不去.   尽量保证worker thread简单专一, 剥离无关内容, 能快速完成处理.

boss thread只有一个, 但是为什么要用thread pool?
1.可能有多个channel factory, 这些factory可以共用一个boss thread pool来创建boss thread.
2.boss thread可以中途进行释放, 为了避免重复create的开销, 可以用一个小型的thread pool来管理

所有资源的分配都是通过channel factory来完成, 因此如果需要释放资源, 需要调用realseExternalResources()

channel的使用三部曲:

  • 创建
  • 监听socket
  • 调用write(Object message)接受数据. 不过这里只能接受ChannelBuffer类型的数据.



这里需要提到Channel另外一个组成部分, ChannelPipeline. 它主要完成对传入的内容的解析处理.为了保证这个解析的灵活性, 或包含一系列的, 各种类型的解析器, 这些解析器最后将以ChannelHandler的方式进行组织. ChannelPipeline则包含多种ChannelHandler, 一般第一个ChannelHandler接受ChannelBuffer, 最后一个ChannelHandler(通常命名为sink)用来去掉payload信息. ChannelHandler是一个标志接口, 灵活性非常强, 它一般会通过接受ChannelEvent(内含ChannelBuffer)来完成对数据的处理.

ChannelHandler主要包含两类: Encoder(将数据流转换成ChannelBuffer), Decoder

除了编解码之外, 还有一些其他类型的channelHandler, 比如将channel event丢到thread pool中处理的ExecutionHandler, 用于同步处理的BlockingReadHandler, 用于打日志的LoggingHandler

client bootstrap 是connect, server bootstrap是bind

如果让client传上来的channelbuffer经过处理之后, 再原路返回一些消息给client, 在ChannelHandler中一般这样写:

  Channel channel = e.getChannel();
  ChannelFuture channelFuture = Channels.future(e.getChannel());
  ChannelEvent responseEvent = new DownstreamMessageEvent(channel, channelFuture, newDate, channel.getRemoteAddress());
  ctx.sendDownstream(responseEvent);
  // But still send it upstream because there might be another handler
  super.messageReceived(ctx, e);

 这里返回数据需要注意两点, 一个是可能返回的handler之后还有handler, 我们还需要继续将修改后的内容继续往后传递, 另外一个就是返回的数据可能不希望再被其中的某些handler处理.

handler可以分为upstream handler(channel pipeline向外面发数据), downstream handler(外面向channel pipeline发数据)和 both handler. 我觉得这个up, down名字取得不好, 应该是out=up, in=down, 不过如果将channel pipeline想象成一个口袋, 可能更好理解. 或者理解成: read up, write down

pipeline中的handler可以动态调整, 比如下面的这个, 就是根据传入的内容的大小来决定是否需要使用压缩handler来进行压缩处理

 public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) {
  // If the message is not a ChannelBuffer, hello ClassCastException !
  ChannelBuffer cb = (ChannelBuffer)e.getMessage();
  // Check to see if we already removed the handler
  boolean pipelineContainsCompressor = ctx.getPipeline().getContext(nameOfCompressionHandler)!=null;
  if(cb.readableBytes() < sizeThreshold) { 
   if(pipelineContainsCompressor) {
    // The payload is too small to be compressed but the pipeline contains the compression handler
    // so we need to remove it.
    compressionHandler = ctx.getPipeline().remove(nameOfCompressionHandler);
   }
  } else {
   // We want to compress the payload, let's make sure the compressor is there
   if(!pipelineContainsCompressor) {
    // Oops, it's not there, so lets put it in
    ctx.getPipeline().addAfter(ctx.getName(), nameOfCompressionHandler , compressionHandler);
   }
  }
 }

 ChannelHandlerContext可以看成handler和pipeline之间的adapter. 用来方便在handler处理过程中调用pipeline

对于ObjectEncoder是无状态的, 而ObjectDecoder是有状态的. 之所有有状态是因为解码的过程中需要的ChannelBuffer是不连续的, 可能需要多次解码才能得到最终完成的对象, 而在处理的过程中需要保存一些状态信息.

如果连接数小于1000, netty推荐采用传统的OIO(blocking)模式

ChannelLocal提供了一种类似ThreadLocal的机制在一个Channel中访问共享的内容.

分享到:
评论

相关推荐

    Netty4.0学习笔记系列之四:混合使用coder和handler

    在本篇Netty4.0学习笔记中,我们将聚焦于如何在实际应用中混合使用`coder`和`handler`,这是Netty框架中非常关键的一部分,对于构建高性能、低延迟的网络应用程序至关重要。Netty是一个用Java编写的异步事件驱动的...

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty4.0学习笔记系列之六:多种通讯协议支持

    在本篇Netty4.0学习笔记系列之六中,我们将深入探讨Netty框架如何支持多种通讯协议,以及它在实现高效、灵活的网络通信中的关键特性。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的...

    Netty4.0学习笔记系列之五:自定义通讯协议

    在本篇“Netty4.0学习笔记系列之五:自定义通讯协议”中,我们将深入探讨如何在Netty框架下构建和实现自己的通信协议。Netty是一个高性能、异步事件驱动的网络应用框架,广泛应用于Java领域的服务器开发,如网络游戏...

    Netty4.0学习笔记系列之二:Handler的执行顺序

    在本篇“Netty4.0学习笔记系列之二:Handler的执行顺序”中,我们将深入探讨Netty中的Handler处理链以及它们的执行流程。 首先,Netty 中的 ChannelHandler 是处理 I/O 事件或拦截 I/O 操作的核心组件。每个 ...

    Netty4.0学习笔记系列之三:构建简单的http服务

    Netty4.0学习笔记系列之三是关于构建简单的HTTP服务的教程,这主要涉及网络编程、服务器开发以及Java NIO(非阻塞I/O)的相关知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,它使得开发可伸缩且稳定的...

    Netty全面学习笔记(非常详细具体,排版很好)

    这篇全面的学习笔记主要围绕 Netty 的运行环境、架构、网络模型(Reactor 模式)以及处理模型(Pipeline 模式)进行详细讲解。 1. **运行环境** 在学习 Netty 时,使用的版本是 Netty-3.2.5.Final,兼容 JDK 1.6。...

    Netty4.0学习笔记系列之一:Server与Client的通讯

    在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...

    netty学习笔记

    ### Netty学习笔记知识点概述 #### 一、Netty简介 Netty是一个广泛使用的高性能、异步事件驱动的网络应用程序框架,它简化了网络编程的复杂性,使得开发者能够更轻松地开发高性能、高可靠性的网络服务器和客户端。...

    Netty全套学习资源(包括源码、笔记、学习文档等)

    二、Netty 学习笔记 学习笔记通常包含了作者在学习过程中的总结和实践经验,对于初学者来说极具参考价值。笔记可能涵盖 Netty 的安装配置、基本使用、线程模型、缓冲区操作、编解码器的实现以及异常处理等方面,帮助...

    Netty学习笔记_Springboot实现自定义协议.docx

    Netty学习笔记_Springboot实现自定义协议 本文主要介绍了使用Netty框架在Springboot项目中实现自定义协议的方法。自定义协议是指在网络通信中,使用特定的数据格式来传输数据,以满足特定的业务需求。在本文中,...

    netty官网学习手册中文版

    这个“netty官网学习手册中文版”针对的是Netty的3.1版本,虽然现在的Netty已经发展到了5.x版本,但3.1版本的知识仍然具有历史参考价值,特别是对于那些初次接触或需要理解Netty基础概念的开发者来说。 1. **Netty...

    Netty源码阅读笔记

    本篇阅读笔记主要围绕Netty的核心组件和原理进行详细分析。 首先,ChannelBuffer是Netty中用于网络数据交换的字节容器。在Netty中,所有的网络数据都是通过ChannelBuffer进行读写的。它的作用类似于Java NIO中的...

    Netty应用说明笔记

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,主要用Java语言编写,用于简化高效网络服务的构建。Netty 提供了丰富的组件和设计模式,如责任链模式的编码和解码功能,用于处理各种信息格式,如Protocol ...

    自己学习netty的笔记和Demo

    在Netty网络框架学习笔记-1中,可能详细介绍了NIO的基本概念,如选择器(Selector)、通道(Channel)和缓冲区(Buffer),以及它们如何协同工作以提高并发处理能力。 2. **Netty入门**:笔记-3和-5探讨了Netty的入门知识...

    netty框架技术学习笔记

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Web开发中,Netty常被用来构建高效的服务端通信系统,尤其在处理大量并发连接时,其优势更为明显。 在文档...

    Netty实践学习案例

    在深入探讨 Netty 的实践学习案例之前,我们先了解一下 Netty 的核心特性: 1. **异步非阻塞 I/O**:Netty 基于 Java NIO(非阻塞I/O)构建,允许它处理大量并发连接,减少了线程创建和上下文切换的开销。 2. **零...

    基于Netty网络编程项目实战笔记.7z

    《基于Netty网络编程项目...通过阅读这份笔记,开发者不仅可以深入理解Netty的内部工作原理,还能学习到如何在项目中有效运用Netty,提升网络编程的效率和质量。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    读书笔记:Netty权威指南 笔记Note of The Definitive Guide.zip

    读书笔记:Netty权威指南 笔记Note of The Definitive Guide

Global site tag (gtag.js) - Google Analytics