91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

竹溪县| 东海县| 威信县| 翁源县| 湟中县| 留坝县| 尉犁县| 迭部县| 兴安县| 彭山县| 建湖县| 轮台县| 鹤壁市| 本溪市| 柳河县| 凤山县| 灯塔市| 华亭县| 七台河市| 莲花县| 慈利县| 元氏县| 绥芬河市| 中方县| 德格县| 莱州市| 郯城县| 宝丰县| 桂阳县| 竹山县| 彭泽县| 丰镇市| 鄂伦春自治旗| 榆树市| 进贤县| 齐齐哈尔市| 周宁县| 莫力| 新龙县| 永安市| 康定县|