Dubbo 高级特性

本文介绍了Dubbo框架中如何通过序列化User类进行服务交互,包括依赖dubbo-pojo模块,实现Serializable接口,以及配置超时、重试、集群容错、负载均衡和服务降级策略。
摘要由CSDN通过智能技术生成

序列化

  • 服务提供者和消费者在传输 Java 对象时需要对对象进行序列化和反序列化,Dubbo 内部已经封装了该过程
  • 只需要在定义 pojo 类时实现 Serializable 接口即可,一般会定义一个公共的 pojo 模块
  1. 新建 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>
  1. 创建 User 类继承 Serializable 接口
@Data
public class User implements Serializable {

    private String name;
    private int age;
}
  1. dubbo-interface 模块依赖 dubbo-pojo 模块,添加如下方法
User getUser();
  1. dubbo-service 模块实现 getUser()
@Override
public User getUser() {
    User user = new User();
    user.setAge(20);
    user.setName("小明");

    return user;
}
  1. dubbo-web 模块调用 dubbo-service 的 getUser()
@RequestMapping("/getUser")
public User getUser(){
    return quickStartService.getUser();
}
  1. 测试
// 访问路径: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
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值