久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

Netty 網絡編程的秘籍,看這一篇夠了 速遞
來源:Java技術指北    時間:2023-06-02 08:46:17
Netty

version: 4.1.55.Final


【資料圖】

傳統的IO模型的web容器,比如老版本的Tomcat,為了增加系統的吞吐量,需要不斷增加系統核心線程數量,或者通過水平擴展服務器數量,來增加系統處理請求的能力。 有了NIO之后,一個線程即可處理多個連接事件,基于多路復用模型的Netty框架,不僅降低了使用NIO的復雜度,

優點

Netty是一款以java NIO為基礎,基于事件驅動模型支持異步、高并發的網絡應用框架

API使用簡單,開發門檻低,簡化了NIO開發網絡程序的復雜度功能強大,預置多種編解碼功能,支持多種主流協議,比如Http、WebSocket。定制能力強,可以通過ChannelHandler對通信框架靈活擴展。性能高,支持異步非阻塞通信模型成熟穩定,社區活躍,已經修復了Java NIO所有的Bug。經歷了大規模商業應用的考驗,質量有保證。IO模型

select、poll和epoll

操作系統內核基于這些函數實現非阻塞IO,以此實現多路復用模型

select

select

select 調用需要傳入 fd 數組,需要拷貝一份到內核,高并發場景下這樣的拷貝消耗的資源是驚人的。(可優化為不復制)select 在內核層仍然是通過遍歷的方式檢查文件描述符的就緒狀態,是個同步過程,只不過無系統調用切換上下文的開銷。(內核層可優化為異步事件通知)select 僅僅返回可讀文件描述符的個數,具體哪個可讀還是要用戶自己遍歷。(可優化為只返回給用戶就緒的文件描述符,無需用戶做無效的遍歷)pool

和 select 的主要區別就是,去掉了 select 只能監聽 1024 個文件描述符的限制

epool

epool

內核中保存一份文件描述符集合,無需用戶每次都重新傳入,只需告訴內核修改的部分即可。內核不再通過輪詢的方式找到就緒的文件描述符,而是通過異步 IO 事件喚醒。內核僅會將有 IO 事件的文件描述符返回給用戶,用戶也無需遍歷整個文件描述符集合。Reactor模型一、單Reactor單線程

1)可以實現通過一個阻塞對象監聽多個鏈接請求

2)Reactor對象通過select監聽客戶端請求事件,通過dispatch進行分發

3)如果是建立鏈接請求,則由Acceptor通過accept處理鏈接請求,然后創建一個Handler對象處理完成鏈接后的各種事件

4)如果不是鏈接請求,則由Reactor分發調用鏈接對應的Handler來處理

5)Handler會完成Read->業務處理->send的完整業務流程

二、單Reactor多線程

1)Reactor對象通過select監聽客戶端請求事件,收到事件后,通過dispatch分發

2)如果是建立鏈接請求,則由Acceptor通過accept處理鏈接請求,然后創建一個Handler對象處理完成鏈接后的各種事件

3)如果不是鏈接請求,則由Reactor分發調用鏈接對應的Handler來處理

4)Handler只負責事件響應不做具體業務處理

5)通過read讀取數據后,分發到worker線程池處理,處理完成后返回給Handler,Handler收到后,通過send將結果返回給client

三、主從Reactor多線程

1)Reactor主線程MainReactor對象通過select監聽鏈接事件,通過Acceptor處理

2)當Acceptor處理鏈接事件后,MainReactor將鏈接分配給SubReactor

3)SubReactor將鏈接加入到隊列進行監聽,并創建Handler進行事件處理

4)當有新事件發生時,SubReactor就會調用對應的Handler處理

5)Handler通過read讀取數據,分發到worker線程池處理,處理完成后返回給Handler,Handler收到后,通過send將結果返回給client

6)Reactor主線程可以對應多個Reactor子線程

三種模式用生活案例來理解

1)單Reactor單線程,前臺接待員和服務員是同一個人,全程為顧客服務

2)單Reactor多線程,1個前臺接待員,多個服務員,接待員只負責接待

3)主從Reactor多線程,多個前臺接待員,多個服務員

Reactor模型具有如下優點

1)響應快,不必為單個同步事件所阻塞,雖然Reactor本身依然是同步的

2)可以最大程度的避免復雜的多線程及同步問題,并且避免了多線程/進程的切換開銷

3)擴展性好,可以方便的通過增加Reactor實例個數來充分利用CPU資源

4)復用性好,Reactor模型本身與具體事件處理邏輯無關,具有很高的復用性

核心組件

1.Bootstrap 一個Netty應用通常由一個Bootstrap開始,它主要作用是配置整個Netty程序,串聯起各個組件。

Handler,為了支持各種協議和處理數據的方式,便誕生了Handler組件。Handler主要用來處理各種事件,這里的事件很廣泛,比如可以是連接、數據接收、異常、數據轉換等。

2.ChannelInboundHandler 一個最常用的Handler。這個Handler的作用就是處理接收到數據時的事件,也就是說,我們的業務邏輯一般就是寫在這個Handler里面的,ChannelInboundHandler就是用來處理我們的核心業務邏輯。

3.ChannelInitializer 當一個鏈接建立時,我們需要知道怎么來接收或者發送數據,當然,我們有各種各樣的Handler實現來處理它,那么ChannelInitializer便是用來配置這些Handler,它會提供一個ChannelPipeline,并把Handler加入到ChannelPipeline。

4.ChannelPipeline 一個Netty應用基于ChannelPipeline機制,這種機制需要依賴于EventLoop和EventLoopGroup,因為它們三個都和事件或者事件處理相關。

EventLoops的目的是為Channel處理IO操作,一個EventLoop可以為多個Channel服務。

EventLoopGroup會包含多個EventLoop。

5.Channel 代表了一個Socket鏈接,或者其它和IO操作相關的組件,它和EventLoop一起用來參與IO處理。

6.Future 在Netty中所有的IO操作都是異步的,因此,你不能立刻得知消息是否被正確處理,但是我們可以過一會等它執行完成或者直接注冊一個監聽,具體的實現就是通過Future和ChannelFutures,他們可以注冊一個監聽,當操作執行成功或失敗時監聽會自動觸發。

示例

通過一個簡單的示例,首先了解怎么基于netty開發一個通信程序,包括服務的與客戶端:

Server:

@Slf4jpublic class Server { private EventLoopGroup boosGroup; private EventLoopGroup workGroup; public Server(int port){ try { init(port); log.info("----- 服務啟動成功 -----"); } catch (InterruptedException e) { log.error("啟動服務出錯:{}", e.getCause()); } } private void init(int port) throws InterruptedException { // 處理連接 this.boosGroup = new NioEventLoopGroup(); // 處理業務 this.workGroup = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); // 綁定 bootstrap.group(boosGroup, workGroup) .channel(NioServerSocketChannel.class) //配置服務端 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.TCP_NODELAY, true) .childOption(ChannelOption.SO_RCVBUF, 1024) .childOption(ChannelOption.SO_SNDBUF, 1024) .childHandler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new ServerHandler()); } }); ChannelFuture channelFuture = bootstrap.bind(port).sync(); channelFuture.channel().closeFuture().sync(); } public void close(){ this.boosGroup.shutdownGracefully(); this.workGroup.shutdownGracefully(); }}@Slf4jclass ServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info(">>>>>>> server active"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //1. 讀取客戶端的數據(緩存中去取并打印到控制臺) ByteBuf buf = (ByteBuf) msg; byte[] request = new byte[buf.readableBytes()]; buf.readBytes(request); String requestBody = new String(request, "utf-8"); log.info(">>>>>>>>> receive message: {}", requestBody); //2. 返回響應數據 ctx.writeAndFlush(Unpooled.copiedBuffer((requestBody+" too").getBytes())); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { super.exceptionCaught(ctx, cause); }}

Client:

@Slf4jpublic class Client { private EventLoopGroup workGroup; private ChannelFuture channelFuture; public Client(int port){ init(port); } private void init(int port){ this.workGroup = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); bootstrap.group(workGroup) .channel(NioSocketChannel.class) .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) .option(ChannelOption.SO_RCVBUF, 1024) .option(ChannelOption.SO_SNDBUF, 1024) .handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new ClientHandler()); } }); this.channelFuture = bootstrap.connect("127.0.0.1", port).syncUninterruptibly(); } /** * * @param message */ public void send(String message){ this.channelFuture.channel().writeAndFlush(Unpooled.copiedBuffer(message.getBytes())); } /** * */ public void close(){ try { channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { throw new RuntimeException(e); } workGroup.shutdownGracefully(); }}@Slf4jclass ClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info(">>>>>>> client active"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { try { ByteBuf buf = (ByteBuf) msg; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req, "utf-8"); log.info(">>>>>>>>> receive message: {}", body); } finally { ReferenceCountUtil.release(msg); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { super.exceptionCaught(ctx, cause); }}

測試:

public class StarterTests { static int port = 9011; @Test public void startServer(){ Server server = new Server(9011); } @Test public void startClient(){ Client client = new Client(port); client.send("Hello Netty!"); while (true){} }}生態DubboSpring Reactive類似技術

Mina、Netty、Grizzly

其他

Proactor非阻塞異步網絡模型

參考

https://mp.weixin.qq.com/s?__biz=MzUxNDA1NDI3OA==&mid=2247492766&idx=2&sn=b5df49147561e467fa5677b5bb09dacb&chksm=f9496577ce3eec61383994499d96a7f2b091b5eb8ee1ac47ad021f78072ae710f41d38257406&scene=27

https://blog.csdn.net/a745233700/article/details/122660246

關鍵詞:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
午夜精品一区二区三区在线播放| 国产精品永久免费在线| …久久精品99久久香蕉国产| 在线成人av.com| 国产欧美日韩高清| 国产精品99久久久久久www| 欧美精品日韩精品| 99riav国产精品| 亚洲欧美日韩天堂一区二区| 麻豆国产va免费精品高清在线| 国产精品99久久久久久久vr| 国产精品视频免费在线观看| 夜夜嗨av一区二区三区网站四季av| 欧美插天视频在线播放| 亚洲永久精品大片| 欧美在线一级视频| 国产中文一区| 日韩午夜在线观看视频| 亚洲欧美国产一区二区三区| 亚洲精品资源美女情侣酒店| 欧美成人精品不卡视频在线观看| 性久久久久久久久| 一区二区电影免费在线观看| 日韩午夜激情av| 亚洲午夜免费福利视频| 亚洲精品网址在线观看| 亚洲狠狠丁香婷婷综合久久久| 日韩视频在线免费| 香港久久久电影| 欧美色偷偷大香| 久久亚洲一区二区| 国产精品99久久久久久人| 一区二区三区欧美视频| 久久精品国产免费| 亚洲第一免费播放区| 在线播放视频一区| 欧美与黑人午夜性猛交久久久| 国产精品视频一区二区高潮| 欧美顶级艳妇交换群宴| 激情综合色综合久久综合| 国产亚洲视频在线| 在线亚洲一区二区| 99国产精品久久久| 亚洲欧美美女| 91久久精品网| 国产精品色在线| 亚洲人成艺术| 亚洲午夜日本在线观看| 亚洲高清三级视频| 午夜精品久久久久久久白皮肤| 欧美精品自拍偷拍动漫精品| 西瓜成人精品人成网站| 亚洲人成在线播放| 久久久www成人免费无遮挡大片| 国产在线播精品第三| 欧美粗暴jizz性欧美20| 在线看片日韩| 亚洲精品国产精品乱码不99按摩| 亚洲免费观看高清完整版在线观看熊| 久久国产精品亚洲77777| 欧美在线视频在线播放完整版免费观看| 久久99伊人| 欧美大香线蕉线伊人久久国产精品| 99综合电影在线视频| 亚洲欧美激情视频在线观看一区二区三区| 国产亚洲制服色| 1000部精品久久久久久久久| 欧美一区二区日韩| 欧美日韩色一区| 欧美系列亚洲系列| 亚洲靠逼com| 国产日韩欧美成人| 欧美在线视频一区| 亚洲高清毛片| 亚洲精品美女在线观看| 日韩亚洲一区在线播放| 国产精品啊啊啊| 欧美一区在线视频| 亚洲国产欧美久久| 亚洲亚洲精品三区日韩精品在线视频| 午夜视频一区| 国产精品美女久久久浪潮软件| 久久久久看片| 亚洲午夜伦理| 国产一区二区三区久久| 亚洲国产精品一区二区尤物区| 小辣椒精品导航| 久久一区欧美| 亚洲国产综合在线| 欧美激情一区二区三区在线视频观看| 国产一区二区高清| 亚洲裸体俱乐部裸体舞表演av| 欧美影院视频| 国产精品视频999| 欧美精品一区二区三区四区| 日韩视频一区二区三区在线播放| 亚洲午夜在线观看| 欧美激情影音先锋| 伊人成综合网伊人222| 亚洲精品一区二区三区四区高清| 国产日韩一区| 久久爱另类一区二区小说| 欧美久久久久中文字幕| 国产亚洲欧美中文| 欧美日本高清一区| 欧美日韩国产一区二区三区| 国产一区二区三区精品久久久| 国产一区二区三区黄视频| 久久久久久久网| 午夜精品在线看| 午夜精彩国产免费不卡不顿大片| 亚洲欧美综合另类中字| 亚洲国产欧洲综合997久久| 亚洲精品一二三| 国产日韩亚洲欧美综合| 在线观看av一区| 欧美在线视频免费播放| 91久久精品美女| 美日韩精品免费观看视频| 久久精品日韩欧美| 国产精品嫩草99av在线| 欧美永久精品| 免费看精品久久片| 日韩视频一区二区| 亚洲在线电影| 亚洲女与黑人做爰| 欧美国产精品一区| 欧美午夜精品久久久久久孕妇| 亚洲精品美女久久久久| 久久精品一二三| 久久手机免费观看| 鲁大师成人一区二区三区| 精品盗摄一区二区三区| 亚洲国产一区二区三区在线播| 亚洲一区二区三区免费在线观看| 欧美国产一区视频在线观看| 亚洲高清在线观看一区| 国产精品一二一区| 免费国产一区二区| 伊人久久亚洲热| 午夜视频在线观看一区二区| 欧美日韩亚洲一区二区三区| 蜜臀久久99精品久久久久久9| 欧美91大片| 亚洲精品午夜精品| 久久综合色播五月| 亚洲成人直播| 国产精品欧美久久久久无广告| 在线亚洲伦理| 国产欧美精品日韩区二区麻豆天美| 永久久久久久| 亚洲精品综合久久中文字幕| 国产亚洲激情| 欧美插天视频在线播放| 久久综合精品一区| 国产精品国产三级国产普通话蜜臀| 在线视频一区观看| 欧美专区在线播放| 久久久久女教师免费一区| 欧美久久久久久久久久| 亚洲电影网站| 欧美激情影院| 欧美乱人伦中文字幕在线| 国产精品乱码| 美女脱光内衣内裤视频久久网站| 久久国产天堂福利天堂| 亚洲欧洲精品一区二区精品久久久| 欧美激情一区二区三区高清视频| 久久男人资源视频| 亚洲字幕一区二区| 亚洲福利在线看| 国产精品日本欧美一区二区三区| 黄色资源网久久资源365| 尤物九九久久国产精品的分类| 久久av一区二区三区亚洲| 欧美日韩高清区| 国产精品久久中文| 噜噜爱69成人精品| 欧美日韩在线亚洲一区蜜芽| 欧美日韩亚洲天堂| 亚洲人成精品久久久久| 亚洲日本免费电影| 1024欧美极品| 欧美成人国产一区二区| 亚洲精品一区二区三区99| 欧美不卡视频| 久久久av毛片精品| 亚洲性视频网站| 日韩一级视频免费观看在线| 欧美极品在线观看| 欧美午夜精品久久久久久孕妇| 国产精品成av人在线视午夜片| 国产精品视频在线观看| 亚洲国产欧美一区二区三区久久| 亚洲区中文字幕| 久久精品五月| 免费亚洲电影在线| 久久精品视频免费播放| 欧美日韩一区二区三区四区在线观看| 亚洲人线精品午夜|