序列化
- 服务提供者和消费者在传输 Java 对象时需要对对象进行序列化和反序列化,Dubbo 内部已经封装了该过程
- 只需要在定义 pojo 类时实现 Serializable 接口即可,一般会定义一个公共的 pojo 模块
- 新建 dubbo-pojo 模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubbo_study</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-pojo</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
- 创建 User 类继承 Serializable 接口
@Data
public class User implements Serializable {
private String name;
private int age;
}
- dubbo-interface 模块依赖 dubbo-pojo 模块,添加如下方法
User getUser();
- dubbo-service 模块实现 getUser()
@Override
public User getUser() {
User user = new User();
user.setAge(20);
user.setName("小明");
return user;
}
- dubbo-web 模块调用 dubbo-service 的 getUser()
@RequestMapping("/getUser")
public User getUser(){
return quickStartService.getUser();
}
- 测试
// 访问路径:http://localhost:8001/quickStart/getUser
{
"name": "小明",
"age": 20
}
地址缓存
- 服务消费者在第一次调用服务提供者时会将地址缓存到本地,之后再调用时不会再访问注册中心
- 所以注册中心挂了不意味着服务就没法正常访问了
- 当服务提供者地址发生变化时,注册中心会通知服务消费者
超时与重试
- 服务消费者在调用服务提供者时发生阻塞,如果服务消费者一直等待,就会导致在某个峰值时刻,大量请求同时到达消费者,造成大量的线程堆积,消耗光消费者服务器的资源,进而造成雪崩
- Dubbo 提供了超时机制解决上述问题,我们可以设置一个超时时间,如果超过该时间还没完成服务访问,则自动断开连接并抛出异常;通过 timeout 属性设置超时时间,默认 1000 ,单位毫秒
- 设置超时时间后,如果在某次服务访问时正好发生了网络抖动,导致服务无法访问,也会自动断开连接,导致用户体验下降,Dubbo 提供了重试机制来解决上述问题;通过 retries 属性设置重试次数,默认重试 2 次
- timeout 和 retries 属性在服务消费者的 @Reference 注解和服务提供者的 @Service 注解中都可以配置,并且消费者的配置会覆盖提供者的配置,一般建议 timeout 属性配置在提供者,retries 属性配置在消费者
集群容错
- 相同服务应用名称的服务提供者自动构成集群
- 通过 @Reference 注解的 cluster 属性指定集群容错策略
- FailoverCluster :默认值,失败重试,当出现失败时重试其他服务器
- FailfastCluster :快速失败,只发起一次调用,失败立即报错
- FailsafeCluster :失败安全,出现异常时直接忽略,返回一个空结果
- FailbackCluster :失败恢复,后台记录失败请求,定时重发,直到成功为止
- ForkingCluster :并行调用多个服务器,第一个成功时立即返回
- BroadcastCluster:逐个调用所有提供者,任意一台报错则报错
负载均衡
- 通过 @Reference 注解的 loadbalance 属性指定负载均衡策略
- Random :默认值,按权重随机。权重通过 @Service 注解的 weight 属性配置,默认 100
- RoundRobin :按权重轮询
- LeastActive :最小活跃调用数
- ConsistentHash:一致性 Hash ,相同参数的请求总会发送到同一提供者
服务降级
-
服务消费者在调用服务提供者时做出指定动作,可以屏蔽某个业务保证核心业务的正常访问
-
通过 @Reference 注解的 mock 属性指定服务降级策略
- force:return null :直接返回 null ,不发起远程调用
- fail:return null :出错后返回 null