Dubbo 高级特性
序列化
- 服务提供者和消费者在传输 Java 对象时需要对对象进行序列化和反序列化,Dubbo 内部已经封装了该过程
- 只需要在定义 pojo 类时实现 Serializable 接口即可,一般会定义一个公共的 pojo 模块
- 新建 dubbo-pojo 模块
dubbo_study org.example 1.0-SNAPSHOT 4.0.0 dubbo-pojo org.projectlombok lombok
- 创建 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
(图片来源网络,侵删)(图片来源网络,侵删)
-
- 通过 @Reference 注解的 loadbalance 属性指定负载均衡策略
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...