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

相关推荐
装不满的克莱因瓶4 天前
【Java架构师】各个微服务之间有哪些调用方式?
java·开发语言·微服务·架构·dubbo·restful·springcloud
他们叫我技术总监6 天前
从开发者视角深度评测:ModelEngine 与 AI 开发平台的技术博弈
java·人工智能·dubbo·智能体·modelengine
CodeLongBear7 天前
Day02计算机网络网络层学习总结:从协议到路由全解析
学习·计算机网络·dubbo
编啊编程啊程10 天前
【018】Dubbo3从0到1系列之时间轮流程图解
rpc·dubbo
编啊编程啊程10 天前
【020】Dubbo3从0到1系列之服务发现
rpc·dubbo
静止了所有花开11 天前
虚拟机ping不通百度的解决方法
dubbo
helloworld_工程师11 天前
Dubbo应用开发之FST序列化的使用
后端·dubbo
百度智能云技术站11 天前
百度亮相 SREcon25:搜索稳定背后的秘密,微服务雪崩故障防范
微服务·架构·dubbo
问道飞鱼14 天前
【微服务组件】Springboot结合Dubbo实现RPC调用
spring boot·微服务·rpc·dubbo