本文主要介绍“如何通过API使用dubbo广义调用”。在日常操作中,相信很多人对于如何通过API使用dubbo广义调用都有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“如何通过API使用dubbo广义调用”的疑惑!接下来,请和边肖一起学习!
泛化是啥?
官网说明:通用接口调用方法主要用于客户端没有API接口和模型类元素的时候。参数和返回值中的所有POJO都用Map表示,Map通常用于框架集成,例如实现一个通用的服务测试框架,可以通过GenericService调用所有的服务实现。
我跑去问组长,那天他们对泛化怎么说?我们应该用什么场景?
一般化意味着你不知道你不关心底层实现,你只需要在接口和参数上达成一致,实现由底层实现。然而,这样一来,可扩展性和可用性都非常低。为什么不约定一个接口,提供商在ZK注册,消费者去ZK拉,或者干脆提供一个jar包,然后通过普通注册调用?
至于场景,因为暂时访问的第三方数据服务不能直接调用,我们在他们之间提供了一个接口,他们实现了。
00-1010在Spring配置中声明泛型=“真”:
Dubo:引用ID=' barService '接口=' com.foo.barservice '泛型=' true '/在Java代码中获取barService并启动一般化调用:
generic service bar service=(generic service)application context . getbean(' bar service ');
对象结果=barService。$invoke('sayHello ',new String[]{ ' Java . lang . String ' },new Object[]
通过 Spring 使用泛化调用
import org . Apache . dubbo . RPC . service . generic ServiCe;
.
//引用远程服务
//这个例子很重。它封装了与注册表和服务提供者的所有连接。请缓存它。
ReferenceConfigGenericService reference=new ReferenceConfigGenericService();
//弱类型接口名称
reference . setinterface(' com . XXX . xxxservice ');
reference . setversion(' 1 . 0 . 0 ');
//声明为通用接口
reference . setgeneric(true);
//所有接口引用都可以用org . Apache . dubbo . RPC . service . generic service替换。
generic service generic service=reference . get();
//基本类型、日期、列表、地图等。无需转换即可直接调用。
对象结果=genericService。$invoke('sayHello ',new String[]{ ' Java . lang . String ' },new Object[]{ ' world ' });
POJO参数由Map表示。如果返回值是POJO,将自动转换为Map。
MapString,Object person=new HashMapString,Object();
person.put('name ',' XXX ');
person.put('password ',' yyy ');
//如果返回POJO,将自动转换为Map。
对象结果=genericService。$invoke('findPerson ',新字符串[]
{'com.xxx.Person'},新对象[]{ 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泛化调用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147021.html