一、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调用可以通过如下方式来实现:
- 使用dubbo协议或http协议发起请求。
- 请求从客户端传至服务端,由netty接收。
- netty将请求解码成相应的Service对象,并将请求转发给Invoker。
- Invoker执行请求,并将结果写回到netty中。
- 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服务的问题,并定位服务缺失、超时、失败等问题。
参考资料:
- dubbo官网,https://dubbo.apache.org/zh-cn/docs/
- Java高并发编程实战,任玉刚 编著