dubbo rpc详解

发布时间:2023-05-18

一、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<HelloService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(HelloService.class);
        serviceConfig.setRef(helloService);
        serviceConfig.export();
        // 容器需要启动,这里直接sleep,防止程序退出
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
// 服务调用方
public class Consumer {
    public static void main(String[] args) {
        // 引用服务
        ReferenceConfig<HelloService> 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高并发编程实战,任玉刚 编著