1、Netty的重要Handle類(lèi)
- SimpleChannelInboundHandler 是一個(gè)輸入流
- ChannelOutboundHandlerAdapter是一個(gè)輸出流
- Netty提供了很多組件進(jìn)行解碼器和加碼器攻人,對(duì)二進(jìn)制的內(nèi)容進(jìn)行解析轉(zhuǎn)換成真實(shí)的內(nèi)容
- ChannelHandlerContext,獲取上下文的內(nèi)容信息:如遠(yuǎn)程的地址
protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
//獲取地址
System.out.println(ctx.channel().remoteAddress());
}
2艘狭、 GlobalEventExcecutor類(lèi)
- GlobalEventExcecutor類(lèi)是一個(gè)單線(xiàn)程的類(lèi)
-
GlobalEventExecutor是具備任務(wù)隊(duì)列的單線(xiàn)程事件執(zhí)行器,其適合用來(lái)實(shí)行時(shí)間短,碎片化的任務(wù)
public final class GlobalEventExecutor extends AbstractScheduledEventExecutor {
//單例對(duì)象
public static final GlobalEventExecutor INSTANCE = new GlobalEventExecutor();
//維護(hù)的任務(wù)隊(duì)列
final BlockingQueue<Runnable> taskQueue = new LinkedBlockingQueue<Runnable>();
ScheduledFutureTask.deadlineNanos(SCHEDULE_QUIET_PERIOD_INTERVAL), -SCHEDULE_QUIET_PERIOD_INTERVAL);
//線(xiàn)程工廠
final ThreadFactory threadFactory =
new DefaultThreadFactory(DefaultThreadFactory.toPoolName(getClass()), false, Thread.NORM_PRIORITY, null);
//一個(gè)循環(huán)運(yùn)行的執(zhí)行器
private final TaskRunner taskRunner = new TaskRunner();
//標(biāo)記當(dāng)前線(xiàn)程是否啟動(dòng)
private final AtomicBoolean started = new AtomicBoolean();
//運(yùn)行中的線(xiàn)程
volatile Thread thread;
@Override
public boolean inEventLoop(Thread thread) {
return thread == this.thread;
}
}
-
inEventLoop方法
判斷當(dāng)前執(zhí)行代碼是否在同一個(gè)線(xiàn)程,有兩種情況
第一次沒(méi)有異步線(xiàn)程,則創(chuàng)建新線(xiàn)程
若在非當(dāng)前運(yùn)行線(xiàn)程中添加任務(wù),判斷異步線(xiàn)程是否在執(zhí)行,如果沒(méi)有則創(chuàng)建新的線(xiàn)程(原線(xiàn)程已經(jīng)執(zhí)行完畢)
3召川、DefaultPromise的實(shí)現(xiàn)
- 本質(zhì)是使用EventExecutor的execute方法,將通知方法放到異步線(xiàn)程隊(duì)列中,所以其回調(diào)也是在EventExecutor的線(xiàn)程中執(zhí)行
4胸遇、如何檢測(cè)分布式節(jié)點(diǎn)與節(jié)點(diǎn)的存活狀態(tài)
- 節(jié)點(diǎn)與節(jié)點(diǎn)的存活(分布式)其實(shí)是用心跳檢測(cè)機(jī)制通知對(duì)方(A -> B -> C)如:C調(diào)用B荧呐,如果當(dāng)C嘗試調(diào)用了三次以上或更多次以上,就認(rèn)為對(duì)方都沒(méi)有響應(yīng)(超時(shí)或斷開(kāi)連接等事件)纸镊,從而失去連接就從集群里面移除掉(重點(diǎn))
5倍阐、什么是解碼和加碼
- 解碼Decoder:解碼是將字符數(shù)組轉(zhuǎn)換成字符串
- 加碼Encoder:加碼是將字符串轉(zhuǎn)換成字符數(shù)組