這篇文章主要介紹“如何通過API方式使用dubbo泛化調(diào)用”,在日常操作中,相信很多人在如何通過API方式使用dubbo泛化調(diào)用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何通過API方式使用dubbo泛化調(diào)用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了巴州免費建站歡迎大家使用!
泛化是啥?
官網(wǎng)解釋:泛化接口調(diào)用方式主要用于客戶端沒有 API 接口及模型類元的情況,參數(shù)及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:實現(xiàn)一個通用的服務(wù)測試框架,可通過 GenericService 調(diào)用所有服務(wù)實現(xiàn)。
我跑去問組長,他們那天說的泛化是啥?我們什么場景要用???
泛化就是你不知道你不關(guān)心下層實現(xiàn),只需要約定接口及參數(shù),實現(xiàn)由下層實現(xiàn),但是這樣一來擴展性和可用性極低,不如你約定一個接口,提供方注冊到ZK上,消費方去ZK去拉,或者干脆提供個jar包,然后通過普通的注冊去調(diào)用就可以。
至于場景是因為臨時接入的第三方數(shù)據(jù)服務(wù),不能直接調(diào)用,我們中間提供了接口,實現(xiàn)是他們實現(xiàn)的。
在 Spring 配置申明 generic="true"
:
在 Java 代碼獲取 barService 并開始泛化調(diào)用:
GenericService barService = (GenericService) applicationContext.getBean("barService");
Object result = barService.$invoke("sayHello", new String[] { "java.lang.String" }, new Object[]
import org.apache.dubbo.rpc.service.GenericService;
...
// 引用遠程服務(wù)
// 該實例很重量,里面封裝了所有與注冊中心及服務(wù)提供方連接,請緩存
ReferenceConfig reference = new ReferenceConfig();
// 弱類型接口名
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等不需要轉(zhuǎn)換,直接調(diào)用
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});
// 用Map表示POJO參數(shù),如果返回值為POJO也將自動轉(zhuǎn)成Map
Map person = new HashMap();
person.put("name", "xxx");
person.put("password", "yyy");
// 如果返回POJO將自動轉(zhuǎn)成Map
Object result = genericService.$invoke("findPerson", new String[]
{"com.xxx.Person"}, new Object[]{person});
...
泛化的實現(xiàn)
...
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口實現(xiàn)
GenericService xxxService = new XxxGenericService();
// 該實例很重量,里面封裝了所有與注冊中心及服務(wù)提供方連接,請緩存
ServiceConfig service = new ServiceConfig();
// 弱類型接口名
service.setInterface("com.xxx.XxxService");
service.setVersion("1.0.0");
// 指向一個通用服務(wù)實現(xiàn)
service.setRef(xxxService);
// 暴露及注冊服務(wù)
service.export();
注冊到ZK實現(xiàn)
public static void main(String[] args) { ReferenceConfigreference = new ReferenceConfig (); // 當(dāng)前dubbo consumer的application配置,不設(shè)置會直接拋異常 ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("xxx_test_service"); // 注冊中心配置 RegistryConfig registryConfig = new RegistryConfig(); // 注冊中心這里需要配置上注冊中心協(xié)議,例如下面的zookeeper registryConfig.setAddress("zookeeper://127.0.0.1:2181"); registryConfig.setGroup("test_group"); reference.setApplication(applicationConfig); reference.setRegistry(registryConfig); // 設(shè)置調(diào)用的reference屬性,下面只設(shè)置了協(xié)議、接口名、版本、超時時間 reference.setProtocol("dubbo"); //約定接口 reference.setInterface("com.xxx.test.TestService"); reference.setVersion("1.0.0"); reference.setTimeout(1000); // 聲明為泛化接口 reference.setGeneric(true); // GenericService可以接住所有的實現(xiàn) GenericService genericService = reference.get(); // 構(gòu)造復(fù)雜參數(shù),下面的示例中,頭兩個參數(shù)為string類型,后一個是一個復(fù)雜類型,但都可以通過map構(gòu)造。 Map param = new HashMap<>(); param.put("test1", "a"); param.put("test2", "b"); Map 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)); }
到此,關(guān)于“如何通過API方式使用dubbo泛化調(diào)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站標題:如何通過API方式使用dubbo泛化調(diào)用
網(wǎng)頁地址:http://weahome.cn/article/gjgjic.html