dubbo 序列化
序列化 是将对象 转换为 流的数据
- dubbo 内部已经将序列化和反序列化的过程内部封装了
- 我们只需要在定义pojo类时实现serializable接口即可
- 一般会定义一 个公共的pojo模块,让生产者和消费者都依赖该模块。
在maven 中 模块里的内容有修改的,要重新点击 install 进行安装
dubbo - pojo 实体类模块
这个模块 用来创建实体类对象
public class User implements Serializable {
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;
}
地址缓存
注册中心挂了,服务是否可以正常访问?
- 可以,因为dubbo服务消费者在第一-次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
- 当服务提供者地址发生变化时,注册中心会通知服务消费者。
超时
- 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会直等待下去。
- 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
- dubbo利用超时机制来解决这个问题,设置-个超时时间, 在这个时间段内,无法完成服务访问,则自动断开连接。
- 使用timeout属性配置超时时间,默认值1000,单位毫秒
//timeout 超时时间 单位毫秒 retries 重试次数
@Service(timeout = 3000,retries=0)
超时的设置要配置在提供方,因为是哪个定义的超时就得知道超时的情况。这就是说,超时设置在被调用者内,是由被调用者内出现的问题引起的超时。
//@Service//将该类的对象创建出来,放到Spring的IOC容器中 bean定义
//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Service(timeout = 3000,retries = 2)//当前服务3秒超时,重试2次,一共3次
public class UserServiceImpl implements UserService {
int i = 1;
public String sayHello() {
return "hello dubbo hello!~";
}
public User findUserById(int id) {
System.out.println("服务被调用了:"+i++);
//查询User对象
User user = new User(1,"zhangsan","123");
//数据库查询很慢,查了5秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return user;
}
}