中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

如何在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

抚顺市| 饶平县| 呼图壁县| 河西区| 株洲县| 惠东县| 宁远县| 湖南省| 郓城县| 金湖县| 尚志市| 定西市| 东至县| 武强县| 常德市| 宣武区| 汶上县| 高台县| 迁西县| 龙岩市| 宁陕县| 隆德县| 高雄县| 同江市| 茌平县| 开阳县| 金塔县| 合阳县| 九寨沟县| 且末县| 嘉峪关市| 加查县| 博白县| 滕州市| 四子王旗| 河北区| 阿合奇县| 堆龙德庆县| 乐山市| 伽师县| 肇源县|