Dubbo
【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】
4 Dubbo 高级特性
文章目录
- Dubbo
- 4 Dubbo 高级特性
- 4.2 Dubbo 常用高级配置
- 4.2.1 序列化
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, 这样就可以了
这就是 序列化。