Dubbo如何实现基于http的jsonrpc调用

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

Jeff.Star CSDN认证博客专家 Java
[努力支撑经历,经历支撑能力.]
[思路决定出路,细节决定成败.]
[聚焦,分享,转化,参与.]
[数据在流动,技术在流动,我们也要流动.]
微信:TiensC
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页