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服务即可看到日志输出

相关推荐
学海_无涯_苦作舟1 天前
Dubbo注册中心故障深度解析:Provider与Consumer全行为链路
dubbo
码界奇点1 天前
基于Spring Boot和Dubbox的分布式API接口与后台管理系统设计与实现
spring boot·分布式·后端·毕业设计·dubbo·源代码管理
Java水解2 天前
Dubbo跨机房调用实战:从原理到架构的完美解决方案
后端·dubbo
川213 天前
Dubbo与OpenFegin的区别-选型
dubbo·openfegin
拾忆,想起4 天前
单例模式深度解析:如何确保一个类只有一个实例
前端·javascript·python·微服务·单例模式·性能优化·dubbo
北北~Simple5 天前
解析百度分享链接,到自己服务器上
运维·服务器·dubbo
百度安全6 天前
百度办公网安全秘诀分享——兼顾安全与效率
安全·网络安全·dubbo·办公安全
HillVue6 天前
中国未来 AI 路径的百度样本
大数据·eureka·dubbo
Gavin在路上6 天前
dubbo源码之一次RPC请求的生死之旅(基于Dubbo 2.7.8)
网络协议·rpc·dubbo
拾忆,想起7 天前
Dubbo RPC 实战全流程:从零搭建高可用微服务系统
网络·网络协议·微服务·性能优化·rpc·架构·dubbo