您的位置:

dubbo rpc详解

一、dubbo rpc协议

Dubbo是一种基于Java平台的高性能RPC(Remote Procedure Call,远程过程调用)框架。Dubbo RPC协议是Dubbo框架中最重要的组成部分之一。Dubbo采用一种基于TCP长连接和二进制传输的Dubbo协议,这种协议设计简单、传输速度快、稳定性好。

在Dubbo协议中,消息头部分包含了4个字节魔数(0xdabb)、2个字节版本、1个字节传输类型、1个字节序列化方式、4个字节的消息长度。消息体则是Dubbo协议特定格式的数据体。

Dubbo RPC协议支持多种序列化机制,包括Java自带的序列化、Fastjson、Jackson等。在Dubbo中,推荐使用高效性能的Kryo序列化机制。

二、dubbo rpc调用实战

Dubbo RPC提供者需要实现某个接口,并在服务发布时指定该接口的属性(如版本、超时时间、超时重试次数、负载均衡算法等)。使用Dubbo RPC的调用者需要实现该接口,在调用时指定其属性(如版本、超时时间等)。

服务提供者将其实现的接口发布到zookeeper上,服务调用者通过zookeeper发现接口对应的服务提供者,使用RpcContext传递上下文数据,以实现相应的功能。具体的代码可以参考以下示例:

// 服务接口
public interface HelloService {
    String sayHello(String name);
}

// 服务提供方
public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

public class Provider {
    public static void main(String[] args) {
        // 服务实现
        HelloService helloService = new HelloServiceImpl();
        // 发布服务
        ServiceConfig serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(HelloService.class);
        serviceConfig.setRef(helloService);
        serviceConfig.export();
        // 容器需要启动,这里直接sleep,防止程序退出
        Thread.sleep(Long.MAX_VALUE);
    }
}

// 服务调用方
public class Consumer {
    public static void main(String[] args) {
        // 引用服务
        ReferenceConfig
    referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(HelloService.class);
        referenceConfig.setUrl("dubbo://127.0.0.1:20880");
        // 调用服务
        HelloService helloService = referenceConfig.get();
        String result = helloService.sayHello("dubbo rpc");
        System.out.println(result);
    }
}

   
  

三、dubbo rpc原理

使用Dubbo RPC的服务提供者将实现的接口发布到注册中心(如zookeeper),并将自身的地址信息注册到注册中心上。服务调用方通过注册中心获取服务提供者的地址,使用长连接与服务提供者建立连接,通过Dubbo协议进行通信。

Dubbo RPC的负载均衡算法主要有轮询、随机、最不活跃调用、一致性哈希等。Dubbo RPC的容错机制包括重试、快速失败、Failover(自动容错)等。

四、dubbo rpc调用

Dubbo RPC调用可以通过如下方式来实现:

1.使用dubbo协议或http协议发起请求。

2.请求从客户端传至服务端,由netty接收。

3.netty将请求解码成相应的Service对象,并将请求转发给Invoker。

4.Invoker执行请求,并将结果写回到netty中。

5.netty将响应编码后返回给客户端。

五、dubbo rpc工具

Dubbo提供了丰富的工具,以帮助用户更好地使用Dubbo RPC,包括Dubbo Admin(服务治理)、Dubbo Telnet命令、Dubbo Monitor、Dubbo Inspect等。

Dubbo Admin提供一个可视化界面,用于管理Dubbo RPC服务通过zookeeper发布的服务,以及查看有关服务的详细信息。

Dubbo Telnet命令用于与Dubbo服务进行交互,包括查看服务、进行测试和查看监控统计数据等。

Dubbo Monitor用于服务的监控和统计,包括服务调用次数、请求响应时间、调用错误次数等信息。

Dubbo Inspect是一种轻量级的辅助工具,可以快速定位Dubbo服务的问题,并定位服务缺失、超时、失败等问题。

参考资料:
1. dubbo官网,https://dubbo.apache.org/zh-cn/docs/
2. Java高并发编程实战,任玉刚 编著