Dubbo学习笔记

Dubbo 是阿里巴巴于 2008 年开源的一款高性能、轻量级 RPC 框架。它致力于提供高可扩展性和可靠消息服务的 SOA(面向服务体系结构) 中间件,可以用于解决分布式架构下的服务治理与远程通信问题。

Dubbo提供了服务注册中心、集群容错、负载均衡等核心特性,使服务调用像本地调用一样透明便捷。官方还提供了 Java、Golang 等多语言 SDK,使其支持更加丰富的服务治理功能。

Dubbo工作原理在这里插入图片描述

  • 先启动服务提供者,服务会注册到注册中心上(包括服务调用的IP、端口以及URL路径)
  • Dubbo官方使用Zookeeper为注册中心
  • consumer想要调用服务就进行发现服务,去注册中心获取,获取完就可以进行调用
    在这里插入图片描述

1.服务启动时,服务提供者和服务消费者根据配置信息会连接到注册中心,分别向注册中心去订阅和注册服务。
2.注册中心会根据订阅关系去返回服务提供者的信息到服务消费者,同时服务消费者会把服务提供者的信息缓存到本地,如果信息发生变更,消费者会收到注册中心的一个推送去更新本地的缓存。
3.服务消费者会生成代理,同时根据负载均衡策略去选择一台目标服务提供者,并且定向向Monitor记录接口的调用次数和时间信息。
4.拿到代理对象后,服务消费者通过代理对象发起接口的一个调用。
5.服务提供者收到请求后会根据数据进行反序列化,然后通过代理调用具体的接口的一个实现,这是整个dubbo的一个原理和实现过程。

分层模型

Dubbo是一个轻量级、高性能的开源 RPC框架,它由十层模型来构成,整个分层的依赖如下图。也可以把Dubbo理解成三层模型:

  • Business业务逻辑层:由我们自己来提供接口和实现,还有一些配置信息。
  • RPC调用的核心层:负责封装和实现整个RPC的调用过程、负载均衡、集群容错等核心功能。
  • remoting层:是对网络传输协议和数据转化的一个封装。
    在这里插入图片描述

常用注解

  • @Service 主要用于服务提供者
  • @Reference 主要用于服务消费者
    • retires:重试次数,默认为0
    • timeout:服务超时时间,单位:毫秒
    • version:服务版本,与服务提供者保持一致,如果有多个版本的服务提供者可以动态选择
    • group:服务分组,当一个接口有多个实现的,可以使用分组进行区分,必须和服务提供方保持一致
    • loadbalance:负载均衡策略,参数值为:random(随机), roundrobin(轮询), leastactive(最少活跃调用)
    • url:点对点直连服务提供者的地址,可以绕过注册中心。因为在dubbo启动之后,注册中心宕掉也可以通过本地缓存选择服务提供者进行调用,所以绕过注册中心,直连服务提供者也是可以的。
    • registry:指定注册中心注册获取服务列表,多个注册中心的话使用逗号隔开。
    • actives:每个服务消费者每个服务方法最大并发调用数。
    • protocol:只调用指定协议的服务提供方

特性

dubbo-admin

dubbo-admin 采用标准的 SpringBoot 和前后端分离的架构设计, 充当Dubbo框架中的Monitor监控中心
同时提供了:服务治理、服务查询、服务测试等功能。

  • 服务管理
    • 包括消费者/服务者的服务查询、服务上下线、元数据展示。
  • 服务测试
    • 测试功能,可以通过泛化调用,在控制台上调用真实的服务提供者。
  • 服务治理
    • 动态配置,权重调整,负载均衡,服务统计

序列化

在Dubbo中,服务消费者和服务提供者通常不在同一个进程中,可能甚至不在同一台机器上。
这就需要将数据在网络中传输,因此Dubbo需要一种序列化机制来将Java对象转换为字节流,以便在网络中传输。
序列化的优势:

  • 减小内存空间和网络传输的带宽
  • 分布式的可扩展性
  • 通用性,接口可共用。
    public class User implements Serializable {}

地址缓存

  • dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,所以当注册中心挂了,服务还可以正常访问。
  • 当服务提供者地址发生变化时,注册中心会通知服务消费者更新服务的地址缓存。

超时&重试

超时:
用户访问服务消费者,消费者创建线程来访问服务提供者,服务提供者将数据返回给消费者,消费者再将数据封装一下交给用户。但是当服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。若在某个峰值时刻,大量的用户请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
超时:

  • dubbo利用超时机制来解决,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
  • 使用timeout属性配置超时时间,默认值1000,单位毫秒。

重试:
如果出现网络抖动,则用户的请求就会失败,Dubbo提供重试机制重新发送请求,来避免类似问题的发生。
通过在注解@DubboService中设置retries属性来设置重试次数,默认为2次。
注意:只有在服务请求超时的之后才会重试

负载均衡

  • 加权随机(默认)
  • 加权轮训
  • 一致性hash
  • 加权最少活跃数
  • 最少活跃数
    集群容错

多版本

通过在服务提供者@DubboService注解中对version属性来设置,和在服务消费者@DubboReference注解中调用同一个接口的不同版本(同一个接口可以有不同的实现类),从而可以实现灰度发布。
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

负载均衡

通过在消费者注解@DubboReference中设置属性loadbalance来选择负载均衡的策略

  • Random:按权重随机,默认值。按权重设置随机概率。
  • RoundRobin:按权重轮询。
  • LeastActive:最少活跃调用数(选择性能好的服务器),相同活跃数的随机。
  • ConsistentHash:一致性Hash,相同参数的请求 总是发到同一提供者。
  • 最短响应时间的权重随机,会计算目标服务的请求响应时间,根据响应时间最短的服务来配置更高的权重

集群容错

当服务消费者调用服务提供者集群中的某一个提供者发生错误时,dubbo提供了很多集群容错的策略,通过在消费者注解@DubboReference中设置cluster属性来选择集群容错模式 。
在这里插入图片描述

服务降级

将不太重要的服务关掉,释放资源来保证核心服务能正常的运行
服务降级方式:

  • mock=force:return null 表示消费方对该服务的方法调用都直 接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
  • mock=fail:return null表示消费方对该服务的方法调用在失败 后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
    在消费者的@DubboReference注解的mock属性中选择降级策略,还可以在Dubbo Admin控制台配置降级规则。

参考:
Dubbo3 官方文档
Dubbo 官方文档

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值