Dubbo应用开发之ProtoBuf序列化的使用

Dubbo应用开发之ProtoBuf序列化的使用

为什么有前面几种序列化方式还要在了解ProtoBuf序列化呢?因为ProtoBuf是一种支持异构系统(不同编程语言的通信)的序列化方式,调用端和被调用端可以是不同的俩种语言比如java和python,前面给大家介绍的都是通过java语言来实现的序列化方式.

简介

在 Dubbo 框架中,Protocol Buffers 序列化与其他常见序列化(Hessian2、JSON、JDK 原生)的区别主要体现在以下三点:

  1. 体积与速度

    ProtoBuf 为二进制协议,数据量最小、速度最快;Hessian2 也是二进制但压缩率略低;JSON/JDK 为文本或冗余格式,体积大、速度最慢。

  2. 跨语言与升级

    ProtoBuf 需先定义 .proto 并生成代码,跨语言支持最好,且通过字段编号实现向前/向后兼容;Hessian2 跨语言较弱,JSON 无需 IDL 但无法原生支持版本演进。

  3. 使用场景

    Dubbo 官方默认 Hessian2(无需 schema,开发快);ProtoBuf 适合对 性能、体积、跨语言 要求高的内部服务,需额外配置 serialization="protobuf" 并引入 .proto 生成代码。

使用教程

引入依赖

dubbo-study 父工程引入依赖

pom.xml

这一块只贴出了使用prorobuf中需要增加的依赖,没有将之前的依赖也一块添加进来,这一块就不去细讲版本了直接安装我的版本来就可以了

xml 复制代码
<dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.22.2</version>
    </dependency>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java-util</artifactId>
        <version>3.22.2</version>
    </dependency>
    <dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-serialization-protobuf</artifactId>
    <version>2.7.23</version>
    <exclusions>
        <exclusion>
            <artifactId>dubbo-common</artifactId>
            <groupId>org.apache.dubbo</groupId>
        </exclusion>
        <exclusion>
            <artifactId>dubbo-serialization-api</artifactId>
            <groupId>org.apache.dubbo</groupId>
        </exclusion>
        <exclusion>
            <artifactId>protobuf-java</artifactId>
            <groupId>com.google.protobuf</groupId>
        </exclusion>
        <exclusion>
            <artifactId>protobuf-java-util</artifactId>
            <groupId>com.google.protobuf</groupId>
        </exclusion>
    </exclusions>
    </dependency>

<build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.7.1</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.22.2:exe:${os.detected.classifier}</protocArtifact>
                    <outputDirectory>${basedir}/src/main/java</outputDirectory>
                    <clearOutputDirectory>false</clearOutputDirectory>
                    <protocPlugins>
                        <protocPlugin>
                            <id>dubbo</id>
                            <groupId>org.apache.dubbo</groupId>
                            <artifactId>dubbo-compiler</artifactId>
                            <version>0.0.2</version>
                            <mainClass>org.apache.dubbo.gen.dubbo.Dubbo3Generator</mainClass>
                        </protocPlugin>
                    </protocPlugins>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

ProtoBuf⽂件的编写

等同于定义服务的请求参数,返回值等,所以这个文件一定是在一个都可以访问到的地方.我们在dubbo-api模块中的src/main下创建一个目录proto,然后创建.proto文件

protobuf 复制代码
syntax = "proto3";
option java_multiple_files = true;
option java_package = "org.example";
option java_outer_classname = "HelloProtocol";
message HelloRequest {
  string name = 1;
}
message HelloResponse {
  string result = 1;
}
service HelloService {
  rpc sayHello (HelloRequest) returns (HelloResponse);
}

执行maven插件命令

可以发现我们定义的org.example下生成了相关接口

那么接下来我们只需要对接口进行实现即可,这里我采用springboot方式进行实现后面就一直采用springboot进行案例开发

实现接口完成服务开发

dubbo-boot-prod模块对HelloService接口进行实现

HelloServiceImpl.java

java 复制代码
package org.example.service;

import org.apache.dubbo.config.annotation.DubboService;
import org.example.HelloRequest;
import org.example.HelloResponse;
import org.example.HelloService;

import java.util.concurrent.CompletableFuture;

@DubboService
public class HelloServiceImpl implements HelloService {
    @Override
    public HelloResponse sayHello(HelloRequest request) {
        System.out.println("hello ! request = " + request);
        return HelloResponse.newBuilder().setResult("result !").build();
    }

    @Override
    public CompletableFuture<HelloResponse> sayHelloAsync(HelloRequest request) {
        return CompletableFuture.completedFuture(sayHello(request));
    }
}

修改yml配置方式

application.yml

yml 复制代码
dubbo:
  protocol:
    name: dubbo
    port: -1
    serialization: protobuf
  scan:
    base-packages:
spring:
  application:
    name: dubbo-boot-prod

启动测试

运行dubbo-boot-prod服务即可看到日志输出

相关推荐
量子炒饭大师13 小时前
【C++入门】—— 【什么时候需要用到深拷贝】C++的类中何时需要用到深拷贝?保姆级别带你罗列所有可能!
java·c++·dubbo·深拷贝
橘颂TA2 天前
【测试】自动化测试函数介绍——web 测试
python·功能测试·selenium·测试工具·dubbo
wc882 天前
dubbo本地直连一个程序既当提供者又当消费者问题
dubbo
小信丶4 天前
@Activate 注解详解:应用场景与实战示例
java·spring boot·后端·spring·spring cloud·微服务·dubbo
不像程序员的程序媛5 天前
nacos作为dubbo服务注册中心
dubbo
BraveHeart!7 天前
@DubboService 与 @DubboReference 初始化过程
dubbo
信创天地8 天前
从 “替代” 到 “超越”:信创系统架构师如何筑牢自主可控技术底座
运维·安全·系统架构·开源·dubbo·risc-v
wniuniu_9 天前
运维运维运维
java·运维·dubbo
量子炒饭大师9 天前
【C++入门】Cyber骇客构造器的核心六元组 —— 【类的默认成员函数】明明没写构造函数也能跑?保姆级带你掌握六大类的默认成员函数(上:函数篇)
开发语言·c++·dubbo·默认成员函数
信创天地10 天前
信创运维核心技术:国产化软硬件适配与故障排查全解析
运维·人工智能·开源·dubbo·运维开发·risc-v