Dubbo.3.0新特性介绍
# 1. 注册模型的改变
在服务注册领域,市⾯上有两种模型,⼀种是应⽤级注册,⼀种是接⼝级注册,在Spring Cloud中,⼀个应⽤是⼀个微服务,⽽在Dubbo2.7中,⼀个接⼝是⼀个微服务。
所以,Spring Cloud 在进⾏服务注册时,是把应⽤名以及应⽤所在 服务器的IP地址 和 应⽤所绑定的端⼝ 注册到注册中⼼,相当于 key 是应⽤名
,value是 ip+port
,⽽在 Dubbo2.7 中,是把接⼝名以及对应应⽤的 IP地址 和 所绑定的端⼝ 注册到注册中⼼,相当于 key是 接⼝名
,value是 ip+port
。
所以在 Dubbo2.7 中,⼀个应⽤如果提供了 10 个 Dubbo 服务,那么注册中⼼中就会存储 10 对 keyvalue ,⽽ Spring Cloud 就只会存⼀对keyvalue,所以以 Spring Cloud 为⾸的应⽤级注册是更加适合的。
所以Dubbo3.0中将注册模型也改为了应⽤级注册,提升效率节省资源的同时,通过统⼀注册模型,也为各个微服务框架的互通打下了基础。
# 2. 新⼀代RPC协议
定义了全新的 RPC 通信协议 – Triple
,⼀句话概括 Triple:它是基于 HTTP/2
上构建的 RPC 协议,完全兼容 gRPC
,并在此基础上扩展出了更丰富的语义。 使⽤ Triple 协议,⽤户将获得以下能⼒:
更容易到适配⽹关、Mesh架构,Triple 协议让 Dubbo 更⽅便的与各种⽹关、Sidecar 组件配合⼯作。
多语⾔友好,推荐配合 Protobuf 使⽤ Triple 协议,使⽤ IDL 定义服务,使⽤ Protobuf 编码业务数据。
流式通信⽀持。Triple 协议⽀持 Request Stream、Response Stream、Bi-direction Stream。当使⽤Triple协议进⾏RPC调⽤时,⽀持多种⽅式来调⽤服务,只不过在服务接⼝中要定义不同的⽅法。
⽐如:
public interface DemoService {
// UNARY
String sayHello(String name);
// SERVER_STREAM
default void sayHelloServerStream(String name, StreamObserver<String> response) {
}
// CLIENT_STREAM / BI_STREAM
default StreamObserver<String> sayHelloStream(StreamObserver<String> response) {
return response;
}
}
# UNARY
unary,就是正常的调⽤⽅法
服务实现类对应的⽅法:
// UNARY
@Override
public String sayHello(String name) {
return "Hello " + name;
}
服务消费者调⽤⽅式:
String result = demoService.sayHello("zhouyu");
# SERVER_STREAM
服务实现类对应的⽅法:
// SERVER_STREAM
@Override
public void sayHelloServerStream(String name, StreamObserver<String> response) {
response.onNext(name + " hello");
response.onNext(name + " world");
response.onCompleted();
}
服务消费者调⽤⽅式:
demoService.sayHelloServerStream("zhouyu", new StreamObserver<String>() {
@Override
public void onNext(String data) {
// 服务端返回的数据
System.out.println(data);
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onCompleted() {
System.out.println("complete");
}
});
# CLIENT_STREAM
服务实现类对应的⽅法:
// CLIENT_STREAM
@Override
public StreamObserver<String> sayHelloStream(StreamObserver<String> response) {
return new StreamObserver<String>() {
@Override
public void onNext(String data) {
// 接收客户端发送过来的数据,然后返回数据给客户端
response.onNext("result:" + data);
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onCompleted() {
System.out.println("completed");
}
};
}
服务消费者调⽤⽅式:
StreamObserver<String> streamObserver = demoService.sayHelloStream(new StreamObserver<String>() {
@Override
public void onNext(String data) {
System.out.println("接收到响应数据:" + data);
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onCompleted() {
System.out.println("接收到响应数据完毕");
}
});
// 发送数据
streamObserver.onNext("request zhouyu hello");
streamObserver.onNext("request zhouyu world");
streamObserver.onCompleted();
# BI_STREAM
和 CLIENT_STREAM ⼀样