一、DefaultEventExecutorChooseFactory
defaulteventexecutorchoosefactory选择器工厂defaulteventexecutorchoosefactory这一事件执行选择器工厂正在建设Netty,io.net ty.util 然后注释UnstableApi标志UnstableApi注释类是: (别忘了基于internal的工具类不用积分) 1、用户指南:在. internal .包中从哪里可以看出
二、算法
round-robin思想编程在负载均衡场景中使用(轮询算法) Netty使用第二指数算法进行事件选择(isPowerOfTwo ),使用第二指数算法从事件仓库接口跟踪的事件仓库ispoweroftwo键码//事件执行选择器公共执行机构(事件执行机构[ ]执行机构)。
//基于//isPowerOfTwo指数算法的事件选择
if (ispoweroftwo (执行部件长度) )
returnnewpoweroftwoeventexecutorchooser (执行机构;
} else {
企业资源技术委员会(执行机构;
}
}
使用isPowerOfTwo
privatestaticbooleanispoweroftwo {
返回(值-值)==值;
}
//PowerOfTwo事件执行选择器
privatestaticfinalclasspoweroftwoeventexecutorchooserimplementseventexecutorchooser {
//原子性的Integer类型类
privatefinalatomicintegeridx=newatomicinteger (;
私有事件执行程序[ ]执行程序; //事件执行机构
//PowerOfTwo事件执行选择器构建方法
poweroftwoeventexecutorchooser (事件执行程序[ ]执行程序)。
this .执行机构=执行机构;
}
@Override//下一个事件执行机构
公共事件执行程序下一个(
返回执行程序[ idx.getandincrement (]执行程序.长度- 1;
}
}
efaulteventexecutorchooserfactory (循环机器人)/**
* * defaultimplementationwhichusessimpleround-robintochoosenext { @ linkeventexecutor }。
* * *默认情况下,使用round-robin算法选择以下实例的事件执行程序实现
* round-robin (主要用于负载均衡的方向。 例如,有5台机器,依次调用第一台机器,第二台机器,第三台机器,以处理负载。 这里的Executor数组也将被使用
*/
publicfinalclassdefaulteventexecutorchooserfactoryimplementseventexecutorchooserfactory {
公共执行机构(事件执行机构[ ]执行机构)。
if (ispoweroftwo (执行部件长度) )
returnnewpoweroftwoeventexecutorchooser (执行机构;
} else {
returnnewgenericeventexecutorchooser
(executors); } }三、加权
加权让性能好的机器在集群中选择的机率较为大,配置低的机器选择较低或概率小四、SingleThreadEventLoop
SingleThreadEventLoop针对EventLoop的抽象的父类会将所有被提交的任务当个线程去执行,它是一个单线程的事件循环对象 @Override //管道注册 public ChannelFuture register(Channel channel) { //返回一个注册(register)的复合管道 return register(new DefaultChannelPromise(channel, this)); } @Override//复合管道注册 public ChannelFuture register(final ChannelPromise promise) { ObjectUtil.checkNotNull(promise, "promise"); promise.channel().unsafe().register(this, promise); return promise; } promise.channel().unsafe().register(this, promise);的Channel接口的Unsafe的接口的方法,可以看出AbstractChannel类的内部类的AbstractUnsafe的register注册方法,而且AbstractUnsafe是一个抽象类.AbstractChanne类重要的方法,如:doBind,doDisconnect,doDeregister、connect、AbstractChanne的AbstractUnsafe内部类l许多比较重要的方法,如:register0、register、deregister、safeSetSuccess、safeSetFailure、recvBufAllocHandle、invokeLater更多请看截图五、 UnsafeUnsafe 提供内部类使用,提供不安全的操作,在Channel接口定义