Dubbo系列-编解码
Dubbo系列 - 编解码在分析请求编码逻辑之前,我们先来看一下 Dubbo 数据包结构。
Dubbo 数据包分为消息头和消息体,消息头用于存储一些元信息,比如魔数(Magic),数据包类型(Request/Response),消息体长度(Data Length)等。消息体中用于存储具体的调用消息,比如方法名称,参数列表等。下面简单列举一下消息头的内容。
偏移量(Bit)
字段
取值
0 ~ 7
魔数高位
0xda00
8 ~ 15
魔数低位
0xbb
16
数据包类型
0 - Response, 1 - Request
17
调用方式
仅在第16位被设为1的情况下有效,0 - 单向调用,1 - 双向调用
18
事件标识
0 - 当前数据包是请求或响应包,1 - 当前数据包是心跳包
19 ~ 23
序列化器编号
2 - Hessian2Serialization 3 - JavaSerialization 4 - CompactedJavaSerialization 6 - FastJsonSerialization 7 - NativeJavaSer ...
Dubbo系列 - QOS
Dubbo系列 - QOSQOS是Dubbo在2.5.8加入的新的telnet命令,具体使用方式可以看官方文档:在线运维命令 - QOS
QOS服务启动的入口在QosProtocolWrapper,QosProtocolWrapper是Protocol的包装类,当通过adaptive方式来调用RegistryProtocol或者和其他协议的实现类时,会先执行QosProtocolWrapper的方法。
1234567891011121314151617@Overridepublic <T> Exporter<T> export(Invoker<T> invoker) throws RpcException { if (Constants.REGISTRY_PROTOCOL.equals(invoker.getUrl().getProtocol())) { startQosServer(invoker.getUrl()); return protocol.export(invoker); ...
Dubbo系列-SPI源码解析
Dubbo系列-SPI源码解析Dubbo SPI是解析Dubbo源码的基础,几乎所有的机制都是从SPI上扩展出来的。换个方面说,Dubbo的所以功能都能扩展,遵循了开闭原则,值得我们学习。
Dubbo SPI扩展点的来源和解析参考官方文档:https://dubbo.gitbooks.io/dubbo-dev-book/SPI.html
这里有2个核心注解:
@SPI,写在接口上,表明这个接口个扩展点。
@Adaptive,写在接口的方法上,在使用getAdaptiveExtension方法获得实例时,获得的对象不是真实的对象,以Protocol为例,获得的是Protocol$Adaptive对象。在调用过程中,根据url再来判断需要调用具体的哪个实例。
12345678public class DubboTest { @Test public void test1() { ExtensionLoader<Protocol> extensionLoader = ExtensionLoader.getExtensionLoad ...
Dubbo系列 - telnet
dubbo系列 - telnetDubbo服务器判断如果接受到的请求时候String类型时,会调到TelnetHandlerAdapter#telnet。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677public class TelnetHandlerAdapter extends ChannelHandlerAdapter implements TelnetHandler { private final ExtensionLoader<TelnetHandler> extensionLoader = ExtensionLoader.getExtensionLoader(TelnetHandler.class); @Override public String telnet(Channel channel ...
Dubbo系列-服务端调用流程解析
dubbo系列(四)服务端调用流程解析[toc]
流程解析通过服务暴露流程,我们知道了dubbo服务端暴露dubbo协议的服务是在DubboProtocol类中进行的。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778@Overridepublic <T> Exporter<T> export(Invoker<T> invoker) throws RpcException { URL url = invoker.getUrl(); //按照serviceKey,将DubboExporter存入map中 String key = serviceKey(url); DubboExporter<T> exporter = new DubboExporter<T&g ...