Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)

dubbo3,应用,开发,dubbo,序列化,方案,kryo,fst,fastjson2,protobuf,介绍,使用 · 浏览次数 : 83

小编点评

**HelloService.proto** ```proto3 option java_multiple_files = true; option java_package = "com.sjdwz"; option java_outer_classname = "HelloServiceProto"; message HelloRequest { string name = 1; } message HelloResponse { string result = 1; } service HelloService { rpc sayHello(HelloRequest) returns (HelloResponse); } ``` **ClientApplication.java** ```java public class ClientApplication { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-consumer.xml"); HelloService hellService = applicationContext.getBean(HelloService.class); HelloResponse response = hellService.sayHello(HelloRequest.newBuilder().setName("sjdwz").build()); System.out.println("response.getResult() = " + response.getResult()); System.in.read(); } } ``` **applicationContext-consumer.xml** ```xml ``` **配置项** ```properties # dubbo 服务配置 dubbo.service.interface=com.sjdwz.HelloService dubbo.service.ref=helloService # consumer 服务配置 dubbo.reference.interface=com.sjdwz.HelloService dubbo.reference.id=helloService ```

正文

Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)

序列化简介

序列化是Dubbo在RPC中非常重要的一个组成部分,其核心作用就是把网络传输中的数据,按照特定的格式进行传输。减小数据的体积,从而提高传输效率。

Serialization类图

Dubbo制定了Serialization接口,然后有不同的实现。

常见的Dubbo序列化方式

序列化方式 备注
Hessian Dubbo协议中默认的序列化实现方案。
Java Serialization JDK的序列化方式。
Dubbo序列化 阿里尚未开发成熟的高效Java序列化实现,目前不建议我们在生产环境使用它。
Json序列化 目前有两种实现:一种是采用阿里的fastjson库;一种是采用Dubbo中自己实现的简单json库。
Kryo Java序列化方式,后续替换Hessian2,是一种非常成熟的序列化实现,已经在Twitter、Groupon、Yahoo以及多个著名开源项目(如Hive、Storm)中广泛使用。
FST Java序列化方式,后续替换Hessian2,是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例。
跨语言序列化方式 ProtoBuf,Thirft,Avro,MsgPack(它更快更小。短整型被编码成一个字节)。

不同序列化方式的对比

基于Java的方式序列化对比(没有对比protobuf)下图来自官方文档:

不同序列化方式的对比图

Kryo序列化方式的使用

在父项目的pom文件中添加依赖

<dependency>
    <groupId>org.apache.dubbo.extensions</groupId>
    <artifactId>dubbo-serialization-kryo</artifactId>
    <version>1.0.1</version>
</dependency>

引入依赖

xml形式

provider

在配置文件中书写下面的内容:

<!-- 设置rpc相关的协议 使得可以网络通信 -->
<dubbo:protocol name="dubbo" port="20880" serialization="kryo"/>

配置文件配置kryo序列化方式

启动起来观看效果:

运行效果

dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?anyhost=true&application=dubbo-02-provider&background=false&bind.ip=192.168.96.1&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&executor-management-mode=isolation&file-cache=true&generic=false&interface=com.sjdwz.service.UserService&methods=login&pid=13136&prefer.serialization=kryo&release=3.2.0&serialization=kryo&side=provider&timestamp=1695216749509, dubbo version: 3.2.0, current host: 192.168.96.1

comsumer

在配置文件中添加配置

<dubbo:reference interface="com.sjdwz.service.UserService" id="userService"
                     url="dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?serialization=kryo"/>

运行效果:

运行效果

Boot的方式

provider

在配置文件中书写下面的内容:

spring:
  application:
    name: dubbo-04-provider

dubbo:
  protocol:
    name: dubbo
    port: -1
    serialization: kryo

consumer

注解

@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.service.UserService?serialization=kryo")

FST序列化方式的使用

在父项目的pom文件中添加依赖

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-serialization-fst</artifactId>
    <version>2.7.23</version>
    <exclusions>
        <exclusion>
            <artifactId>dubbo-common</artifactId>
            <groupId>org.apache.dubbo</groupId>
        </exclusion>
    </exclusions>
</dependency>

其他操作类似Kryo序列化方式的使用。

FASTJSON2序列化方式的使用

在父项目的pom文件中添加依赖

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.23</version>
</dependency>

其他操作类似Kryo序列化方式的使用。

ProtoBuf序列化方式的使用

环境搭建

在父项目的pom文件中增加相关依赖

<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>

在父项目的pom文件中增加build内容

<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-01-api模块的main目录新建一个proto文件夹;

注意必须叫这个名字,这样才能被maven插件读取到;

protobuf

新建一个HelloService.proto的文件,在文件中编写如下内容:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.sjdwz";
option java_outer_classname = "HelloServiceProto";

message HelloRequest{
  string name = 1;
}

message HelloResponse{
  string result = 1;
}

service HelloService{
  rpc sayHello(HelloRequest) returns (HelloResponse);
}

HelloService.proto

服务开发

在protobuf文件中右键

maven插件示意

执行此命令:

执行命令

注意:如果项目中有中文路径可能会报错,需要改成英文目录

生成的内容

可以clean一下把target目录下的内容删掉;

provider的开发

实现生成的service接口

实现service接口

xml文件配置

xml配置

<!-- 为dubbo起个名字,要做到唯一,可以被注册中心所管理 -->
<dubbo:application name="dubbo-02-provider"/>

<!-- 设置rpc相关的协议 使得可以网络通信 -->
<dubbo:protocol name="dubbo" port="20880" serialization="protobuf"/>

<!-- 创建对象 -->
<bean id="helloService" class="com.sjdwz.service.HelloServiceImpl"/>

<!-- 发布dubbo服务 -->
<dubbo:service interface="com.sjdwz.HelloService" ref="helloService"/>

运行结果如下:

运行截图

consumer的开发

xml配置

<dubbo:reference interface="com.sjdwz.HelloService" id="helloService"
                 url="dubbo://192.168.96.1:20880/com.sjdwz.HelloService?serialization=protobuf"/>

Java测试类

public class ClientApplication {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-consumer.xml");
        HelloService hellService = applicationContext.getBean(HelloService.class);
        HelloResponse response = hellService.sayHello(HelloRequest.newBuilder().setName("sjdwz").build());
        System.out.println("response.getResult() = " + response.getResult());

        System.in.read();
    }
}

运行结果

provider的开发——boot配置

spring:
  application:
    name: dubbo-04-provider

dubbo:
  protocol:
    name: dubbo
    port: -1
    serialization: protobuf

consumer的开发——boot配置

@DubboReference(url = "dubbo://192.168.96.1:20880/com.sjdwz.HelloService?serialization=protobuf")

与Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)相似的内容:

Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)

Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用) 序列化简介 序列化是Dubbo在RPC中非常重要的一个组成部分,其核心作用就是把网络传输中的数据,按照特定的格式进行传输。减小数据的体积,从而提高传输效率。 Dubbo制定了Serializatio

Dubbo3应用开发—Dubbo直连开发相关概念:通信、协议、序列化

本文介绍了Dubbo3直连应用相关概念,包括通信、协议、序列化等内容。通过这些概念的讲解,可以更好的理解Dubbo3直连应用的开发。

Dubbo3应用开发—Dubbo注册中心引言

Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理。 注册中心的运行流程 使用注册中心的好处 可以有效的管理RPC集群的健康情况,动态的上线或者下线服务。让我们的服务更加高可用。 Provider与Con

Dubbo3应用开发—Dubbo服务管理平台DubboAdmin介绍、安装、测试

Dubbo服务管理平台 DubboAdmin的介绍 Dubbo Admin是Apache Dubbo服务治理和管理系统的一部分。 Dubbo Admin提供了一套用于服务治理的Web界面,让我们可以更方便地对Dubbo系统进行管理和监控。新版本的Dubbo Admin是基于VUE、SpringBoo

Dubbo3应用开发—协议(Dubbo协议、REST协议 、gRPC协议、Triple协议)

协议 协议简介 什么是协议 Client(Consumer端)与Server(Provider端)在传输数据时双方的约定。 Dubbo3中常见的协议 1.dubbo协议[前面文章中使用的都是dubbo协议] 2.rest协议 3.triple协议 4.grpc协议 5.thirft协议 6.webs

Dubbo3应用开发—XML形式的Dubbo应用开发和SpringBoot整合Dubbo开发

Dubbo3程序的初步开发 Dubbo3升级的核心内容 易⽤性 开箱即⽤,易⽤性⾼,如 Java 版本的⾯向接⼝代理特性能实现本地透明调⽤功能丰富,基于原⽣库或轻量扩展即可实现绝⼤多数的 微服务治理能⼒。更加完善了多语言支持(GO PYTHON RUST) 超⼤规模微服务实践 ⾼性能通信(Tripl

Dubbo3应用开发——架构的演变过程

Dubbo3应用开发——架构的演变过程 什么是Dubbo 早期Dubbo的定位; 基于Java的高性能,轻量级的RPC框架;SOA【Service-Oriented Architecture ⾯向服务的架构】 = RPC+服务治理; 2018年阿⾥巴巴把这个框架捐献给了 Apache 基⾦会,正式更

Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用

Dubbo3注册中心的使用 zookeeper注册中心的使用 依赖引入 org.apache.dubbo dubbo-dependencies-zookeeper-curator5

Dubbo架构设计与源码解析(一) 架构设计

作者:黄金 一、架构演变 单应用架构 > 垂直架构 > 分布式架构 > 微服务架构 > 云原生架构   二、Dubbo总体架构   1、角色职能 • Container:服务容器 (tomcat、jetty、weblogic) • Provider:服务提供者 •Consumer:服务消

Dubbo源码浅析(一)—RPC框架与Dubbo

RPC,Remote Procedure Call 即远程过程调用,与之相对的是本地服务调用,即LPC(Local Procedure Call)。本地服务调用比较常用,像我们应用内部程序(注意此处是程序而不是方法,程序包含方法)互相调用即为本地过程调用,而远程过程调用是指在本地调取远程过程进行使用...