如何在Dubbo拦截器中拿到Invoker的引用对象
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍"如何在Dubbo拦截器中拿到Invoker的引用对象",在日常操作中,相信很多人在如何在Dubbo拦截器中拿到Invoker的引用对象问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2025年01月31日如何在Dubbo拦截器中拿到Invoker的引用对象
这篇文章主要介绍"如何在Dubbo拦截器中拿到Invoker的引用对象",在日常操作中,相信很多人在如何在Dubbo拦截器中拿到Invoker的引用对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何在Dubbo拦截器中拿到Invoker的引用对象"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
本文基于Dubbo 2.7.8。
当我们自定义Dubbo拦截器的时,有时候想要拿到代理对象(这里的代理对象是指Spring容器中的实际对象,可能已经被Cglib或Jdk代理),这里提供一种简单可行的方案。目前2.7.5及以上版本可用
先来看一下Dubbo服务导出的调用链:
//导出所有服务private void exportServices() { configManager.getServices().forEach(sc -> { // TODO, compatible with ServiceConfig.export() ServiceConfig serviceConfig = (ServiceConfig) sc; serviceConfig.setBootstrap(this); if (exportAsync) { ExecutorService executor = executorRepository.getServiceExporterExecutor(); Future> future = executor.submit(() -> { sc.export(); exportedServices.add(sc); }); asyncExportingFutures.add(future); } else { sc.export(); exportedServices.add(sc); } }); }//单个服务导出public synchronized void export() //是否需要导出 if (!shouldExport()) { return; } checkAndUpdateSubConfigs(); doExport(); exported(); }protected synchronized void doExport() { if (exported) { return; } exported = true; if (StringUtils.isEmpty(path)) { path = interfaceName; } doExportUrls(); }private void doExportUrls() { //这里是重点 ServiceRepository repository = ApplicationModel.getServiceRepository(); ServiceDescriptor serviceDescriptor = repository.registerService(getInterfaceClass()); repository.registerProvider( getUniqueServiceName(), ref, serviceDescriptor, this, serviceMetadata ); }//注册提供者public void registerProvider(String serviceKey, Object serviceInstance, ServiceDescriptor serviceModel, ServiceConfigBase> serviceConfig, ServiceMetadata serviceMetadata) { ProviderModel providerModel = new ProviderModel(serviceKey, serviceInstance, serviceModel, serviceConfig, serviceMetadata);//key为serviceKey providers.putIfAbsent(serviceKey, providerModel); providersWithoutGroup.putIfAbsent(keyWithoutGroup(serviceKey), providerModel); }
可以看到在Dubbo服务导出的时候会向ServiceRepository注册服务信息,而我们在Filter中可以通过Invocation的getTargetServiceUniqueName拿到serviceKey。
结果显而易见:
直接通过以下方式就可以拿到代理对象:
ProviderModel providerModel = ApplicationModel.getServiceRepository().lookupExportedService(invocation.getTargetServiceUniqueName());
System.out.println(providerModel.getServiceInstance().getClass());
到此,关于"如何在Dubbo拦截器中拿到Invoker的引用对象"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
对象
拦截器
服务
代理
学习
更多
帮助
可行
实用
显而易见
接下来
信息
单个
可以通过
实际
容器
提供者
文章
方式
方案
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何体现数据运行的网络安全性
数据库的重构技术是什么
生物医药数据库行业分析
网络安全法监督
数据库技术学分是多少
手机网络安全教育策划
数据库需求分析步骤
12月23日网络安全大会
无锡千手网络技术
机电系统网络安全应急预案
漫画说网络安全法二十六
魔兽服务器登录以后怎么开始打
为什么相当软件开发
腾讯云服务器部署个人项目
东北网络安全宣传
福建iosapp软件开发
excel实时保存到数据库
代理web服务器的
互联网科技公司有哪些业务
互联网 硬科技
网络安全对我们的影响大学ppt
ssl错误无法建立与服务器安全
陕西科技大学互联网加
为什么相当软件开发
武汉移动网络技术待遇
公安网络安全的文
海淀区企业软件开发多少钱
数据库怎么降低余度
物联网网络安全厂商
山西软件开发品质售后无忧