日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot使用Netty實現遠程調用的示例

瀏覽:158日期:2023-04-14 11:13:18

前言

眾所周知我們在進行網絡連接的時候,建立套接字連接是一個非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個客戶端連接,是一種非常消耗線程的行為。那么我們該通過什么技術去解決上述的問題呢,那么就不得不提一個網絡連接的利器——Netty.

正文 Netty

Netty是一個NIO客戶端服務器框架:

它可快速輕松地開發網絡應用程序,例如協議服務器和客戶端。 它極大地簡化和簡化了網絡編程,例如TCP和UDP套接字服務器。

NIO是一種非阻塞IO ,它具有以下的特點

單線程可以連接多個客戶端。 選擇器可以實現但線程管理多個Channel,新建的通道都要向選擇器注冊。 一個SelectionKey鍵表示了一個特定的通道對象和一個特定的選擇器對象之間的注冊關系。 selector進行select()操作可能會產生阻塞,但是可以設置阻塞時間,并且可以用wakeup()喚醒selector,所以NIO是非阻塞IO。

Netty模型selector模式

它相對普通NIO的在性能上有了提升,采用了:

NIO采用多線程的方式可以同時使用多個selector 通過綁定多個端口的方式,使得一個selector可以同時注冊多個ServerSocketServer 單個線程下只能有一個selector,用來實現Channel的匹配及復用

SpringBoot使用Netty實現遠程調用的示例

半包問題

TCP/IP在發送消息的時候,可能會拆包,這就導致接收端無法知道什么時候收到的數據是一個完整的數據。在傳統的BIO中在讀取不到數據時會發生阻塞,但是NIO不會。為了解決NIO的半包問題,Netty在Selector模型的基礎上,提出了reactor模式,從而解決客戶端請求在服務端不完整的問題。

netty模型reactor模式

在selector的基礎上解決了半包問題。

SpringBoot使用Netty實現遠程調用的示例

上圖,簡單地可以描述為'boss接活,讓work干':manReactor用來接收請求(會與客戶端進行握手驗證),而subReactor用來處理請求(不與客戶端直接連接)。

SpringBoot使用Netty實現遠程調用

maven依賴

<!--lombok--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional></dependency><!--netty--><dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.17.Final</version></dependency>

服務端部分

NettyServer.java:服務啟動監聽器

@Slf4jpublic class NettyServer { public void start() { InetSocketAddress socketAddress = new InetSocketAddress('127.0.0.1', 8082); //new 一個主線程組 EventLoopGroup bossGroup = new NioEventLoopGroup(1); //new 一個工作線程組 EventLoopGroup workGroup = new NioEventLoopGroup(200); ServerBootstrap bootstrap = new ServerBootstrap().group(bossGroup, workGroup).channel(NioServerSocketChannel.class).childHandler(new ServerChannelInitializer()).localAddress(socketAddress)//設置隊列大小.option(ChannelOption.SO_BACKLOG, 1024)// 兩小時內沒有數據的通信時,TCP會自動發送一個活動探測數據報文.childOption(ChannelOption.SO_KEEPALIVE, true); //綁定端口,開始接收進來的連接 try { ChannelFuture future = bootstrap.bind(socketAddress).sync(); log.info('服務器啟動開始監聽端口: {}', socketAddress.getPort()); future.channel().closeFuture().sync(); } catch (InterruptedException e) { log.error('服務器開啟失敗', e); } finally { //關閉主線程組 bossGroup.shutdownGracefully(); //關閉工作線程組 workGroup.shutdownGracefully(); } }}

ServerChannelInitializer.java:netty服務初始化器

/*** netty服務初始化器**/public class ServerChannelInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { //添加編解碼 socketChannel.pipeline().addLast('decoder', new StringDecoder(CharsetUtil.UTF_8)); socketChannel.pipeline().addLast('encoder', new StringEncoder(CharsetUtil.UTF_8)); socketChannel.pipeline().addLast(new NettyServerHandler()); }}

NettyServerHandler.java:netty服務端處理器

/*** netty服務端處理器**/@Slf4jpublic class NettyServerHandler extends ChannelInboundHandlerAdapter { /** * 客戶端連接會觸發 */ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info('Channel active......'); } /** * 客戶端發消息會觸發 */ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.info('服務器收到消息: {}', msg.toString()); ctx.write('你也好哦'); ctx.flush(); } /** * 發生異常觸發 */ @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}

RpcServerApp.java:SpringBoot啟動類

/*** 啟動類**/@Slf4j@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})public class RpcServerApp extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(RpcServerApp.class); } /** * 項目的啟動方法 * * @param args */ public static void main(String[] args) { SpringApplication.run(RpcServerApp.class, args); //開啟Netty服務 NettyServer nettyServer =new NettyServer (); nettyServer.start(); log.info('======服務已經啟動========'); }}

客戶端部分

NettyClientUtil.java:NettyClient工具類

/*** Netty客戶端**/@Slf4jpublic class NettyClientUtil { public static ResponseResult helloNetty(String msg) { NettyClientHandler nettyClientHandler = new NettyClientHandler(); EventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap().group(group)//該參數的作用就是禁止使用Nagle算法,使用于小數據即時傳輸.option(ChannelOption.TCP_NODELAY, true).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast('decoder', new StringDecoder()); socketChannel.pipeline().addLast('encoder', new StringEncoder()); socketChannel.pipeline().addLast(nettyClientHandler); }}); try { ChannelFuture future = bootstrap.connect('127.0.0.1', 8082).sync(); log.info('客戶端發送成功....'); //發送消息 future.channel().writeAndFlush(msg); // 等待連接被關閉 future.channel().closeFuture().sync(); return nettyClientHandler.getResponseResult(); } catch (Exception e) { log.error('客戶端Netty失敗', e); throw new BusinessException(CouponTypeEnum.OPERATE_ERROR); } finally { //以一種優雅的方式進行線程退出 group.shutdownGracefully(); } }}

NettyClientHandler.java:客戶端處理器

/*** 客戶端處理器**/@Slf4j@Setter@Getterpublic class NettyClientHandler extends ChannelInboundHandlerAdapter { private ResponseResult responseResult; @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { log.info('客戶端Active .....'); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { log.info('客戶端收到消息: {}', msg.toString()); this.responseResult = ResponseResult.success(msg.toString(), CouponTypeEnum.OPERATE_SUCCESS.getCouponTypeDesc()); ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); }}

驗證

測試接口

@RestController@Slf4jpublic class UserController { @PostMapping('/helloNetty') @MethodLogPrint public ResponseResult helloNetty(@RequestParam String msg) { return NettyClientUtil.helloNetty(msg); }}

訪問測試接口

SpringBoot使用Netty實現遠程調用的示例

服務端打印信息

SpringBoot使用Netty實現遠程調用的示例

客戶端打印信息

SpringBoot使用Netty實現遠程調用的示例

源碼

項目源碼可從的我的github中獲取:github源碼地址

到此這篇關于SpringBoot使用Netty實現遠程調用的示例的文章就介紹到這了,更多相關SpringBoot Netty遠程調用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青草久久视频| 亚洲二区在线| 国产亚洲午夜| 欧美大黑bbbbbbbbb在线| 99久久婷婷| 精品一区二区男人吃奶| 国产极品嫩模在线观看91精品| 91成人在线精品视频| 91麻豆精品激情在线观看最新| 日韩精品一区二区三区中文在线| 日本在线观看不卡视频| 亚洲精品乱码日韩| 91欧美精品| 国产精品.xx视频.xxtv| 精品久久一区| 黄色在线网站噜噜噜| 日韩精品水蜜桃| 91九色精品| 美美哒免费高清在线观看视频一区二区 | 亚洲精品自拍| 91嫩草精品| 精品久久美女| 91精品国产91久久久久久黑人| 99热精品久久| 亚洲欧美日韩在线观看a三区| 在线观看一区| 国产日本久久| 福利精品在线| japanese国产精品| 亚洲综合婷婷| 麻豆久久久久久| 影视先锋久久| 亚洲tv在线| 在线观看免费一区二区| 男人的天堂久久精品| 91国内精品| 91亚洲国产高清| 一区视频在线| 久久精品女人| 国产精品美女久久久| 欧美午夜网站| 99久久婷婷| 国产欧美自拍一区| 欧美a级一区| 欧美亚洲三级| 色吊丝一区二区| 亚洲va久久久噜噜噜久久| 国产一区二区色噜噜| 国产精品av一区二区| 日韩精品视频网| 色偷偷偷在线视频播放| 国产亚洲一区在线| 国产精品2023| 国产日韩专区| 精品中文字幕一区二区三区| 黄色成人在线网址| 久久久久久久久成人| 亚洲中字黄色| 成人精品久久| 亚洲视频二区| 日韩在线精品| 欧美一区不卡| 最新日韩av| 麻豆精品在线观看| 久久都是精品| 日韩理论视频| 国产日韩亚洲| 91亚洲国产高清| 欧美在线精品一区| 99在线|亚洲一区二区| 国产一区二区三区黄网站| 中文字幕日韩高清在线 | 国产欧美日韩精品一区二区三区 | 在线看片日韩| 亚洲最新无码中文字幕久久| 日本久久二区| 午夜精品一区二区三区国产| 麻豆国产欧美一区二区三区| 免费日韩av片| 欧美黄页在线免费观看| 亚洲精品高潮| 欧美日韩在线播放视频| 欧美视频久久| 五月婷婷亚洲| 日韩久久视频| 美女久久久久久 | 国产伦精品一区二区三区视频 | 欧美亚洲国产精品久久| 欧美激情一区| 日韩毛片网站| 国产亚洲高清视频| 毛片在线网站| 久久国产欧美日韩精品| 久久福利毛片| 午夜在线视频一区二区区别| 精品国产亚洲一区二区三区在线| 青青国产91久久久久久| 欧美一级二级三级视频| 图片区亚洲欧美小说区| 国产亚洲毛片| 日韩免费av| 欧美亚洲二区| 国产偷自视频区视频一区二区| 国产亚洲精品美女久久久久久久久久| 好吊视频一区二区三区四区| 日韩欧美国产精品综合嫩v| 日韩精品91亚洲二区在线观看| 91久久久久| 欧美精品一线| 亚洲精品一二三区区别| 久久久久国产精品一区三寸| 久久久久久网| 亚洲欧美久久| 亚洲中字黄色| 久久亚洲风情| 另类国产ts人妖高潮视频| 偷拍欧美精品| 亚洲欧美日本国产专区一区| 国产色综合网| 亚洲一区欧美激情| 免费日韩av片| 亚洲欧美日韩国产| 六月天综合网| 综合国产精品| 亚洲a成人v| 88久久精品| 国产欧美一区二区三区米奇| 国产精品三级| 久久中文字幕一区二区| 麻豆免费精品视频| 久久久久伊人| 精品国产亚洲日本| 六月婷婷综合| 91精品亚洲| 在线亚洲一区| 亚洲综合激情在线| 日本亚洲最大的色成网站www| 亚洲三级观看| 国产情侣久久| 久久久久久久欧美精品| 亚洲欧美日韩国产一区二区| 亚洲欧美日韩专区| 蜜桃av一区二区| 日本欧美一区二区在线观看| 国产欧美日韩免费观看| 精品国产91| 久久视频国产| 鲁大师影院一区二区三区| 亚洲一区二区三区四区电影 | 婷婷综合网站| 亚洲区国产区| 国产精品大片免费观看| 水蜜桃久久夜色精品一区| 日韩国产激情| 午夜亚洲精品| 欧美日韩一区二区高清| 日韩a一区二区| 在线一区欧美| 国产精品伦一区二区| 亚洲综合电影| 国产亚洲在线| 欧美激情精品| 在线视频观看日韩| 亚洲久久在线| 中文字幕在线视频久| 亚洲欧美日韩国产综合精品二区| 久久国产尿小便嘘嘘| 久久青草久久| 日本中文字幕视频一区| 国产aⅴ精品一区二区三区久久 | www在线观看黄色| 蜜桃视频在线网站| 蜜臀久久99精品久久久久宅男 | 国产精品午夜一区二区三区| 蜜臀久久99精品久久久久宅男| 国产精品久久久久久av公交车| 成人日韩精品| 亚洲永久精品唐人导航网址| 久久丁香四色| 欧美福利专区| 国产精品一国产精品| 成人羞羞视频在线看网址| 亚洲v天堂v手机在线| 日韩视频网站在线观看| 日本久久一区| 久久国产中文字幕| 欧美日本三区| 日韩视频一区| 精品一区二区三区中文字幕视频| 国产精品婷婷| 久久这里只有精品一区二区| 亚洲欧美日本日韩| 国内在线观看一区二区三区| 每日更新成人在线视频| 成人台湾亚洲精品一区二区| 亚洲人亚洲人色久| 日韩在线第七页| 国产精品1区在线| 在线国产精品一区| 91精品国产调教在线观看|