分布式系统的跟踪系统Dubbo RPC处理

Beaver_ 发布于 2015/10/12 21:58
阅读 4K+
收藏 2

分布式系统的跟踪系统Dubbo RPC处理

   接着前一篇博文http://blog.csdn.net/doctor_who2004/article/details/46974695      

    上篇只是提供了一个思想,今天具体给出dubbo rpc 处理细节。

   dubbo prc处理部分,那就是dubbo 的filter 扩展。dubbo 的filter 接口:

  1. /* 
  2.  * Copyright 1999-2011 Alibaba Group. 
  3.  *   
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  *   
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  *   
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16. package com.alibaba.dubbo.rpc;  
  17.   
  18. import com.alibaba.dubbo.common.extension.SPI;  
  19.   
  20. /** 
  21.  * Filter. (SPI, Singleton, ThreadSafe) 
  22.  *  
  23.  * @author william.liangf 
  24.  */  
  25. @SPI  
  26. public interface Filter {  
  27.   
  28.     /** 
  29.      * do invoke filter. 
  30.      *  
  31.      * <code> 
  32.      * // before filter 
  33.      * Result result = invoker.invoke(invocation); 
  34.      * // after filter 
  35.      * return result; 
  36.      * </code> 
  37.      *  
  38.      * @see com.alibaba.dubbo.rpc.Invoker#invoke(Invocation) 
  39.      * @param invoker service 
  40.      * @param invocation invocation. 
  41.      * @return invoke result. 
  42.      * @throws RpcException 
  43.      */  
  44.     Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException;  
  45.   
  46. }  

因为,这个过滤器里面只有一个方法,所以,我们如何在prc通信中,传递我们需要的东西呢,那就是看这个方法了。


可以参看dubbo 官方文档,我们要看的就是com.alibaba.dubbo.rpc.Invocation:


  1. /* 
  2.  * Copyright 1999-2011 Alibaba Group. 
  3.  *   
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  * you may not use this file except in compliance with the License. 
  6.  * You may obtain a copy of the License at 
  7.  *   
  8.  *      http://www.apache.org/licenses/LICENSE-2.0 
  9.  *   
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, 
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  13.  * See the License for the specific language governing permissions and 
  14.  * limitations under the License. 
  15.  */  
  16. package com.alibaba.dubbo.rpc;  
  17.   
  18. import java.util.Map;  
  19.   
  20. /** 
  21.  * Invocation. (API, Prototype, NonThreadSafe) 
  22.  *  
  23.  * @serial Don't change the class name and package name. 
  24.  * @see com.alibaba.dubbo.rpc.Invoker#invoke(Invocation) 
  25.  * @see com.alibaba.dubbo.rpc.RpcInvocation 
  26.  * @author qian.lei 
  27.  * @author william.liangf 
  28.  */  
  29. public interface Invocation {  
  30.   
  31.     /** 
  32.      * get method name. 
  33.      *  
  34.      * @serial 
  35.      * @return method name. 
  36.      */  
  37.     String getMethodName();  
  38.   
  39.     /** 
  40.      * get parameter types. 
  41.      *  
  42.      * @serial 
  43.      * @return parameter types. 
  44.      */  
  45.     Class<?>[] getParameterTypes();  
  46.   
  47.     /** 
  48.      * get arguments. 
  49.      *  
  50.      * @serial 
  51.      * @return arguments. 
  52.      */  
  53.     Object[] getArguments();  
  54.   
  55.     /** 
  56.      * get attachments. 
  57.      *  
  58.      * @serial 
  59.      * @return attachments. 
  60.      */  
  61.     Map<String, String> getAttachments();  
  62.       
  63.     /** 
  64.      * get attachment by key. 
  65.      *  
  66.      * @serial 
  67.      * @return attachment value. 
  68.      */  
  69.     String getAttachment(String key);  
  70.       
  71.     /** 
  72.      * get attachment by key with default value. 
  73.      *  
  74.      * @serial 
  75.      * @return attachment value. 
  76.      */  
  77.     String getAttachment(String key, String defaultValue);  
  78.   
  79.     /** 
  80.      * get the invoker in current context. 
  81.      *  
  82.      * @transient 
  83.      * @return invoker. 
  84.      */  
  85.     Invoker<?> getInvoker();  
  86.   
  87. }  

我们看一下这个接口的实现类:com.alibaba.dubbo.rpc.RpcInvocation:

这个类里面有几个方法:setAttachment、getAttachment等,是我们自定义传递RPC参数的地方。


所以,利用好这几个方法,我们就可以在Dubbo prc 网络通信中,传递我们需要传递的信息,当然,在本文中,指的是跟踪用的对象结构(能把调用链还原成树形结构的数据结构)。

当然,我们可以利用filter保存或打印出一些信息,比如方法名、传递参数名、prc返回结果及异常信息:例如

  1.             log.info("[{}] , [{}], [{}], {}, [{}], [{}], [{}ms]   ", uuid, invoker.getInterface(),   
  2. invocation.getMethodName(),  
  3.  Arrays.toString(invocation.getArguments()),  
  4.  result.getValue(),   
  5. result.getException(), elapsed);  

具体实现就不贴代码了。

版权声明:本文为博主原创文章,未经博主允许不得转载[http://blog.csdn.net/doctor_who2004]。



来源:我的CSDN博客

加载中
0
许雪里
许雪里
不错,后面可以把dubbo的http和nio协议详细讲一下;
Beaver_
Beaver_
有时间可以看看源码。然后写下来。呵呵。
返回顶部
顶部