作者:zhaoxiao2012_549 | 来源:互联网 | 2023-08-18 19:20
一、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);
}
}
三、加权加权让性能好的机器在集群中选择的机率较为大,配置低的机器选择较低或概率小四、SingleThreadEventLoopSingleThreadEventLoop针对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更多请看截图![](https://img6.php1.cn/3cdc5/9c7e/8fd/3ce7ad8ced4e2ab8.png)
AbstractChanne
![](https://img6.php1.cn/3cdc5/9c7e/8fd/224b5e9a32cb5b7e.png)
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);
}
}