文章说明
本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师课程细致、全面、深入、性价比极高。B站搜孙帅suns可以找到对应的试听视频,或者直接添加老师微信号suns45与他直接联系
一:序列化概念
补充说明:
Kyro和Fst这两种优秀的序列化方案都是适用于Java体系,换句话说,换个Go语言编写的端就不好使了。
ProtoBuf这中序列化方式可以支持其他的语言。Java、go、php都是可以支持的。GRPC另外一种RPC的底层实现方式。
二:ProtoBuf序列化方式
1:引入依赖
(一):ProtoBuf依赖
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>
</dependencies>
<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-java、protobuf-java-uitl这两个是Dubbo项目支持Protobuf的话,这两个依赖是必有的。dubbo-serialization-protobuf这个是ProtoBuf的序列化依赖。需要排除自带的Dubbo依赖。另外还需要把java和util这两个依赖给排除掉。
此依赖配置是放到父项目的Pom.xml里边。
(二):解决依赖编译问题
Consumer和provider之间是通过网络进行通信的,两者有可能不同的语言编写的。那两者通信的时候都得将数据转换为ProtoBuf这种中间格式来进行通讯。这样就做到了跨语言的数据传输。一旦应用了ProtoBuf这种序列化方式。
ProtoBuf作为数据传输的中间格式,一旦应用了ProtoBuf作为序列化方式的。IDL是ProtoBuf作为中间的格式,是ProtoBuf的特有的预发,里边都称之为Message。这里边涉及到一个编译的问题,需要使用ProtoC进行编译,使用ProtoC进行编译的话,有两种使用方式。1是直接本地安装protoC,另外一种是使用maven插件的方式。我们maven插件即可。
应用这个插件的时候,我们需要注意这个版本必须与上述的protobuf-java版本保持一致,使用MAC操作系统的话,其中的版本不能低于3.17.3,低于这个版本是对这个苹果的ARM架构是不支持的。Nacos是也有这个问题
2:ProtoBuf⽂件的编写
ProtoBuf作为序列化方案,需要有一个传输数据的中间类型,这个中间类型就是ProtoBuf里边的IDL,这个IDL大致有三块内容:参数(请求数据)返回值(返回参数)这是两个非常核心的内容,也称之为Message。
当然还有第三个内容,那就是服务接口。服务接口沟通了Provider和Confumer,一个基于服务接口提供实现,另外一个通过服务接口创建代理。如果基于ProtoBuf来实现序列化的话,那么这个服务接口也需要在定义在IDL当中的。
ProtoBuf的IDL是.protobuf的这样的一个文件。首先,我们使用的语法是proto3三个Java配置可选项。
这个文件叫做HelloService.proto,放到与API项目下和Java平级的proto目录下。这个将来会被consumer和provider共用。
然后,这个proto文件会被protoC插件翻译成Java类。
XML
syntax = "proto3";
生成的Java类放到不同的文件里
option java_multiple_files = true;
生成的代码放到那个包下
option java_package = "com.suns";
最外层的类叫什么名字?
option java_outer_classname = "HelloProtocol";
message HelloRequest {
string name = 1;
}
message HelloResponse {
string result = 1;
}
service HelloService {
rpc sayHello (HelloRequest) returns (HelloResponse);
}
3:ProtoC生成的Java接口
java
public class HelloServiceImpl implements HelloService {
@Override
public HelloResponse sayHello(HelloRequest request) {
System.out.println("HelloServiceImpl.sayHello request " + request.getName());
return HelloResponse.newBuilder().setResult("this is sayHello result").build();
}
//异步的
@Override
public CompletableFuture<HelloResponse> sayHelloAsync(HelloRequest request) {
return CompletableFuture.completedFuture(sayHello(request));
}
}
4:XML的配置方式
XML
<dubbo:protocol name="dubbo" port="-1" serialization="protobuf"/>
<bean id="helloService" class="com.suns.service.HelloServiceImpl"/>
<dubbo:service interface="com.suns.HelloService" ref="helloService"/>
5:Boot的配置方式
XML
dubbo:
protocol:
name: dubbo
port: -1
serialization: protobuf
6:Consumer端调用
XML
<dubbo:reference interface="com.suns.service.HelloService" id="helloSe
rvice"
url="dubbo://192.168.50.62:20880/com.suns.HelloServic
e?serialization=protobuf"/>
7:Boot的方式
XML
@DubboReference(url = "dubbo://192.168.50.62:20880/com.suns.HelloServi
ce?serialization=protobuf")