Dubbo源码解析(十九)Dubbo 泛化引用

秒速五厘米 2021-12-01 15:28 401阅读 0赞

泛化引用的一个例子

  1. public static void main(String[] args) throws InterruptedException {
  2. // 当前应用配置
  3. ApplicationConfig application = new ApplicationConfig();
  4. application.setName("generic-reference-app");
  5. // 连接注册中心配置
  6. RegistryConfig registry = new RegistryConfig();
  7. registry.setAddress("zookeeper:2181");
  8. registry.setProtocol("zookeeper");
  9. registry.setClient("zkclient");
  10. // 引用远程服务
  11. ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
  12. reference.setInterface("com.wuhulala.dubbo.user.service.MyGenericService");
  13. reference.setApplication(application);
  14. reference.setRegistry(registry);
  15. //reference.setVersion("1.0.0");
  16. reference.setRetries(0);
  17. reference.setGeneric(true);
  18. GenericService genericService = reference.get();
  19. Object result = genericService.$invoke("sayHello", new String[]{ "java.lang.String"}, new Object[]{ "world"});
  20. System.out.println("==========================");
  21. System.out.println(result);
  22. System.out.println("==========================");
  23. Thread.sleep(100000);
  24. }
  1. 先把消费者注册到注册中心,并且这个已经被改变为和正常注册的消费者了

consumer://10.0.75.1/com.alibaba.dubbo.rpc.service.GenericService?application=generic-reference-app&category=consumers&check=false&dubbo=2.5.3&generic=true&interface=com.wuhulala.dubbo.user.service.MyGenericService&pid=20744&retries=0&side=consumer&timestamp=1542551437436

==>

/dubbo/com.wuhulala.dubbo.user.service.MyGenericService/consumers/consumer%3A%2F%2F10.0.75.1%2Fcom.alibaba.dubbo.rpc.service.GenericService%3Fapplication%3Dgeneric-reference-app%26category%3Dconsumers%26check%3Dfalse%26dubbo%3D2.5.3%26generic%3Dtrue%26interface%3Dcom.wuhulala.dubbo.user.service.MyGenericService%26pid%3D20744%26retries%3D0%26side%3Dconsumer%26timestamp%3D1542551437436

在这里插入图片描述
经过toCategoryPath 转换为如下

在这里插入图片描述
其中的获取服务的代码如下

  1. public String getServiceInterface() {
  2. return getParameter(Constants.INTERFACE_KEY, path);
  3. }

类别是consumers

在这里插入图片描述
可以看到本来生成的第一段里面的interface就是一开始有Refrence生成的url的。

这一段的toUrlPath的目的是为了找到需要注册在zookeeper的节点。
所以泛型调用最终的注册到注册中心的地址还是在对应的服务上

在这里插入图片描述
节点的数据就是Refrence刚才生成的那段url的罢了

然后客户端在调用的时候再和服务端建立连接,进行远程调用。

那么以上的流程在客户端是如何实现的呢?

那么就要看看客户端的GenericFilter

GenericImplFilter#invoke

  1. // 如果是泛化引用
  2. if (ProtocolUtils.isGeneric(generic)
  3. && (!$INVOKE.equals(invocation.getMethodName()) && !$INVOKE_ASYNC.equals(invocation.getMethodName()))
  4. && invocation instanceof RpcInvocation) {
  5. RpcInvocation invocation2 = new RpcInvocation(invocation);
  6. String methodName = invocation2.getMethodName();
  7. Class<?>[] parameterTypes = invocation2.getParameterTypes();
  8. Object[] arguments = invocation2.getArguments();
  9. String[] types = new String[parameterTypes.length];
  10. for (int i = 0; i < parameterTypes.length; i++) {
  11. types[i] = ReflectUtils.getName(parameterTypes[i]);
  12. }
  13. Object[] args;
  14. // 如果指定了序列化方式
  15. if (ProtocolUtils.isBeanGenericSerialization(generic)) {
  16. args = new Object[arguments.length];
  17. // 序列化
  18. for (int i = 0; i < arguments.length; i++) {
  19. args[i] = JavaBeanSerializeUtil.serialize(arguments[i], JavaBeanAccessor.METHOD);
  20. }
  21. } else {
  22. // 使用默认序列化方式
  23. args = PojoUtils.generalize(arguments);
  24. }
  25. // 如果是需要返回的,设置MethodName
  26. if (RpcUtils.isReturnTypeFuture(invocation)) {
  27. invocation2.setMethodName($INVOKE_ASYNC);
  28. } else {
  29. invocation2.setMethodName($INVOKE);
  30. }
  31. invocation2.setParameterTypes(GENERIC_PARAMETER_TYPES);
  32. invocation2.setArguments(new Object[]{ methodName, types, args});
  33. return invoker.invoke(invocation2);
  34. }

可以看到这里,主要做了以下几步的事情

  1. 如果是泛化引用,首先进行拆包,获取方法名称、参数类型、参数值
  2. 把参数序列化
  3. 执行

发表评论

表情:
评论列表 (有 0 条评论,401人围观)

还没有评论,来说两句吧...

相关阅读

    相关 dubbo解析-LoadBalance

    Dubbo源码解析系列文章均来自肥朝简书 前言 终于到了集群容错中的最后一个关键词,也就是`LoadBalance(负载均衡)`,负载均衡必然会涉及一些算法.但是也不用

    相关 dubbo解析-cluster

    Dubbo源码解析系列文章均来自肥朝简书 前言 今天是小长假的倒数第二天,本来国庆是要加班四天的,后来因为要有事要回家才得以幸免,但是后天上班之后都要搬砖搬到手脱皮是必

    相关 dubbo解析-router

    Dubbo源码解析系列文章均来自肥朝简书 前言 估算了一下,`dubbo`里面涉及的东西还是比较多的.比如谈到框架的时候,设计模式都是一个老生常谈的话题,再比如我们开发

    相关 dubbo解析-directory

    Dubbo源码解析系列文章均来自肥朝简书 前言 由于明天还要加班(心疼自己一秒),之前答应过小伙伴每周更新一篇dubbo的源码解析的,鉴于上次讲到了集群容错的总体架构,