国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合

這篇具有很好參考價值的文章主要介紹了構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio
「作者主頁」:雪碧有白泡泡
「個人網(wǎng)站」:雪碧的個人網(wǎng)站
構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

ChatGPT體驗地址

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

IO

在Java基礎(chǔ)中,IO流是一個重要操作,先上八股

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

  1. BIO:傳統(tǒng)的IO,同步阻塞,一個連接一個線程。一般不怎么使用
  2. AIO:JDK7引入的,異步非阻塞IO
  3. NIO:JDK1.4之后新的API,是多路復(fù)用,允許你一次性處理多個連接,而不需要等待每個連接的完成。(NIO 多路復(fù)用的核心概念是 Selector(選擇器)和 Channel(通道)通過Channel、Buffer和Selector來進行數(shù)據(jù)傳輸和事件處理)

Netty

Netty是建立在NIO之上的一個框架,提供了更高級的抽象,如ChannelHandler和EventLoop,簡化了事件處理和網(wǎng)絡(luò)編程。
執(zhí)行流程如下圖
構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

具有高性能,高可靠性,高可擴展性,還支持多種協(xié)議

我們以聊天流程為例

  1. 服務(wù)端啟動
  2. 客戶端啟動
  3. 客戶端啟動連接上的時候,告知服務(wù)端
  4. 服務(wù)端讀取到客戶端的信息后立即發(fā)送信息給客戶端
  5. 客戶端收到信息后也發(fā)送給服務(wù)端

1. 引入依賴

  		<dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.76.Final</version>
        </dependency>

2. 服務(wù)端

@Slf4j
public class NettyServer {

    private final static int PORT = 9012;

    public static void main(String[] args) throws InterruptedException {
        /**
         * 包含childGroup,childHandler,config,繼承的父類AbstractBootstrap包括了parentGroup
         * */
        ServerBootstrap bootstrap = new ServerBootstrap();
        /**
         * EventLoopGroup用于處理所有ServerChannel和Channel的所有事件和IO
         * */
        EventLoopGroup parentGroup = new NioEventLoopGroup();
        EventLoopGroup childGroup = new NioEventLoopGroup();
        try {
            /**
             * 綁定兩個事件組
             * */
            bootstrap.group(parentGroup, childGroup)
                    /**
                     * 初始化socket,定義tcp連接的實例
                     * 內(nèi)部調(diào)用ReflectiveChannelFactory實現(xiàn)對NioServerSocketChannel實例化
                     * channelFactory是在AbstractBootstrap,也就是bootstrap的父類
                     * */
                    .channel(NioServerSocketChannel.class)
                    /**
                     * 添加處理器
                     * ChannelInitializer包括了Set<ChannelHandlerContext> initMap
                     *
                     * 這里比較有趣的事情就是使用被注冊的channel去初始化其他的channel,
                     * 等初始化結(jié)束后移除該channel
                     * 所以SocketChannel是一個工具,
                     *
                     * 在bind綁定端口的時候,進行初始化和注冊initAndRegister,
                     * 通過channel = channelFactory.newChannel()得到初始化channel
                     * init(channel)真正開始初始化,
                     * p = channel.pipeline()得到ChannelPipeline,
                     * p.addLast開始添加
                     * ch.eventLoop().execute將childHandler賦值并開啟一個任務(wù)setAutoRead
                     * 所以最后在監(jiān)聽讀取的時候?qū)凑障旅嫣砑拥腸hannel進行讀取
                     *
                     * ChannelInitializer繼承了ChannelInboundHandlerAdapter
                     * 間接繼承ChannelHandlerAdapter,ChannelInboundHandler,
                     * */
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            /**
                             * ByteBuf和String之間的轉(zhuǎn)換
                             *
                             *  Decoders解密
                             *  pipeline.addLast("frameDecoder", new {@link LineBasedFrameDecoder}(80))
                             *  pipeline.addLast("stringDecoder", new {@link StringDecoder}(CharsetUtil.UTF_8))
                             *
                             *  Encoder加密
                             *  pipeline.addLast("stringEncoder", new {@link StringEncoder}(CharsetUtil.UTF_8))
                             *
                             *  使用上面的加密解密后就可以直接讀取字符串
                             *   void channelRead({@link ChannelHandlerContext} ctx, String msg) {
                             *       ch.write("Did you say '" + msg + "'?\n")
                             *  }
                             *
                             * */
                            pipeline.addLast(new StringDecoder());
                            pipeline.addLast(new StringEncoder());
                            //自定義處理器
                            pipeline.addLast(new ServerHandler1());
                        }
                    });
            ChannelFuture future = bootstrap.bind(PORT).sync();
            log.info("服務(wù)器已啟動");
            future.channel().closeFuture().sync();
        } finally {
            parentGroup.shutdownGracefully();
            childGroup.shutdownGracefully();
        }
    }
}

這段代碼實現(xiàn)了一個使用Netty框架的服務(wù)器端,它監(jiān)聽指定的端口并處理客戶端的連接請求。

  1. 創(chuàng)建一個ServerBootstrap實例,用于啟動服務(wù)器。
  2. 創(chuàng)建兩個EventLoopGroup實例,parentGroup用于處理服務(wù)器的連接請求,childGroup用于處理客戶端的數(shù)據(jù)通信。
  3. 綁定事件組到ServerBootstrap實例。
  4. 指定使用的NioServerSocketChannel作為服務(wù)器套接字通道的實現(xiàn)類。
  5. 添加處理器到ChannelInitializer中,該處理器負責(zé)初始化和配置新連接的SocketChannel。
  6. 在處理器中,通過ChannelPipeline添加了如下處理器:
    • StringDecoder:處理傳入的字節(jié)數(shù)據(jù),并將其解碼為字符串。
    • StringEncoder:處理傳出的字符串?dāng)?shù)據(jù),并將其編碼為字節(jié)。
    • ServerHandler1:自定義的處理器,用于處理客戶端發(fā)送的消息。
  7. 綁定服務(wù)器的端口號,啟動服務(wù)器。
  8. 等待服務(wù)器的關(guān)閉事件。
  1. 處理器
@Slf4j
public class ServerHandler1 extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info("Client Address ====== {},讀取的信息:{}", ctx.channel().remoteAddress(),msg);
        ctx.channel().writeAndFlush("服務(wù)端writeAndFlush:我是服務(wù)端");
        ctx.fireChannelActive();
        //睡眠
        TimeUnit.MILLISECONDS.sleep(500);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        //打印異常
        cause.printStackTrace();
        //關(guān)閉Channel連接,并通知ChannelFuture,通常是出現(xiàn)異常或者是完成了操作
        ctx.close();
    }
}

4. 客戶端

@Slf4j
public class NettyClient {
    private final static int PORT = 9012;
    private final static String IP = "localhost";

    public static void main(String[] args) throws InterruptedException {
        /**
         * 服務(wù)端是ServerBootstrap,客戶端是Bootstrap
         * Bootstrap引導(dǎo)channel連接,UDP連接用bind方法,TCP連接用connect方法
         * */
        Bootstrap bootstrap = new Bootstrap();
        /**
         * 服務(wù)端是EventLoopGroup,客戶端是NioEventLoopGroup
         * 這里創(chuàng)建默認0個線程,一個線程工廠,一個選擇器提供者
         * */
        NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        try {
            bootstrap.group(eventLoopGroup)
                    /**
                     * 初始化socket,定義tcp連接的實例
                     * */
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            /**
                             * 進行字符串的轉(zhuǎn)換
                             * */
                            pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
                            pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));
                            /**
                             * 自定義處理器
                             * */
                            pipeline.addLast(new ClientHandler1());
                        }
                    });
            ChannelFuture future = bootstrap.connect(IP, PORT).sync();
            log.info("客戶端訪問");
            future.channel().closeFuture().sync();
        } finally {
            eventLoopGroup.shutdownGracefully();
        }
    }
}

這段代碼實現(xiàn)了一個使用Netty框架的客戶端,它連接到指定的服務(wù)器端并與服務(wù)器進行通信。

  1. 創(chuàng)建一個Bootstrap實例,用于啟動客戶端。
  2. 創(chuàng)建一個NioEventLoopGroup實例,用于處理客戶端的事件和IO操作。
  3. 綁定事件組到Bootstrap實例。
  4. 指定使用的NioSocketChannel作為客戶端套接字通道的實現(xiàn)類。
  5. 添加處理器到ChannelInitializer中,該處理器負責(zé)初始化和配置客戶端連接的SocketChannel。
  6. 在處理器中,通過ChannelPipeline添加了如下處理器:
    • StringDecoder:處理傳入的字節(jié)數(shù)據(jù),并將其解碼為字符串。
    • StringEncoder:處理傳出的字符串?dāng)?shù)據(jù),并將其編碼為字節(jié)。
    • ClientHandler1:自定義的處理器,用于處理與服務(wù)器之間的通信。
  7. 使用Bootstrapconnect()方法連接到指定的服務(wù)器IP和端口。
  8. 等待連接完成。
  9. 在連接成功后,打印日志信息。
  10. 等待客戶端的關(guān)閉事件。
  1. 處理器
@Slf4j
public class ClientHandler1 extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info("客戶端讀取的信息:{}", msg);
        ctx.channel().writeAndFlush("客戶端writeAndFlush:我是客戶端");
        TimeUnit.MILLISECONDS.sleep(5000);
    }

    /**
     * 當(dāng)事件到達pipeline時候觸發(fā)
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        ctx.channel().writeAndFlush("客戶端:開始聊天");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        //關(guān)閉Channel連接
        ctx.close();
    }

}

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

結(jié)果

服務(wù)端日志

Client Address ====== /127.0.0.1:63740,讀取的信息:客戶端:開始聊天
Client Address ====== /127.0.0.1:63740,讀取的信息:客戶端writeAndFlush:我是客戶端
Client Address ====== /127.0.0.1:63740,讀取的信息:客戶端writeAndFlush:我是客戶端

客戶端日志

客戶端讀取的信息:服務(wù)端writeAndFlush:我是服務(wù)端
客戶端讀取的信息:服務(wù)端writeAndFlush:我是服務(wù)端

總結(jié)

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

引導(dǎo)類-Bootstarp和ServerBootstrap

Bootstarp和ServerBootstrap被稱為引導(dǎo)類,使你的應(yīng)用程序和網(wǎng)絡(luò)層相隔離。類似java項目的啟動類。

連接-NioSocketChannel

客戶端和服務(wù)端的啟動都是采用配置的channel去連接處理器,這里服務(wù)端和客戶端是用NioSocketChannel

事件組-EventLoopGroup和NioEventLoopGroup

客戶端使用的是NioEventLoopGroup,服務(wù)端使用的是EventLoopGroup。 服務(wù)端和客戶端的引導(dǎo)類啟動后實現(xiàn)了配置的運行,客戶端和服務(wù)端的連接都是采用NioSocketChannel。 連接的流程:

  1. 客戶端創(chuàng)建一個channel
  2. channel對應(yīng)一個EventLoop,EventLoop存放到NioEventLoopGroup中
  3. 服務(wù)端監(jiān)聽到后,創(chuàng)建一個channel連接,channel對應(yīng)一個EventLoop,EventLoop存放到子的EventLoopGroup,父的事件組負責(zé)監(jiān)聽,一個事件對應(yīng)一個子事件組。
    在這里可以認為父是boss監(jiān)聽組,子是工作組。
  4. 當(dāng)客戶端發(fā)送信息的時候,先被父監(jiān)聽,然后將異步調(diào)用工作組。
  5. 消息會經(jīng)過事件組的所有處理器。

實際上服務(wù)端的事件組也可以使用NioEventLoopGroup。
![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/5e676670b49e40dd83155e76094e9017.png

送書活動

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio

  • ??本次送書1~3本【取決于閱讀量,閱讀量越多,送的越多】??
  • ??活動時間:截止到2024-1月10號
  • ??參與方式:關(guān)注博主+三連(點贊、收藏、評論)
    購買鏈接:https://item.jd.com/13836258.html

構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合,粉絲福利活動,服務(wù)器,spring boot,運維,Netty,nio文章來源地址http://www.zghlxwxcb.cn/news/detail-776965.html

到了這里,關(guān)于構(gòu)建異步高并發(fā)服務(wù)器:Netty與Spring Boot的完美結(jié)合的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • netty構(gòu)建udp服務(wù)器以及發(fā)送報文到客戶端客戶端詳細案例

    netty構(gòu)建udp服務(wù)器以及發(fā)送報文到客戶端客戶端詳細案例

    目錄 一、基于netty創(chuàng)建udp服務(wù)端以及對應(yīng)通道設(shè)置關(guān)鍵 二、發(fā)送數(shù)據(jù) 三、netty中的ChannelOption常用參數(shù)說明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代碼中

    2024年04月09日
    瀏覽(31)
  • 用反應(yīng)器模式和epoll構(gòu)建百萬并發(fā)服務(wù)器

    用反應(yīng)器模式和epoll構(gòu)建百萬并發(fā)服務(wù)器

    此處的百萬并發(fā)指的是可以建立至少100w個客戶端連接,不考慮業(yè)務(wù)處理。 反應(yīng)器模式下的epoll相比起普通的epoll不同在于:普通的epoll在獲取到就緒狀態(tài)的event結(jié)構(gòu)體之后,先判斷是什么類型的fd,再進行操作。而reactor先判斷是什么類型的事件,再進行操作。本文從頭用react

    2024年02月02日
    瀏覽(26)
  • Spring MVC異步上傳、跨服務(wù)器上傳和文件下載

    Spring MVC異步上傳、跨服務(wù)器上傳和文件下載

    之前的上傳方案,在上傳成功后都會跳轉(zhuǎn)頁面。而在實際開發(fā)中,很多情況下上傳后不進行跳轉(zhuǎn),而是進行頁面的局部刷新,比如:上傳頭像成功后將頭像顯示在網(wǎng)頁中。這時候就需要使用異步文件上傳。 編寫JSP頁面,引入jQuery和jQuery表單上傳工具jquery.form.js【該js文件已經(jīng)

    2024年02月16日
    瀏覽(31)
  • TCP服務(wù)器的演變過程:使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型實現(xiàn)百萬級并發(fā)(詳細代碼)

    TCP服務(wù)器的演變過程:使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型實現(xiàn)百萬級并發(fā)(詳細代碼)

    手把手教你從0開始編寫TCP服務(wù)器程序,體驗開局一塊磚,大廈全靠壘。 為了避免篇幅過長使讀者感到乏味,對【TCP服務(wù)器的開發(fā)】進行分階段實現(xiàn),一步步進行優(yōu)化升級。 本節(jié),在上一章節(jié)介紹了如何使用epoll開發(fā)高效的服務(wù)器,本節(jié)將介紹使用epoll構(gòu)建reactor網(wǎng)絡(luò)模型,實

    2024年02月01日
    瀏覽(30)
  • Spring Boot與Netty:構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用

    Spring Boot與Netty:構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用

    點擊下載《Spring Boot與Netty:構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用》 本文將詳細探討如何在Spring Boot應(yīng)用中集成Netty,以構(gòu)建高性能的網(wǎng)絡(luò)應(yīng)用。我們將首先了解Netty的原理和優(yōu)勢,然后介紹如何在Spring Boot項目中集成Netty,包括詳細的使用流程和步驟,以及帶有注釋的代碼示例。通過本文,

    2024年02月22日
    瀏覽(19)
  • Spring boot實現(xiàn)上傳文件至本地或服務(wù)器

    大家好 我是程序猿小張 圖片文件上傳是項目中必不可少的一個功能,上傳的地址也當(dāng)然是優(yōu)先選擇第三方的對象存儲,例如七牛云、阿里云等等,但是當(dāng)中的話只有七牛云是有一個免費額度的,其他都是要收錢的。所以就想著,哎,這個能不能上傳到本地呢?答案是肯定可

    2024年02月11日
    瀏覽(98)
  • 從spring boot泄露到接管云服務(wù)器平臺

    0x1前言 在打野的時候意外發(fā)現(xiàn)了一個站點存在springboot信息泄露,之前就有看到一些文章可以直接rce啥的,今天剛好試試。通過敏感信息發(fā)現(xiàn)存在accesskey泄露,就想直接通過解密,獲取敏感信息,接管云平臺。 首先說下這個漏洞的產(chǎn)生。主要是因為程序員開發(fā)時沒有意識到暴

    2023年04月11日
    瀏覽(100)
  • Spring Boot 項目應(yīng)用消息服務(wù)器RabbitMQ(簡單介紹)

    Spring Boot 項目應(yīng)用消息服務(wù)器RabbitMQ(簡單介紹)

    本章講述的是在用戶下單環(huán)節(jié),消息服務(wù)器RabbitMQ 的應(yīng)用 在寫一個電商項目的小demo,在電商項目中,消息服務(wù)器的應(yīng)用: 1、訂單狀態(tài)通知:當(dāng)用戶下單、支付成功、訂單發(fā)貨、訂單完成等關(guān)鍵節(jié)點時,可以通過消息服務(wù)器向用戶發(fā)送相應(yīng)的訂單狀態(tài)通知。 2、消息推送:通

    2024年02月13日
    瀏覽(97)
  • 【Java開發(fā)】 Spring 11 :Spring Boot 項目部署至云服務(wù)器

    【Java開發(fā)】 Spring 11 :Spring Boot 項目部署至云服務(wù)器

    Spring Boot 項目開發(fā)結(jié)束后的工作便是運維,簡單來說需要配置?Web 運行參數(shù)和項目部署兩大工作,本文將盡可能詳細地給大家講全! 目錄 1 定制 Web 容器運行參數(shù) 1.1?運行參數(shù)介紹 1.2?項目搭建 ① 通過 IDEA Spring Initializr 創(chuàng)建項目 ② 添加 Spring Web 等依賴 ③ 編寫 controller 層的

    2023年04月23日
    瀏覽(97)
  • Spring Boot+Vue前后端分離項目如何部署到服務(wù)器

    Spring Boot+Vue前后端分離項目如何部署到服務(wù)器

    ?? 前言 歡迎來到我的技術(shù)小宇宙!?? 這里不僅是我記錄技術(shù)點滴的后花園,也是我分享學(xué)習(xí)心得和項目經(jīng)驗的樂園。?? 無論你是技術(shù)小白還是資深大牛,這里總有一些內(nèi)容能觸動你的好奇心。?? ?? 洛可可白 :個人主頁 ?? 個人專欄 :?前端技術(shù) ?后端技術(shù) ?? 個人

    2024年04月11日
    瀏覽(108)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包