RPC--自定義注解注冊發布服務

自定義的三個注解

1、RpcReference

這個注解用于修飾類的某個字段,表示這個字段是遠程調用的引用

下面詳細解釋下這個字段的定義

  • @Document表示這個注解應該被javadoc文檔工具記錄,生成API文檔時使用了該注解的地方會被顯示出來

  • @Retention表示這個注解的聲明周期,它定義了這個注解可以在運行的時候通過反射讀取到,也就是可以通過反射來獲取到這個注解里的屬性

  • @Target表示這個注解只能被加在類的字段上

  • @Inherited表示這個注解具有繼承屬性,也就是說如果一個類的某個字段有這個注解,那么繼承這個類的子類也會繼承這個注解的行為

上面那個注解用在client端的調用服務,例如下面的HelloController這個類的HelloService函數,標識這是一個服務的遠程調用,框架在啟動時通過RpcScan注解自動將遠程服務注入為代理對象

然后在運行過程中通過反射拿到代理對象上面的RpcReference注解的屬性,獲取里面的version和group的值

2、RpcService

這個注解通常用在服務類上, 標注這個類實現了一個遠程接口,并希望將其作為實例暴露給遠程調用

下面詳細解釋下這個字段的定義

  • @Document表示這個注解應該被javadoc文檔工具記錄,生成API文檔時使用了該注解的地方會被顯示出來

  • @Retention表示這個注解的聲明周期,它定義了這個注解可以在運行的時候通過反射讀取到,也就是可以通過反射來獲取到這個注解里的屬性

  • @Target表示這個注解只能被加在類、接口、枚舉上面,不能加在某個類或者

  • @Inherited表示這個注解具有繼承屬性,也就是說如果一個類的某個字段有這個注解,那么繼承這個類的子類也會繼承這個注解的行為

如下面時他的一個調用實例

3、RpcScan

這個注解用于在Spring框架中啟用對RPC服務的自動掃描和注冊。通常在一個配置類上,告訴spring哪些包需要被掃描來找到帶有RpcReference和RpcService等注解的類,并將其注冊為spring bean或者RPC代理對象。

他結合了CustomScannerRegistrar,可以實現:

  • 自動將遠程服務接口注入為代理對象(如?@RpcReference)

  • 自動注冊本地服務實現為可被調用的 RPC 提供者(如?@RpcService)

下面逐行解析:

@Target里面定義了這個注解可以用在方法、接口和類上面,但實際操作中一般用在配置類上面(加了@Configuration注解用于配置Spring容器的類上面)

@Retention同上面,可以在運行時候通過反射拿到這個注解的屬性

@Import注解在配置中引入了CustomScannerRegistrar這個類,這個類是實現自定義掃描包的邏輯的,是一個實現了ImportBeanDefinitionRegistrar接口的類,用來動態注冊bean的定義

@Document表示加了這個注解的類會顯示在API文檔中

里面定義的屬性basePackage指定要掃描包的路徑

自定義掃描和服務發布的實現

CustomScannerRegistrar實現了spring的ImportBeanDefinitionRegistrar, ResourceLoaderAware接口

重寫了RegisterBeanDefinitions方法,spring在啟動時會調用這個方法,重寫后設置兩個自定義掃描器,掃描RpcService注解的類后,掃描Component注解的類保證其他基礎組件也能正常加載,掃描到指定類型后注冊成spring的bean

其實這里沒有對RpcService注解的類做特殊處理,可以自己加?

自定義一個類SpringBeanPostDefinition實現了BeanPostDefinition接口,這個接口用于對spring注冊后的bean做后處理。

重新實現這個接口的postProcessBeforeInitialization方法, spring會在每個bean初始化之前調用這個方法,對加了RpcService注解的類生成服務配置進行發布。發布服務就是將該bean的方法信息和netty通信的ip+端口地址拼成一個字符串,在zookeeper中作為一個持久化節點

重寫postProcessAfterInitialization這個接口,spring在每個bean初始化之后調用,通過反射獲取到這個類的所有字段,遍歷這些字段看是不是加了RpcReference字段,如果是的話那么這就是一個遠程服務的引用,然后去構建一個服務配置對象保存版本、分組等信息。

然后為這個字段的服務生成一個代理對象,默認情況下這些字段我們都會設置成private,所以要先將這個字段設置成可訪問并通過反射將代理對象賦值到這個字段,這樣當調用這個字段的方法時,就會通過代理對象遠程調用到服務的方法了。

使用代理對象是為了客戶端與具體服務解耦,讓客戶端感覺就像是在調用本地對象的方法一樣,不需要知道服務的具體位置、通信協議等細節信息,它只需要知道服務接口以及如何獲取代理對象即可。通過動態代理,在客戶端創建一個實現了遠程服務接口的代理對象。當客戶端調用該代理對象的方法時,代理會將方法調用轉換為網絡請求發送給遠程服務器,并處理響應返回給客戶端

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

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

相關文章

Web 3D可視化引擎HOOPS Communicator,高效賦能工業級應用開發!

在數字化轉型加速的今天,企業面臨著前所未有的挑戰——如何高效管理跨平臺的設計數據、提升團隊協作效率,并加快產品上市速度。HOOPS Communicator作為一款高性能的3D可視化與共享平臺,憑借其強大的兼容性、先進的3D渲染引擎和無縫的協作功能…

OceanBase數據庫遷移工具介紹和部署

OceanBase數據庫遷移工具介紹和部署核心組件遷移支持部署要求單節點部署查看日志OceanBase 遷移服務(OceanBase Migration Service, OMS)是OceanBase數據庫提供的一種支持同構或異構數據源與OceanBase數據庫之間進行數據交互的服務,具備在線遷…

棧與隊列:算法基礎的核心差異

理解棧和隊列的異同對打好算法基礎太重要了!它們都是編程和算法中無處不在的線性數據結構,核心區別在于操作數據的順序。下面我來幫大家清晰梳理它們的異同點:一、相同點都是線性數據結構:數據元素之間邏輯上呈現“一個接一個”的…

HCIA-生成數協議(STP)

前言:本博客僅作記錄學習使用,部分圖片出自網絡,如有侵犯您的權益,請聯系刪除 ? 本篇筆記是根據B站上的視頻教程整理而成,感謝UP主的精彩講解!如果需要了解更多細節,可以參考以下視頻&#xf…

基于內網穿透技術的Stable+Diffusion+3.5本地化部署與遠程圖像生成架構

文章目錄 前言1. 本地部署ComfyUI2. 下載 Stable Diffusion3.5 模型3. 演示文生圖4. 公網使用Stable Diffusion 3.5 大模型4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 在數字內容創作行業中,利用本地化服務器進行人工智能部署的策略正逐步成為優化制作…

私有云平臺實戰-OpenStack入門體驗

目錄 #1.1云計算概述 1.1.1什么是云計算 1.1.2云計算的服務模型 1.1.3OpenStack概述 #2.1OpenStack一鍵部署 2.1.1在線安裝 2.1.2使用本地倉庫離線安裝 2.1.3創建云主機 1.1云計算概述 云計算是一種基于互聯網的計算方式,通過網絡將共享的軟硬件資源和信息按需提供…

專題:2025即時零售與各類人群消費行為洞察報告|附400+份報告PDF、原數據表匯總下載

原文鏈接:https://tecdat.cn/?p42808 即時零售的崛起正在重塑消費市場的時間與空間邊界。從清晨的第一杯咖啡到深夜的應急零食,消費者的需求不再受限于傳統營業時間。與此同時,不同人群的消費習慣呈現出鮮明差異,Z世代沉迷線上娛…

【一起來學AI大模型】算法核心:數組/哈希表/樹/排序/動態規劃(LeetCode精練)

以下是五大核心算法的重點解析和LeetCode經典題解,包含最優解法和模板代碼:一、數組操作(雙指針/滑動窗口)核心思想:通過索引指針高效遍歷與操作數組1. 移動零(No.283)def moveZeroes(nums):slo…

CSS之基礎語法一文全解析

CSS之基礎語法一文全解析 一、CSS語法核心結構:選擇器聲明塊1.1 基礎語法模板1.2 關鍵組成部分 二、選擇器全解析:精準定位目標元素2.1 基礎選擇器(必掌握)2.1.1 標簽選擇器(類型選擇器)2.1.2 類選擇器&…

vue 前端動態導入文件 import.meta.glob 導入圖片

背景: 在開發過程中,前端會引入資源文件,這里主要是引入圖片。在開發環境,導入的圖片顯示正常,但是打包部署后,導入的圖片就不能正常顯示。 原因分析,可能有如下幾點: 1.圖片不能顯示…

RocketMQ-Dashboard頁面報Failed to fetch ops home page data錯誤

今天安裝RocketMQ-Dashboard,訪問主頁,頁面彈框提示Failed to fetch ops home page data,F12發現控制臺輸出網絡請求跨域。解決:不要用127.0.0.1訪問,用localhost就不報錯了

0704-0706上海,又聚上了

上次,還是0413,當時寫了一篇,下次相見是何時?也鼓勵自己下次相見是找到工作(實習也算),沒想到真找到了,DW App 說到實習,其實沒認真投遞很多,互聯網公司除了阿…

【win電腦-程序CMD自啟動問題-開機就自啟動-查找原因-解決方式】

【win電腦-程序CMD自啟動問題-開機就自啟動-查找原因-解決方式】 1,情況說明:2,問題描述1-這是什么窗口 2-原因分析:3-我的努力-嘗試解決:1,任務管理器中查看狀態2,查看啟動文件夾3,…

Go語言實現雙Token登錄的思路與實現

Go語言實現雙Token登錄的思路與實現 引言 在現代Web應用中,身份認證是保障系統安全的重要環節。傳統的單Token認證方式存在一些安全隱患,如Token泄露可能導致長期風險。雙Token機制(Access Token Refresh Token)提供了更好的安全…

映射阿里云OSS(對象存儲服務)

參考:使用阿里云進行OSS對象存儲(超詳細) 一文掌握SpringBoot注解之Component 知識文集(1) ConfigurationProperties注解原理與實戰 1.配置屬性類 AliOssProperties package com.sky.properties;import lombok.Data; import org.springframe…

Java操作word實戰

文章目錄簡介段落頁頭與頁腳頁碼表格圖片批注文本框目錄圖表簡介 Word編程最重要的類是org.apache.poi.xwpf.usermodel.XWPFDocument。涉及的東西十分復雜。而且Apache poi操作word的技術非常不成熟。代碼中本身有很多bug。 ??Maven的依賴為 <dependency><groupId&…

【Flask】flask中get方法和post方法區別

對于post和get在我以前的認知下一直認為是&#xff1a; 前端發送給后端就稱為post 前端需要從后端返回就用get 但是在開發過程中發現了不僅僅如此 區別 GET 意圖&#xff1a;獲取&#xff08;GET&#xff09; 信息。你只是想讀取服務器上已經存在的資源&#xff0c;你不打算改變…

Linux sudo升級

應對 Linux sudo 本地提權漏洞&#xff1a;離線升級 Sudo 到安全版本 一、引言 在 Linux 系統中&#xff0c;sudo&#xff08;superuser do&#xff09;是一個非常重要的工具&#xff0c;它允許授權用戶以超級用戶&#xff08;root&#xff09;的權限執行命令。然而&#xff0c…

ubuntu 6.8.0 安裝xenomai3.3

通過以下步驟來獲取和準備 Linux 內核 6.8.0 的源碼&#xff0c;并應用 Xenomai 補丁&#xff1a; 1. 下載 Linux 內核 6.8.0 源碼 你可以從 The Linux Kernel Archives 下載 Linux 內核 6.8.0 的源碼。以下是具體步驟&#xff1a; 訪問內核官方網站&#xff1a; 打開 The Li…

drawRect 觸發時機

在 iOS 開發中&#xff0c;UIView 的 drawRect: 方法&#xff08;或其底層 CALayer 的繪制&#xff09;的觸發時機是由系統控制的&#xff0c;開發者不能直接調用這些方法。以下是觸發視圖繪制的完整機制&#xff1a;一、核心觸發時機 1. 視圖首次顯示 當視圖被添加到視圖層級時…