Netty_tips

(1) start

   final NettyServer server = new NettyServer();

        server.start(8080);

(2) channel

通常每种类型的channel一般都有一个对应channelfactory类,以及一个channelconifg类。  通过channelfactory创建channel实例,

然后由channelconifg来配置channel属性。

ChannelGroup:  一组通道的集合,线程安全, 关闭的通道会自动从集合中删除, 可以通过ChannelGroup广播消息。

LocalChannel、 LocalServerChannel:本地通道、虚拟一个网络。

DatagramChanneel: udp连接通道.

ServerSocketChannel、SoketChannel:  处理tcp/ip连接的通道。

Channelevent:  用于将:channel的相关信息 如channel本身,传递的数据,channel的状态, future等等一起打包,在调用org.jboss.netty.channel.Channels类的各个静态的fire方式中产生,然后在channelpipe中的sendUpsteam或sendDownStream中传递。

ChannelSink:处理pipeline中downstream结束后的事件。

(3) handler

所有需要调用的handler都被包装成ChannelHandlerContext,注册到channelpipeline的一个map中,  通过两个指针:head和tail保证map中的handle的调用顺序。处理upstream时,通过head指针从前往后依次调用实现ChannelUpstreamHandler接口的handle.   downstream处理通过tail指针,从后往前依次调用实现ChannelDownstreamHandler接口的handle。  在downsream的channelpipeline传送完后,ChannelSink的eventSunk方法完成对系统底层的调用处理。(ChannelSink和channel是通过attach的方式绑定到channelpipeline上)

codec handle。包括  64位机器的编码、解码,   字符集转化,压缩,http请求编码、解码; 序列化对象的编码、解码等等。通过codec handle我们可以直接往channel中写java 对象。

Timeout handler通过jboss.netty.util.Timer来对读写超时或者闲置链接的通知,在handle中创建一个time对象,这个time对象包含一个定时器线程Work进程,在handle第一次被触发时,启动一个Work线程:监控超时事件。

Stream handler  用于异步处理大数据传递。通过将java.io.file对象包装成ChunkedFile对象,进行传递,ChunkedFile的底层实现是RandomAccessFile.

Queue handler: 用户将接受到的数据或需要发送的数据先存储到一个queue队列中,然后一次性的读和写。  包括BlockingReadHandler和BufferedWriteHandler. 注意在BlockingReadHandler将receivemessage存储入queue后,其后的handler将不再处理 messageReceived,exceptionCaught 和channelClosed事件,因此BlockingReadHandler必须放在channelpipeline的最后。  同理BufferedWriteHandler。

(4) 服务器的启动和客服端connect的过程

服务器启动: bootstrap.bind(…)-> 触发ServerSocketChannel.open()的事件(sendupstream)->捕捉open事件,channel.bind-> Channels.bind(…)  发起bind命令(sendDownstream)-> PipelineSink进行处理-> 使用socket进行bind,启动boss进程。

 Boostrap.bind 方法包含两个参数NioServerSocketChannelFactory、ChannelPipelineFactory。NioServerSocketChannelFactory包含连个线程池bossExecutor和workerExecutor,workerExecutor: 包含缺省为处理器个数×2个NioWorker进程。

 服务器处理连接:Boss启动后,在监听accept事件, 将捕获到的事件作为一个task放到一个niowork进程的registerTaskQueue队列中。

服务器端接收并处理数据:NioWorker.run()->nioworker. processSelectedKeys()->Nioworker. Read()将从SocketChannel读取的数据封装成ChannelBuffer ->调用fireMessageReceived(channel,buffer)产生upstream事件 –> 由注册到Pipeline中的Hanlder进行处理

客户端connection:同服务器启动一样也需要创建一个NioClientSocketChannelFactory和一个ChannelPipelineFactory。  同服务器端不同的是client端的boss进程不要监听,它将本地发出的建立的链接的请求封装成task放入一个registerTaskQueue,boss负责消费Queue队列中的消息。

(5) process

NettyServer : 

pipeline.addLast(logicGroup, "handler", new NettyServerHandler());

NettyServerHandler:

ctx.writeAndFlush(RPCServerHandler.handleRequest(msg));

RPCServerHandler:

 private static final ServerProcessor<?, ?>[] processors;

processors = new ServerProcessor[maxMessageID + 1];

RPCServerHandler.processors[rpcMaping.value().number] = (ServerProcessor<?, ?>) classz

                          .newInstance();

ServerProcessor:

public interface ServerProcessor<REQextends Message<REQ>, RESPextends Message<RESP>>

EchoProcessor:

public class EchoProcessorimplements ServerProcessor<EchoRequest, EchoResponse> 

(6)

Boss线程:由这个线程池提供的线程是boss种类的,用于创建、连接、绑定socket,然后把这些socket传 给worker线程池。

在服务器端每个监听的socket都 有一个boss线 程来处理。在客户端,只有一个boss线程来处理所有的socket。

Worker线程 :Worker线 程执行所有的异步I/O。 他们不是通用的线程,开发人员需要注意不要把与其不同的任务赋给线程,这可能导致线程被阻塞、无法处理他们真正关心的任务,反过来会导致死锁和一些莫名其妙的性能问题。

(7)  发送东西到一个监听状态的服务器

->创建一个Channel。

->将Channel连接到远程监听的socket。

->调用Channel的write(Object message)方法。

(8)

ChannelPipeline是一组拦截器ChannelHandler组成的。这些拦截器能够处理和转换传给他们的值。

当一个拦截器处理完成后,处理后的值会被传给下一个拦截器。

Pipeline会严格保证ChannelHandler实例的顺序。通常,第一个ChannelHandler会 接收一个原始的ChannelBuffer,

而最后一个ChannelHandler(被称作Sink)会任何转给它的东西输出。

ChannelHandler只是一个标识性接口,没有任何方法,因此处理器的实现很灵活,

但是任何一个处理器都需要相应或者转发ChannelEvent

(9)

Channel

ChannelFactory

ChannelPipe

ChannelHandler

ChannelFuture

Executors

EventLoopGroup

Boss Thread

Worker Thread



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值