Netty實戰:從核心組件到多協議實現(超詳細注釋,udp,tcp,websocket,http完整demo)

目錄

前言

一、為什么選擇Netty?

二、Netty核心組件解析

三、多協議實現

1. TCP協議實現(Echo服務)

2. UDP協議實現(廣播服務)

3. WebSocket協議實現(實時通信)

4. HTTP協議實現(API服務)

四、性能優化技巧

五、常見問題解決方案

六、真實應用場景

總結


前言

本文將實現TCP/UDP/WebSocket/HTTP四種協議的傳輸示例,所有代碼均添加詳細行級注釋。

Netty 確實強的不行。?


一、為什么選擇Netty?

Netty 與原始 Socket 的性能差異,可從以下核心維度對比分析:

1. IO 模型與事件處理

  • 原始 Socket
    • 基于 BIO(阻塞 IO),每個連接需獨立線程處理,線程資源消耗大,易出現線程阻塞(如 accept、read 等待)。
    • 無事件驅動機制,需主動輪詢或阻塞等待 IO 操作,CPU 利用率低。
  • Netty
    • 基于 NIO(非阻塞 IO),通過 Selector 實現單線程管理多個連接,僅在 IO 事件就緒時處理,避免線程阻塞。
    • 事件驅動模型(如連接建立、數據讀寫)通過回調機制觸發,減少 CPU 空轉和線程切換開銷。

2. 內存與數據傳輸

  • 原始 Socket
    • 數據讀寫需頻繁創建和銷毀字節數組(如byte[]),觸發 GC 開銷,存在內存碎片問題。
    • 數據傳輸需多次拷貝(如用戶空間與內核空間復制),消耗 CPU 和內存資源。
  • Netty
    • 提供池化內存(ByteBuf),重復利用緩沖區,減少 GC 壓力和內存碎片。
    • 支持 “零拷貝” 技術(如FileChannel.transferTo),直接在內核空間完成數據傳輸,避免用戶空間拷貝。

3. 多線程架構

  • 原始 Socket
    • 傳統 “線程 per 連接” 模式,高并發時線程數激增(如 C10K 問題),導致線程上下文切換開銷大,甚至 OOM。
    • 線程資源分配粗放,無明確分工,易出現競爭和阻塞。
  • Netty
    • 主從 Reactor 模式:主 Reactor(Boss Group)處理連接請求,從 Reactor(Worker Group)處理 IO 事件,分工明確,避免單線程瓶頸。
    • 線程池隔離機制:可針對不同業務(如編解碼、業務邏輯)分配獨立線程池,減少資源競爭。

4. 協議與性能優化

  • 原始 Socket
    • 僅提供底層字節流傳輸,需手動處理協議解析(如粘包 / 拆包),性能損耗大。
    • 無連接復用機制,每次通信需新建連接,握手開銷高(如 TCP 三次握手)。
  • Netty
    • 內置編解碼框架(如 Protobuf、JSON),支持自定義協議,減少解析開銷。
    • 連接池管理機制,復用活躍連接,降低連接創建和銷毀成本。

5. 易用性與底層優化

  • 原始 Socket
    • 需手動處理底層細節(如 Selector 注冊、緩沖區管理),代碼復雜度高,易出錯,性能調優困難。
  • Netty
    • 封裝底層細節,提供統一 API,減少開發量;同時內置多種性能優化(如寫緩沖水位控制、自適應接收緩沖區),開箱即用。

總結:性能差異核心原因

維度原始 SocketNetty
IO 模型BIO 阻塞,線程浪費NIO 非阻塞,事件驅動高效
內存管理頻繁 GC,無池化池化內存 + 零拷貝,減少開銷
多線程架構線程競爭嚴重,無分工主從 Reactor,線程池隔離
協議處理手動解析,易粘包內置編解碼,協議優化
工程化優化底層 API 復雜,無復用機制封裝完善,連接復用 + 性能調校

Netty 通過系統化的架構設計和底層優化,在高并發、大流量場景下性能優勢顯著,尤其適合需要高性能網絡通信的場景(如 RPC 框架、消息中間件、網關等),在分布式系統、游戲服務器、物聯網等領域廣泛應用。它的優勢在于:

  • 高吞吐低延遲:基于事件驅動和Reactor模式

  • 零拷貝技術:減少內存復制開銷

  • 靈活的線程模型:支持單線程/多線程/主從模式

  • 豐富的協議支持:HTTP/WebSocket/TCP/UDP等開箱即用


二、Netty核心組件解析

  1. EventLoopGroup?- 線程池管理者

    // BossGroup處理連接請求(相當于前臺接待)
    EventLoopGroup bossGroup = new NioEventLoopGroup(1);// WorkerGroup處理I/O操作(相當于業務處理員)
    EventLoopGroup workerGroup = new NioEventLoopGroup();
  2. Channel?- 網絡連接抽象

    // 代表一個Socket連接,可以注冊讀寫事件監聽器
    Channel channel = bootstrap.bind(8080).sync().channel();
  3. ChannelHandler?- 業務邏輯載體

    // 入站處理器(處理接收到的數據)
    public class InboundHandler extends ChannelInboundHandlerAdapter // 出站處理器(處理發送的數據)
    public class OutboundHandler extends ChannelOutboundHandlerAdapter
  4. ChannelPipeline?- 處理鏈容器

    // 典型處理鏈配置(像流水線一樣處理數據)
    pipeline.addLast("decoder", new StringDecoder());  // 字節轉字符串
    pipeline.addLast("encoder", new StringEncoder());  // 字符串轉字節
    pipeline.addLast("handler", new BusinessHandler()); // 業務處理器
  5. ByteBuf?- 高效數據容器

    // 創建堆外內存緩沖區(零拷貝關鍵技術)
    ByteBuf buffer = Unpooled.directBuffer(1024);
    buffer.writeBytes("Hello".getBytes());  // 寫入數據

三、多協議實現

1. TCP協議實現(Echo服務)

服務端代碼

public class TcpServer {public static void main(String[] args) throws Exception {// 創建線程組(1個接待線程+N個工作線程)EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {// 服務端啟動器ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // 指定NIO傳輸通道.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {// 獲取管道(數據處理流水線)ChannelPipeline pipeline = ch.pipeline();// 添加字符串編解碼器(自動處理字節與字符串轉換)pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));// 添加自定義業務處理器pipeline.addLast(new TcpServerHandler());}});// 綁定端口并啟動服務ChannelFuture f = b.bind(8080).sync();System.out.println("TCP服務端啟動成功,端口:8080");// 等待服務端通道關閉f.channel().closeFuture().sync();} finally {// 優雅關閉線程組workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}
}// TCP業務處理器
class TcpServerHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {// 收到消息直接回寫(實現Echo功能)System.out.println("收到消息: " + msg);ctx.writeAndFlush("ECHO: " + msg);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {// 異常處理(關閉連接)cause.printStackTrace();ctx.close();}
}

客戶端代碼

public class TcpClient {public static void main(String[] args) throws Exception {// 客戶端只需要一個線程組EventLoopGroup group = new NioEventLoopGroup();try {// 客戶端啟動器Bootstrap b = new Bootstrap();b.group(group).channel(NioSocketChannel.class) // 客戶端通道類型.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();// 添加編解碼器pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));pipeline.addLast(new StringEncoder(CharsetUtil.UTF_8));// 添加客戶端業務處理器pipeline.addLast(new TcpClientHandler());}});// 連接服務端Channel ch = b.connect("localhost", 8080).sync().channel();System.out.println("TCP客戶端連接成功");// 發送測試消息ch.writeAndFlush("Hello TCP!");// 等待連接關閉ch.closeFuture().sync();} finally {group.shutdownGracefully();}}
}// 客戶端處理器
class TcpClientHandler extends SimpleChannelInboundHandler<String> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {// 打印服務端響應System.out.println("收到服務端響應: " + msg);}
}

2. UDP協議實現(廣播服務)

服務端代碼

public class UdpServer {public static void main(String[] args) throws Exception {// UDP只需要一個線程組EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class) // UDP通道類型.handler(new ChannelInitializer<NioDatagramChannel>() {@Overrideprotected void initChannel(NioDatagramChannel ch) {// 添加UDP處理器ch.pipeline().addLast(new UdpServerHandler());}});// 綁定端口(UDP不需要連接)ChannelFuture f = b.bind(8080).sync();System.out.println("UDP服務端啟動,端口:8080");// 等待通道關閉f.channel().closeFuture().await();} finally {group.shutdownGracefully();}}
}// UDP處理器
class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) {// 獲取發送方地址InetSocketAddress sender = packet.sender();// 讀取數據內容ByteBuf content = packet.content();String msg = content.toString(CharsetUtil.UTF_8);System.out.printf("收到來自[%s]的消息: %s%n", sender, msg);}
}

客戶端代碼

public class UdpClient {public static void main(String[] args) throws Exception {EventLoopGroup group = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(group).channel(NioDatagramChannel.class) // UDP通道.handler(new SimpleChannelInboundHandler<DatagramPacket>() {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {// 接收服務端響應(可選)System.out.println("收到響應: " + msg.content().toString(CharsetUtil.UTF_8));}});// 綁定隨機端口(0表示系統分配)Channel ch = b.bind(0).sync().channel();// 構建目標地址InetSocketAddress addr = new InetSocketAddress("localhost", 8080);// 創建UDP數據包ByteBuf buf = Unpooled.copiedBuffer("Hello UDP!", CharsetUtil.UTF_8);DatagramPacket packet = new DatagramPacket(buf, addr);// 發送數據ch.writeAndFlush(packet).sync();System.out.println("UDP消息發送成功");// 等待1秒后關閉ch.closeFuture().await(1, TimeUnit.SECONDS);} finally {group.shutdownGracefully();}}
}

3. WebSocket協議實現(實時通信)

服務端代碼

public class WebSocketServer {public static void main(String[] args) throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new WebSocketInitializer()); // 使用初始化器ChannelFuture f = b.bind(8080).sync();System.out.println("WebSocket服務端啟動: ws://localhost:8080/ws");f.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// WebSocket初始化器
class WebSocketInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();// HTTP編解碼器(WebSocket基于HTTP升級)pipeline.addLast(new HttpServerCodec());// 聚合HTTP完整請求(最大64KB)pipeline.addLast(new HttpObjectAggregator(65536));// WebSocket協議處理器,指定訪問路徑/wspipeline.addLast(new WebSocketServerProtocolHandler("/ws"));// 文本幀處理器(處理文本消息)pipeline.addLast(new WebSocketFrameHandler());}
}// WebSocket消息處理器
class WebSocketFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame frame) {// 獲取客戶端消息String request = frame.text();System.out.println("收到消息: " + request);// 構造響應(加前綴)String response = "Server: " + request;// 發送文本幀ctx.channel().writeAndFlush(new TextWebSocketFrame(response));}@Overridepublic void handlerAdded(ChannelHandlerContext ctx) {System.out.println("客戶端連接: " + ctx.channel().id());}
}

HTML客戶端

<!DOCTYPE html>
<html>
<body>
<script>
// 創建WebSocket連接(注意路徑匹配服務端的/ws)
const ws = new WebSocket("ws://localhost:8080/ws");// 連接建立時觸發
ws.onopen = () => {console.log("連接已建立");ws.send("Hello WebSocket!");  // 發送測試消息
};// 收到服務器消息時觸發
ws.onmessage = (event) => {console.log("收到服務端消息: " + event.data);
};// 錯誤處理
ws.onerror = (error) => {console.error("WebSocket錯誤: ", error);
};
</script>
</body>
</html>

4. HTTP協議實現(API服務)

服務端代碼

public class HttpServer {public static void main(String[] args) throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new HttpInitializer());ChannelFuture f = b.bind(8080).sync();System.out.println("HTTP服務啟動: http://localhost:8080");f.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}// HTTP初始化器
class HttpInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline p = ch.pipeline();// HTTP請求編解碼器p.addLast(new HttpServerCodec());// 聚合HTTP完整請求(最大10MB)p.addLast(new HttpObjectAggregator(10 * 1024 * 1024));// 自定義HTTP請求處理器p.addLast(new HttpRequestHandler());}
}// HTTP請求處理器
class HttpRequestHandler extends SimpleChannelInboundHandler<FullHttpRequest> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) {// 獲取請求路徑String path = req.uri();System.out.println("收到請求: " + path);// 準備響應內容String content;HttpResponseStatus status;if ("/hello".equals(path)) {content = "Hello HTTP!";status = HttpResponseStatus.OK;} else {content = "資源不存在";status = HttpResponseStatus.NOT_FOUND;}// 創建完整HTTP響應FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, status,Unpooled.copiedBuffer(content, CharsetUtil.UTF_8));// 設置響應頭response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");response.headers().set(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());// 發送響應ctx.writeAndFlush(response);}
}

四、性能優化技巧

  1. 對象復用?- 減少GC壓力

    // 使用Recycler創建對象池
    public class MyHandler extends ChannelInboundHandlerAdapter {private static final Recycler<MyHandler> RECYCLER = new Recycler<>() {protected MyHandler newObject(Handle<MyHandler> handle) {return new MyHandler(handle);}};
    }
  2. 內存管理?- 優先使用直接內存

    // 配置使用直接內存的ByteBuf分配器
    bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT);
  3. 資源釋放?- 防止內存泄漏

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {try {// 業務處理...} finally {// 確保釋放ByteBufReferenceCountUtil.release(msg);}
    }
  4. 鏈路優化?- 調整TCP參數

    // 服務端配置參數
    ServerBootstrap b = new ServerBootstrap();
    b.option(ChannelOption.SO_BACKLOG, 1024)  // 連接隊列大小.childOption(ChannelOption.TCP_NODELAY, true)  // 禁用Nagle算法.childOption(ChannelOption.SO_KEEPALIVE, true); // 開啟心跳

五、常見問題解決方案

  1. 內存泄漏檢測

    # 啟動時添加JVM參數(四個檢測級別)
    -Dio.netty.leakDetection.level=PARANOID
  2. 阻塞操作處理

    // 使用業務線程池處理耗時操作
    pipeline.addLast(new DefaultEventExecutorGroup(16), new DatabaseQueryHandler());
  3. 粘包/拆包處理

    // 添加幀解碼器(解決TCP粘包問題)
    pipeline.addLast(new LengthFieldBasedFrameDecoder(1024 * 1024,  // 最大長度0,            // 長度字段偏移量4,            // 長度字段長度0,            // 長度調整值4));          // 剝離字節數
  4. 優雅停機方案

    Runtime.getRuntime().addShutdownHook(new Thread(() -> {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();System.out.println("Netty服務已優雅停機");
    }));

六、真實應用場景

  1. 物聯網設備監控

  2. 實時聊天系統

  3. API網關架構

總結

協議類型核心組件適用場景
TCPNioSocketChannel, ByteBuf可靠數據傳輸(文件傳輸、RPC)
UDPNioDatagramChannel, DatagramPacket實時性要求高場景(視頻流、DNS)
WebSocketWebSocketServerProtocolHandler, TextWebSocketFrame雙向實時通信(聊天室、監控大屏)
HTTPHttpServerCodec, FullHttpRequestRESTful API、網關代理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87719.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87719.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCP出現的意義是什么?讓 AI 智能體更模塊化

AI 智能體現在能做的事情真的很厲害&#xff0c;可以思考、規劃&#xff0c;還能執行各種復雜任務&#xff0c;而且代碼量并不大。這讓開發者看到了一個機會&#xff1a;把那些龐大復雜的代碼庫和 API 拆解成更實用的模塊。 不過要讓這些智能變成現實世界里真正能用的東西&…

【深度剖析】領信卓越:福耀玻璃的數字化轉型(下篇3:階段成效3-打造從功能部件到數據終端躍遷的智能化產品)

在數字經濟持續發展的背景下,企業數字化轉型方案成為實現轉型的關鍵。不同行業內的企業因轉型動機和路徑的差異,其轉型成效也各異。福耀玻璃自1983年創立以來,從一家瀕臨破產的鄉鎮水表玻璃廠蛻變為全球汽車玻璃行業的領軍企業,其發展歷程堪稱中國制造業的典范。創始人曹德…

告別停機煩惱!AWS EC2實例升級的“零中斷”實戰方案

引言&#xff1a; “服務器要升級了&#xff0c;今晚得停機維護...” —— 這句話曾是多少運維工程師的“噩夢”&#xff0c;也是業務部門最不愿聽到的通知。在追求極致用戶體驗和7x24小時業務連續性的今天&#xff0c;停機窗口已成為難以承受之重。尤其是在云時代&#xff0c…

奇葩的el-checkbox-group數組賦值

背景。自定義表單。多選組件封裝。當選項被多選后&#xff0c;el-checkbox-group中v-model的值以數組形式存儲了選中的內容。奇葩問題。存儲的值時label屬性。而渲染時需要使用插值單獨將選項的名稱渲染出來。而在el-checkbox標簽中:label要賦值option.value很別扭。 <temp…

【Python系列PyCharm實戰】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解決方案大全

【Python系列Colab實戰】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解決方案大全 一、摘要 在使用 Jupyter、PyCharm 或 Google Colab 進行機器學習開發時&#xff0c;導入 sklearn&#xff08;scikit-learn&#xff09;相關模塊時&#xff0c;常會遇到一系列…

小白的進階之路系列之十六----人工智能從初步到精通pytorch綜合運用的講解第九部分

從零開始學習NLP 在這個由三部分組成的系列中,你將構建并訓練一個基本的字符級循環神經網絡 (RNN) 來對單詞進行分類。 你將學習 如何從零開始構建循環神經網絡NLP 的基本數據處理技術如何訓練 RNN 以識別單詞的語言來源。從零開始學自然語言處理:使用字符級 RNN 對名字進行…

MySQL在ubuntu下的安裝

前言&#xff1a; 安裝與卸載中&#xff0c;用戶全部進行切換為root ,一旦安裝&#xff0c;普通用戶也是可以進行使用 初期聯系mysql時不進行用戶的管理&#xff0c;直接使用root 進行即可&#xff0c;盡快適應mysql語句&#xff0c;后面進行學了用戶管理再考慮新建普通用戶。&…

低代碼技術實戰:從 0 到 1 構建高效業務流程應用

引言 在當今競爭激烈的商業環境中&#xff0c;企業迫切需要簡化運營并提高效率。低代碼技術作為一種新興的解決方案&#xff0c;正逐漸成為企業實現這一目標的有力工具。它能夠將繁瑣的手工業務流程轉化為數字資產和應用程序&#xff0c;為企業帶來諸多優勢。本文將詳細介紹低…

RPGMZ游戲引擎 如何手動控制文字顯示速度

直接上代碼 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度緩沖 0;}; this.文字速度緩沖 0; 進行緩沖 Window_Base…

Leetcode-1750. 刪除字符串兩端相同字符后的最短長度

Problem: 1750. 刪除字符串兩端相同字符后的最短長度1750. 刪除字符串兩端相同字符后的最短長度 1750. 刪除字符串兩端相同字符后的最短長度 思路 雙指針遍歷 解題過程 模擬題目描述的過程&#xff0c;使用指針 l, r 指向首尾兩端。 如果相同就向中心移動。為了盡可能的刪除多…

【mysql】通過information_schema.tables查詢表的統計信息

1 查詢表的統計信息 information_schema.tables 是 MySQL 中的一個系統視圖&#xff0c;包含數據庫中所有表的信息。 如何查詢當前數據庫的所有表信息&#xff1a; SELECT * FROM information_schema.tables WHERE table_schema DATABASE(); 返回的字段有&#xff1a; 字段名…

“地標界愛馬仕”再啟:世酒中菜聯袂陳匯堂共筑新會陳皮頂奢產業

“地標界愛馬仕”再啟戰略新篇&#xff1a;世酒中菜聯袂陳匯堂&#xff0c;共筑新會陳皮頂奢產業生態 ——中世國際與陳匯堂股權合作簽約儀式在國際地理標志服務基地舉行 江門市新會區&#xff0c;2025年6月20日——被譽為“地標界愛馬仕”的全球頂奢品牌運營商世酒中菜 &…

倒計時 效果

實現HTML <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>信質集團SAP/ERP切換倒計時</title…

高性能群集部署技術-Nginx+Tomcat負載均衡群集

目錄 #1.1案例概述 1.1.1案例前置知識點 1.1.2案例環境 #2.1案例實施 2.1.1實施準備 2.1.2查看JDK是否安裝 2.1.3安裝配置Tomcat 2.1.4Tomcat主配置文件說明 2.1.5建立Java的Web站點 #3.1NginxTomcat負載均衡&#xff0c;動靜分離群集的實驗案例 3.1.1案例概述 3.1.2案例環境…

《Go語言圣經》函數值、匿名函數遞歸與可變參數

《Go語言圣經》函數值、匿名函數遞歸與可變參數 函數值&#xff08;Function Values&#xff09; 在 Go 語言中&#xff0c;函數被視為第一類值&#xff08;first-class values&#xff09;&#xff0c;這意味著它們可以像其他值一樣被操作&#xff1a;擁有類型、賦值給變量、…

vtk和opencv和opengl直接的區別是什么?

簡介 VTK、OpenCV 和 OpenGL 是三個在計算機圖形學、圖像處理和可視化領域廣泛使用的工具庫&#xff0c;但它們在功能、應用場景和底層技術上存在顯著差異。以下是它們的核心區別和特點對比&#xff1a; 1. 核心功能與定位 工具核心功能主要應用領域VTK (Visualization Toolk…

最新豆包大模型發布!火山引擎推出Agent開發新范式

Datawhale大會 2025火山引擎 Force 原動力大會 6月11日-12日&#xff0c;北京國家會議中心人山人海&#xff0c;2025 火山引擎 Force 原動力大會如約而至。 作為開發者社區的一員&#xff0c;這場大會上的一系列新發布讓我們感受到了&#xff1a;這個 Agent 技術落地元年的關鍵…

RFC4291-IPv6地址架構解說

RFC 4291 是由互聯網工程任務組&#xff08;IETF&#xff09;發布的關于 IPv6 地址架構 的標準文檔。 該文檔詳細定義了 IPv6 地址的格式、類型、表示方法以及分配方式。 以下是對 RFC 4291 中 IPv6 地址架構的全面解析&#xff0c;包括地址格式、類型、表示方法、特殊地址以…

簡單對比 **HTTP**、**MQTT** 和 **CoAP** 這三種通信協議

對比 HTTP、MQTT 和 CoAP 這三種通信協議&#xff0c;從 消息結構、資源占用、安全性 等方面進行全面分析。 &#x1f310; HTTP vs MQTT vs CoAP 對比 特性HTTPMQTTCoAP協議層級應用層基于 TCP應用層基于 TCP / WebSocket應用層基于 UDP (也支持 TCP)消息模式請求/響應 (客戶…

【Dify 案例】【自然語言轉SQL案例】【五】【實戰二】【財務管理查詢商品信息數據】

援引實戰一,進行數據業務處理化 1.開始 2.自然語言轉SQL的工具 3.參數提取器 4.SQL查詢