Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Dubbo2.0

    • 基础知识
    • dubbo配置
    • 高可用
    • dubbo原理
  • Dubbo3.0

    • 如何将一个应用改造为一个Dubbo应用
    • Dubbo.3.0新特性介绍
      • 1. 注册模型的改变
      • 2. 新⼀代RPC协议
        • UNARY
        • SERVER_STREAM
        • CLIENT_STREAM
        • BI_STREAM
    • Dubbo3.0跨语言调用
  • 《Dubbo》笔记
  • Dubbo3.0
Salmon
2024-04-29
目录

Dubbo.3.0新特性介绍

# 1. 注册模型的改变

在服务注册领域,市⾯上有两种模型,⼀种是应⽤级注册,⼀种是接⼝级注册,在Spring Cloud中,⼀个应⽤是⼀个微服务,⽽在Dubbo2.7中,⼀个接⼝是⼀个微服务。

所以,Spring Cloud 在进⾏服务注册时,是把应⽤名以及应⽤所在 服务器的IP地址 和 应⽤所绑定的端⼝ 注册到注册中⼼,相当于 key 是应⽤名,value是 ip+port,⽽在 Dubbo2.7 中,是把接⼝名以及对应应⽤的 IP地址 和 所绑定的端⼝ 注册到注册中⼼,相当于 key是 接⼝名,value是 ip+port。

image-20240430172420931

所以在 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 ⼀样

上次更新: 2025/07/23, 01:37:33
如何将一个应用改造为一个Dubbo应用
Dubbo3.0跨语言调用

← 如何将一个应用改造为一个Dubbo应用 Dubbo3.0跨语言调用→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式