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

溫馨提示×

溫馨提示×

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

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

如何通過API方式使用dubbo泛化調用

發布時間:2021-12-15 15:01:10 來源:億速云 閱讀:282 作者:iii 欄目:大數據

這篇文章主要介紹“如何通過API方式使用dubbo泛化調用”,在日常操作中,相信很多人在如何通過API方式使用dubbo泛化調用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何通過API方式使用dubbo泛化調用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    泛化是啥?

    官網解釋:泛化接口調用方式主要用于客戶端沒有 API 接口及模型類元的情況,參數及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:實現一個通用的服務測試框架,可通過 GenericService 調用所有服務實現。

我跑去問組長,他們那天說的泛化是啥?我們什么場景要用啊?

泛化就是你不知道你不關心下層實現,只需要約定接口及參數,實現由下層實現,但是這樣一來擴展性和可用性極低,不如你約定一個接口,提供方注冊到ZK上,消費方去ZK去拉,或者干脆提供個jar包,然后通過普通的注冊去調用就可以。

至于場景是因為臨時接入的第三方數據服務,不能直接調用,我們中間提供了接口,實現是他們實現的。

通過 Spring 使用泛化調用

在 Spring 配置申明 generic="true"

<dubbo:reference id="barService" interface="com.foo.BarService" generic="true" />

在 Java 代碼獲取 barService 并開始泛化調用:

GenericService barService = (GenericService) applicationContext.getBean("barService");
Object result = barService.$invoke("sayHello", new String[] { "java.lang.String" }, new Object[]

通過 API 方式使用泛化調用

import org.apache.dubbo.rpc.service.GenericService;
...

// 引用遠程服務
// 該實例很重量,里面封裝了所有與注冊中心及服務提供方連接,請緩存
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
// 弱類型接口名
reference.setInterface("com.xxx.XxxService");
reference.setVersion("1.0.0");
// 聲明為泛化接口
reference.setGeneric(true);

// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
GenericService genericService = reference.get();

// 基本類型以及Date,List,Map等不需要轉換,直接調用
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});

// 用Map表示POJO參數,如果返回值為POJO也將自動轉成Map
Map<String, Object> person = new HashMap<String, Object>();
person.put("name", "xxx");
person.put("password", "yyy");
// 如果返回POJO將自動轉成Map
Object result = genericService.$invoke("findPerson", new String[]
{"com.xxx.Person"}, new Object[]{person});

...

泛化的實現

通過 API 方式暴露泛化實現

...
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口實現
GenericService xxxService = new XxxGenericService();

// 該實例很重量,里面封裝了所有與注冊中心及服務提供方連接,請緩存
ServiceConfig<GenericService> service = new ServiceConfig<GenericService>();
// 弱類型接口名
service.setInterface("com.xxx.XxxService");
service.setVersion("1.0.0");
// 指向一個通用服務實現
service.setRef(xxxService);

// 暴露及注冊服務
service.export();

注冊到ZK實現

public static void main(String[] args) {        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();        // 當前dubbo consumer的application配置,不設置會直接拋異常        ApplicationConfig applicationConfig = new ApplicationConfig();        applicationConfig.setName("xxx_test_service");        // 注冊中心配置        RegistryConfig registryConfig = new RegistryConfig();        // 注冊中心這里需要配置上注冊中心協議,例如下面的zookeeper        registryConfig.setAddress("zookeeper://127.0.0.1:2181");        registryConfig.setGroup("test_group");        reference.setApplication(applicationConfig);        reference.setRegistry(registryConfig);        // 設置調用的reference屬性,下面只設置了協議、接口名、版本、超時時間        reference.setProtocol("dubbo");        //約定接口        reference.setInterface("com.xxx.test.TestService");        reference.setVersion("1.0.0");        reference.setTimeout(1000);        // 聲明為泛化接口        reference.setGeneric(true);        // GenericService可以接住所有的實現        GenericService genericService = reference.get();        // 構造復雜參數,下面的示例中,頭兩個參數為string類型,后一個是一個復雜類型,但都可以通過map構造。        Map<String, Object> param = new HashMap<>();        param.put("test1", "a");        param.put("test2", "b");        Map<String,Object> thirdParam = new HashMap<>();        thirdParam.put("class","java.util.Map");        thirdParam.put("subParam1","c");        thirdParam.put("subParam2","d");        param.put("test3",thirdParam);        Object result = genericService.$invoke("myMethod", new String[]{"java.lang.String", "java.lang.String", "com.xxxtest.MyParam"}, new Object[]{"123", "ddd",param});        System.out.println(JSON.toJSONString(result));    }

到此,關于“如何通過API方式使用dubbo泛化調用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

柘荣县| 酉阳| 安国市| 桂阳县| 谷城县| 宾阳县| 三穗县| 南溪县| 合山市| 沽源县| 河池市| 安仁县| 双鸭山市| 淳安县| 府谷县| 咸阳市| 乌什县| 峨眉山市| 鄢陵县| 扬中市| 阳西县| 洛川县| 同仁县| 阿巴嘎旗| 蚌埠市| 邯郸市| 阿荣旗| 巴彦淖尔市| 济宁市| 时尚| 曲周县| 石渠县| 自治县| 武功县| 赣州市| 神池县| 甘谷县| 郸城县| 芒康县| 凤庆县| 西丰县|