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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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. 视图首次显示 当视图被添加到视图层级时…