您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何在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的引用對象”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。