Netty 實戰篇:構建簡易注冊中心,實現服務發現與調用路由

本文將為前面構建的輕量級 RPC 框架添加“服務注冊與發現”功能,支持多服務節點動態上線、自動感知與調用路由,為構建真正可擴展的分布式系統打好基礎。


一、背景:為什么需要注冊中心?

如果每個客戶端都硬編碼連接某個 IP/端口的服務:

  • 不利于服務水平擴展(多實例)

  • 無法實現負載均衡

  • 服務上線/下線無法感知

? 有了注冊中心后:

  • 服務啟動時自動注冊

  • 客戶端從注冊中心獲取最新服務列表

  • 可實現輪詢/哈希/權重等負載均衡


二、系統結構圖

┌──────────────┐
│ 注冊中心     │?────────────┐
│(服務發現) │             │
└─────┬────────┘             │▲                      │注冊服務│                      │
┌─────┴──────┐     ┌─────────┴─────────┐
│  服務節點A │     │  服務節點B        │
└────┬───────┘     └─────────┬─────────┘│注冊                   │注冊▼                       ▼客戶端 ?──── 查詢服務地址列表 ─────┐└── 負載均衡調用 ────────┘

三、注冊中心(基于 Netty 實現)

public class RegisterCenterServer {private static final Map<String, List<InetSocketAddress>> serviceMap = new ConcurrentHashMap<>();public static void main(String[] args) throws Exception {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup()).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(null))).addLast(new ObjectEncoder()).addLast(new RegisterHandler());}});bootstrap.bind(9000).sync();System.out.println("注冊中心啟動成功");}static class RegisterHandler extends SimpleChannelInboundHandler<Object> {protected void channelRead0(ChannelHandlerContext ctx, Object msg) {if (msg instanceof RegisterRequest) {RegisterRequest req = (RegisterRequest) msg;serviceMap.computeIfAbsent(req.getServiceName(), k -> new ArrayList<>()).add(req.getAddress());ctx.writeAndFlush("SUCCESS");} else if (msg instanceof LookupRequest) {LookupRequest req = (LookupRequest) msg;List<InetSocketAddress> list = serviceMap.getOrDefault(req.getServiceName(), Collections.emptyList());ctx.writeAndFlush(list);}}}
}

四、服務節點注冊流程

服務端在啟動時將自己的信息注冊到注冊中心:

RegisterRequest req = new RegisterRequest();
req.setServiceName("helloService");
req.setAddress(new InetSocketAddress("127.0.0.1", 8080));Socket socket = new Socket("127.0.0.1", 9000);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(req);

五、客戶端服務發現

public class ServiceDiscovery {public List<InetSocketAddress> lookup(String serviceName) {try (Socket socket = new Socket("127.0.0.1", 9000)) {ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());out.writeObject(new LookupRequest(serviceName));ObjectInputStream in = new ObjectInputStream(socket.getInputStream());return (List<InetSocketAddress>) in.readObject();} catch (Exception e) {throw new RuntimeException("服務發現失敗", e);}}
}

六、負載均衡策略

public class LoadBalancer {public static InetSocketAddress choose(List<InetSocketAddress> list) {return list.get(new Random().nextInt(list.size())); // 簡單輪詢/隨機}
}

七、調用流程整合

ServiceDiscovery discovery = new ServiceDiscovery();
List<InetSocketAddress> providers = discovery.lookup("helloService");
InetSocketAddress address = LoadBalancer.choose(providers);// 使用 address 建立 Netty 連接,發送 RPC 請求

八、總結

通過本篇內容,我們為 Netty RPC 框架實現了:

? 多服務節點注冊與發現
? 基于 Netty 的輕量級注冊中心
? 動態服務列表查詢
? 簡易負載均衡支持

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

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

相關文章

c++之分支

深入理解 C 分支結構&#xff1a;從基礎到實戰 在 C 編程的世界里&#xff0c;分支結構是控制程序流程的重要手段&#xff0c;它賦予程序 “思考” 和 “選擇” 的能力&#xff0c;讓程序能夠根據不同的條件執行不同的代碼塊。本文將帶大家深入探索 C 分支結構&#xff0c;結合…

LLMs之MCP:如何使用 Gradio 構建 MCP 服務器

LLMs之MCP&#xff1a;如何使用 Gradio 構建 MCP 服務器 導讀&#xff1a;本文詳細介紹了如何使用Gradio構建MCP服務器&#xff0c;包括前提條件、構建方法、關鍵特性和相關資源。通過一個簡單的字母計數示例&#xff0c;演示了如何將Gradio應用轉換為LLM可以使用的工具。Gradi…

ubuntu20.04.5-arm64版安裝robotjs

ubuntu20.04.5arm上使用robotjs #ssh&#xff0c;可選 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墻相關&#xff0c;可選 sudo ufw allow ssh sudo ufw allow 2222/tc…

craw4ai 抓取實時信息,與 mt4外行行情結合實時交易,基本面來覺得趨勢方向,搞一個外匯交易策略

結合實時信息抓取、MT4行情數據、基本面分析的外匯交易策略框架&#xff0c;旨在通過多維度數據融合提升交易決策質量&#xff1a;行不行不知道先試試&#xff0c;理論是對的&#xff0c;只要基本面方向沒錯 策略名稱&#xff1a;Tri-Sync 外匯交易系統 核心理念 「基本面定方…

Python中scapy庫詳細使用(強大的交互式數據包操作程序和庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、scapy概述1.1 scapy介紹1.2 安裝1.3 交互模式1.4 安全注意事項二、基本使用2.1 數據包構造基礎2.2 數據包發送2.3 數據包嗅探2.4 數據包分析與操作2.5 網絡掃描技術2.6 協議實現示例三、高級功能3.1 數據包重放3.2 …

基于Web的瀕危野生動物保護信息管理系統設計(源碼+定制+開發)瀕危野生動物監測與保護平臺開發 面向公眾參與的野生動物保護與預警信息系統

博主介紹&#xff1a; ?我是阿龍&#xff0c;一名專注于Java技術領域的程序員&#xff0c;全網擁有10W粉絲。作為CSDN特邀作者、博客專家、新星計劃導師&#xff0c;我在計算機畢業設計開發方面積累了豐富的經驗。同時&#xff0c;我也是掘金、華為云、阿里云、InfoQ等平臺…

[SAP] 矩陣復制(Matrix Copy)

SAP中的復制粘貼功能被稱為矩陣復制&#xff0c;通過點擊對話框或屏幕&#xff0c;并執行下述命令&#xff0c;使用矩陣復制就可以復制多行文本 ① 按下Ctrl-Y&#xff0c;從左上到右下拖拉鼠標來選擇文本 ② 文本高亮顯示后&#xff0c;按下Ctrl-C ③ 移到新的位置插入文本…

【筆記】在 MSYS2(MINGW64)中安裝 Python 工具鏈的記錄

#工作記錄 &#x1f4cc; 安裝背景 操作系統&#xff1a;MSYS2 MINGW64當前時間&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;默認通過 pacman 安裝&#xff09;目標工具鏈&#xff1a; pipxnumpypipsetuptoolswheel &#x1f6e0;? 安裝過程與結果記錄…

OpenCV CUDA模塊結構分析與形狀描述符------在 GPU 上計算圖像的原始矩(spatial moments)函數spatialMoments()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上計算圖像的原始矩&#xff08;spatial moments&#xff09;。這些矩可用于描述圖像中物體的形狀特征&#xff0c;如面積、質…

Nacos實戰——動態 IP 黑名單過濾

1、需求分析 一些惡意用戶&#xff08;?可能是黑客、爬蟲、DDoS ?攻擊者&#xff09;可能頻繁請求服務器資?源&#xff0c;導致資源占用過高。針對這種問題&#xff0c;可以通過IP? 封禁&#xff0c;可以有效拉?黑攻擊者&#xff0c;防止資源?被濫用&#xff0c;保障合法…

opencv + jpeg_turbo(啟用SIMD加速)

背景 opencv的imreadimwrite耗時過大 一張5M的圖片讀用了140ms,寫一張1.7M的圖片用149ms 平臺&#xff1a;mingw64編譯Windows程序版本&#xff1a;opencv4.5.4 加速方案 opencv啟用openmpopencv啟用jpeg_turbojpeg_turbo啟動SIMD加速 下載jpeg_turbo源碼 opencv源碼自帶…

Redis 主從節點

Redis 主從節點的核心區別 特性主節點 (Master)從節點 (Slave/Replica)讀寫權限可讀可寫只讀&#xff08;默認配置&#xff09;數據流向數據來源從主節點同步數據連接關系可連接多個從節點只能連接一個主節點故障切換故障時需要手動/自動提升從節點可被提升為新的主節點命令執…

汽車安全:功能安全FuSa、預期功能安全SOTIF與網絡安全Cybersecurity 解析

汽車安全的三重防線&#xff1a;深入解析FuSa、SOTIF與網絡安全技術 現代汽車已成為裝有數千個傳感器的移動計算機&#xff0c;安全挑戰比傳統車輛復雜百倍。 隨著汽車智能化、網聯化飛速發展&#xff0c;汽車電子電氣架構已從簡單的分布式控制系統演變為復雜的移動計算平臺。現…

github好玩的工具

以下是 GitHub 上一些有趣且實用的開源工具推薦,涵蓋 AI 應用、效率提升、趣味開發等方向,結合最新趨勢和項目熱度整理: 一、AI 與深度偽造工具 Deep-Live-Cam 僅需一張圖片即可在視頻直播中實時替換人臉,適用于內容創作和虛擬角色開發,支持多平臺硬件運行(如 NVIDIA CUD…

Python應用for循環臨時變量作用域

大家好!如果你剛開始學習Python&#xff0c;可能會對for循環中臨時變量的作用域感到好奇。下面通過一個簡單的練習&#xff0c;幫助你理解這個概念。 代碼呈現: i 0 for i in range(5):print(i)print(i)代碼介紹: 首先我們初始化變量i 0然后進入for循環&#xff0c;這里i成為…

深度學習---負樣本訓練

一、負樣本的本質與核心作用 1. 定義與范疇 負樣本&#xff08;Negative Sample&#xff09;是與目標樣本&#xff08;正樣本&#xff09;在語義、特征或任務目標上存在顯著差異的樣本。其核心價值在于通過對比學習引導模型學習樣本間的判別性特征&#xff0c;而非僅記憶正樣本…

實驗設計與分析(第6版,Montgomery)第3章單因子實驗:方差分析3.11思考題3.7 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第3章單因子實驗&#xff1a;方差分析3.11思考題3.7 R語言解題。主要涉及單因子方差分析&#xff0c;正態性假設檢驗&#xff0c;殘差與擬合值的關系圖&#xff0c;平方根變換。 X<-c(…

【PhysUnits】15.8 引入P1后的減法運算(sub.rs)

一、源碼 這段代碼實現了一個類型級別的二進制數減法系統&#xff0c;包含標準減法和帶借位減法。 use core::ops::{Neg, Not, Sub}; use super::basic::{Z0, N1, P1, B0, B1, Integer, NonZero}; use super::add1::Add1; use super::sub1::Sub1; use super::standardization…

npm install命令都做了哪些事情

npm install&#xff08;或其簡寫 npm i&#xff09;是 Node.js 項目中最重要的命令之一&#xff0c;它負責安裝項目所需的所有依賴項。下面我將詳細解釋這個命令的完整執行過程和底層機制&#xff0c;讓你徹底理解它背后的工作原理。 一、npm install 的完整工作流程 1. 依賴…

mkdir: cannot create directory ‘gitlab-stu’: No space left on device

Linux中創建目錄時報錯“mkdir: cannot create directory ‘gitlab-stu’: No space left on device”&#xff0c;磁盤空間不足。 使用df命令查看&#xff0c;發現 / 下面use%占滿了&#xff1a; 查看inode使用情況&#xff1a; 可以看到docker的數據大部分存放在/var/lib/do…