Dubbo协议扩展
dubbo默认的协议是Duubo协议,同时也提供了多种协议的实现,目前实现的扩展有:
org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol
org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
org.apache.dubbo.rpc.protocol.rmi.RmiProtocol
org.apache.dubbo.rpc.protocol.http.HttpProtocol
org.apache.dubbo.rpc.protocol.http.hessian.HessianProtocol
具体说明可以参考:
http://dubbo.apache.org/zh-cn/docs/dev/impls/protocol.html
本文演示的就是使用http协议方式。
Dubbo-Http协议的使用姿势
从github上下载demo下来在,这里以注解方式的demo为例。地址参考文末链接。
消费端姿势
- 注册中心:Consul
其实消费端的配置很简单,配置下consul的地址即可,这样以来就默认使用consul方式的注册中心了。
dubbo.application.name=dubbo-demo-annotation-consumer
dubbo.registry.address=consul://localhost:8500
- 服务引用(http)
那么,问题来了,就是消费端怎么设置http协议调用呢?也很esay。
答案就是在服务引用DemoService上加上注解@DubboReference(protocol=“http”)
package org.apache.dubbo.demo.consumer.comp;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.demo.DemoService;
import org.springframework.stereotype.Component;
import java.util.concurrent.CompletableFuture;
@Component("demoServiceComponent")
public class DemoServiceComponent implements DemoService {
@DubboReference(protocol="http")
private DemoService demoService;
@Override
public String sayHello(String name) {
return demoService.sayHello(name);
}
@Override
public CompletableFuture<String> sayHelloAsync(String name) {
return null;
}
}
服务端姿势
服务端的使用姿势更加简单。如下所示,这样以来服务启动之后就会把DemoService注册到Consul上。
dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=http
dubbo.protocol.port=20880
可以看到consul上已经注册了服务:
抓包测试
启动服务提供者和消费者之后,就可以进行抓包了。可以看到底层走的的确是jsonrpc的协议。
调用流程分析
Dubbo的调用我觉得用官网文档的这个图比较清晰。
Directory会把监听注册中心的事件,从而更新本地的服务列表,这些列表内的提供者信息最终会被封装为相应的invoker对象,确切的说是RegisterDirectory,即Directory的实现类来管理这些List< Invoker>.
当消费者发起调用,会走到AbstractClusterInvoker抽象类的Invoke方法,接着会做几件事,第一件事就是从Directory中拿到List< Invoker>.而AbstractDirecoty的实现类有两个,和注册中心有关的就是RegistryDirectory。
注意这里其实还有路由规则的过滤,也就是对注册中心的提供者列表做过滤,比如标签路由、条件路由等。然后还有一个必须要说的就是这个notify事件通知方法,对服务提供者的状态进行监听,从而及时更新本地的服务提供者列表。
拿到List之后,那就要进行初始化一个负载均衡,看下这个initLoadBlance方法。
服务列表有了,负载均衡器也有了,接下来就是集群调用了,集群的调用方式如图所示,默认的就是FailOver这种失败自动切换方式了。
暂时就分析到这里了。
参考资料
Dubbo官方文档:
http://dubbo.apache.org/zh-cn/docs/source_code_guide/directory.html
Dubbo-Demo地址:
https://github.com/apache/dubbo/tree/master/dubbo-demo