首页 > 编程知识 正文

netty 集群(channelgroup怎么保存)

时间:2023-05-03 17:24:10 阅读:91161 作者:3416

一、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更多请看截图

AbstractChanne

AbstractUnsafe

五、 UnsafeUnsafe 提供内部类使用,提供不安全的操作,在Channel接口定义

六、MultithreadEventLoopGroup类

MultithreadEventLoopGroup有注册入口处理,register代码如下: @Override public EventLoop next() { return (EventLoop) super.next(); } @Override public ChannelFuture register(Channel channel) { //此时这个next方法是上面的 public EventLoop next() return next().register(channel); }

6.1 register的实现类.

return next().register(channel);的实现类.方法点击进去几个类进行实现registerf方法EmbeddedEventLoop、MultithreadEventLoopGroup、SingleThreadEventLoop、ThreadPerChannelEventLoopGroup、如图所示:、

6.2 ThreadPerChannelEventLoopGroup代码分析.

咱们以典型的ThreadPerChannelEventLoopGroup进行跟踪一下代码 @Override public ChannelFuture register(Channel channel) { //判断管道对象是否为空,是空就返回空指针操作 if (channel == null) { throw new NullPointerException("channel"); } try { EventLoop l = nextChild(); //事件循环 //返回一个事件循环注册的默认复合管道处理 return l.register(new DefaultChannelPromise(channel, l)); } catch (Throwable t) { return new FailedChannelFuture(channel, GlobalEventExecutor.INSTANCE, t); } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。