Dubbo应用开发之ProtoBuf序列化的使用
为什么有前面几种序列化方式还要在了解ProtoBuf序列化呢?因为ProtoBuf是一种支持异构系统(不同编程语言的通信)的序列化方式,调用端和被调用端可以是不同的俩种语言比如java和python,前面给大家介绍的都是通过java语言来实现的序列化方式.
简介
在 Dubbo 框架中,Protocol Buffers 序列化与其他常见序列化(Hessian2、JSON、JDK 原生)的区别主要体现在以下三点:
-
体积与速度
ProtoBuf 为二进制协议,数据量最小、速度最快;Hessian2 也是二进制但压缩率略低;JSON/JDK 为文本或冗余格式,体积大、速度最慢。
-
跨语言与升级
ProtoBuf 需先定义
.proto并生成代码,跨语言支持最好,且通过字段编号实现向前/向后兼容;Hessian2 跨语言较弱,JSON 无需 IDL 但无法原生支持版本演进。 -
使用场景
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服务即可看到日志输出
