Java知识分享
热爱技术,分享技术

Dubbo服务三种泛化调用模式

在前面的文章中,我们说到消费者要消费服务提供者的服务时,需要引用提供者的rpc包,其中存放着提供者的一些接口或者POJO类。

泛化接口调用方式主要在服务消费者没有API接口类型单元的情况下使用,其参数及返回值没有对应的POJO类,所以所有POJO参数转换为Map表示,使用泛化调用时,服务消费者不需要再引入第三方jar包。

公共消费者调用代码如下:

public static <T> ReferenceConfig<T> referenceConfig() {
//创建引用实例,并设置属性
ReferenceConfig<T> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
reference.setInterface("cn.hackcloud.demo.dubbo.rpc.IUserService");
reference.setGroup("hackcloud");
reference.setVersion("1.0");
return reference;
}

static void print(Object o) {
System.out.println(JSON.toJSONString(o));
}

1. generic=true 方式

ReferenceConfig<GenericService> reference = referenceConfig();
reference.setGeneric(true);
GenericService userService = reference.get();
Map<String, Object> map = new HashMap<>(2);
map.put("userId", "1");
Object o = userService.$invoke("sync", new String[]{"java.lang.String"}, new Object[]{"1"});
print(o);

在泛型调用时,泛型参数固定为GenericService,使用setGeneric设置泛化调用类型为true,使用GenericService userService = reference.get();获取引用,注意泛化值类型固定为GenericService。

使用userService.$invoke()方法,其中起一个参数为方法名,第二个参数为调用类型,第三个参数为参数的值。

2. generic=bean方式

/**
* 泛化调用 bean
*/
public static void genericBean() {
ReferenceConfig<GenericService> reference = referenceConfig();
reference.setGeneric("bean");
GenericService userService = reference.get();
JavaBeanDescriptor param = JavaBeanSerializeUtil.serialize("1");
Object o = userService.$invoke("sync", new String[]{"java.lang.String"}, new Object[]{param});
print(JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) o));
}
使用reference.setGeneric("bean")设置了泛型的调用方式为bean,这意味着对参数使用javabean方式进行序列化,使用JavaBeanSerializeUtil工具类对参数进行序列化,然后把序列化的结果作为第三个参数,最后执行泛化调用。

JavaBeanSerializeUtil.deserialize方法对结果进行反序列化,因为服务提供方会对返回结果进行序列化。

3. generic=nativejava方式

/**
* 泛化调用 nativeJava
*/
public static void genericNativeJava() throws IOException, ClassNotFoundException {
ReferenceConfig<GenericService> reference = referenceConfig();
reference.setGeneric("nativejava");
GenericService userService = reference.get();
UnsafeByteArrayOutputStream os = new UnsafeByteArrayOutputStream();
//序列化为二进制数据
ExtensionLoader.getExtensionLoader(Serialization.class).getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.serialize(null, os)
.writeObject("1");
Object o = userService.$invoke("sync", new String[]{"java.lang.String"}, new Object[]{os.toByteArray()});
UnsafeByteArrayInputStream in = new UnsafeByteArrayInputStream((byte[]) o);
Object o1 = ExtensionLoader.getExtensionLoader(Serialization.class).getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.deserialize(null, in).readObject();
print(o1);
}

使用reference.setGeneric(“nativejava”);方式进行序列化,使用nativejava把参数对象序列化,然后把序列化结果作为第三个参数。最后执行泛化调用。

打赏
本站所有资源均来源于网络,仅供学习使用,请支持正版!Java技术开源 » Dubbo服务三种泛化调用模式

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册