亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Dubbo攔截器中拿到Invoker的引用對象

發布時間:2021-09-14 22:53:25 來源:億速云 閱讀:202 作者:chen 欄目:云計算

這篇文章主要介紹“如何在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的引用對象”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普陀区| 九龙城区| 苏尼特右旗| 绥阳县| 遵义市| 株洲市| 阳春市| 白河县| 波密县| 墨脱县| 吉水县| 阿荣旗| 丰宁| 通山县| 全椒县| 万源市| 温州市| 犍为县| 莱州市| 武威市| 浙江省| 临桂县| 庄浪县| 抚远县| 淮阳县| 泾阳县| 长阳| 定州市| 阜新市| 辽宁省| 郎溪县| 南乐县| 江永县| 五莲县| 南昌市| 八宿县| 繁昌县| 尉氏县| 平果县| 民勤县| 德令哈市|