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

Source

Dubbo

【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】

4 Dubbo 高级特性

4.2 Dubbo 常用高级配置

4.2.1 序列化

【一个问题】

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

举个栗子

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

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

【但是】

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

【做法 就是序列化】

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

消费者 拿到这个 流数据后

在这里插入图片描述

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

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

在这里插入图片描述

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

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

【如何实现??】

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

【试试】

先来一个 新的模块

在这里插入图片描述

OK,直接创建

在这里插入图片描述

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-interface 公共接口模块中再来一个 接口

先引入 pojo 模块的依赖

在这里插入图片描述

OK, 编写接口

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

在这里插入图片描述

OK,这样方法 就加上 了

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

public User findUserById(int id) {
    
      

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

在这里插入图片描述

OK,这样就行了

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

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

    return userService.findUserById(id);
}

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

在这里插入图片描述

没事,测试嘛

OK, install 模块

pojo:

在这里插入图片描述

interface:

在这里插入图片描述

OK, 重启 service 和 web 两个服务

在这里插入图片描述

OK,开始测试

在这里插入图片描述

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

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

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

在这里插入图片描述

OK, 重新安装 pojo 模块

在这里插入图片描述

OK,重启service 和 web 服务

在这里插入图片描述

再试一次

在这里插入图片描述

OK, 这样就可以了

这就是 序列化。