4 Dubbo 高级特性


文章目录

  • 4 Dubbo 高级特性
  • 4.2 Dubbo 常用高级配置
  • 4.2.1 序列化


4.2 Dubbo 常用高级配置
4.2.1 序列化

【一个问题】

两个机器传输数据,如何传输Java对象?

举个栗子

dubbo 序列化方式 dubbo接口参数序列化_java

现在 有个生产者 和一个 消费者,消费者要查询 生产者 提供的服务,

生产者 去查询数据库 就可以搞出来 一个数据,比如User 对象

dubbo 序列化方式 dubbo接口参数序列化_User_02

dubbo 序列化方式 dubbo接口参数序列化_java-zookeeper_03

最后生产者 再把User 对象发送给消费者, 就算 完成了这个过程

【但是】

这两个 服务将来 肯定是两台 机器上 的两个 项目,如何传输 User 这个Java 对象?

【做法 就是序列化】

dubbo 序列化方式 dubbo接口参数序列化_dubbo 序列化方式_04

生产者 将User 对象 序列化为流的数据

dubbo 序列化方式 dubbo接口参数序列化_User_05

前提是 这个User 对象 要实现Serializable 接口

现在就可以通过 流 把数据 发送到消费者

dubbo 序列化方式 dubbo接口参数序列化_User_06

消费者 拿到这个 流数据后

dubbo 序列化方式 dubbo接口参数序列化_java-zookeeper_07

通过反序列 化, 将流数据 重新转回 User 对象

注意,不管是序列化 还是反序列化,消费者 和生产者 这两端 都要 用到User 这个类

dubbo 序列化方式 dubbo接口参数序列化_java-zookeeper_08

所以一般做法就是 把User 这个类,独立到一个模块中

然后消费者 和 生产者 都通过Maven 依赖 来依赖这个带有 User类 的 模块

【如何实现??】

  • dubbo 内部已经将序列化和反序列化的过程内部封装了
  • 我们只需要在定义pojo类时实现Serializable接口即可
  • 一般会定义一个公共的pojo模块,让生产者和消费者都依赖该模块。

【试试】

先来一个 新的模块

dubbo 序列化方式 dubbo接口参数序列化_java_09

OK,直接创建

dubbo 序列化方式 dubbo接口参数序列化_dubbo 序列化方式_10

OK, 一个全新的 Maven模块

直接来一个实体类

package com.dingjiaxiong.pojo;

/**
 * ClassName: User
 * date: 2022/11/14 13:17
 *
 * @author DingJiaxiong
 */


public class User {

    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

OK,先不急 实现接口

dubbo 序列化方式 dubbo接口参数序列化_User_11

在dubbo-interface 公共接口模块中再来一个 接口

先引入 pojo 模块的依赖

dubbo 序列化方式 dubbo接口参数序列化_dubbo_12

OK, 编写接口

/**
 * 查询用户
 * */
public User findUserById(int id);

dubbo 序列化方式 dubbo接口参数序列化_java_13

OK,这样方法 就加上 了

在service 模块中的实现类 里对这个接口进行实现

public User findUserById(int id) {

    // 查询User 对象【这里躲懒了,不走数据库】
    User user = new User(1,"zhangsan","123");
    
    return user;
}

dubbo 序列化方式 dubbo接口参数序列化_User_14

OK,这样就行了

在web 模块中再来一个接口,方便测试

// 根据ID 查询用户信息
@RequestMapping("/find")
public User find(int id){

    return userService.findUserById(id);
}

其实吧,实现类 那儿,id 写死了 …

dubbo 序列化方式 dubbo接口参数序列化_java-zookeeper_15

没事,测试嘛

OK, install 模块

pojo:

dubbo 序列化方式 dubbo接口参数序列化_dubbo_16

interface:

dubbo 序列化方式 dubbo接口参数序列化_dubbo 序列化方式_17

OK, 重启 service 和 web 两个服务

dubbo 序列化方式 dubbo接口参数序列化_java-zookeeper_18

OK,开始测试

dubbo 序列化方式 dubbo接口参数序列化_dubbo_19

OK, 不出意外,直接报错了,查看控制台 的日志

老师的很明确的打印了,User 类 必须实现序列化 接口

【笔者没找到】现在 加上实现

dubbo 序列化方式 dubbo接口参数序列化_dubbo_20

OK, 重新安装 pojo 模块

dubbo 序列化方式 dubbo接口参数序列化_java_21

OK,重启service 和 web 服务

dubbo 序列化方式 dubbo接口参数序列化_User_22

再试一次

dubbo 序列化方式 dubbo接口参数序列化_java_23

OK, 这样就可以了

这就是 序列化。