欢迎来到我的博客来阅读我写的文章,希望我写的文章能帮助到大家!
看到错误什么的欢迎指出来,有不足请补充!

Dubbo(服务框架)

· 分布式系统中相关概念 · Dubbo概述 · Dubbo快速入门 · Dubbo高级概述

一、分布式系统中相关概念

大型互联网项目架构目标衡量网站的性能指标:

  1. 响应时间: 指执行一个请求从开始到最后收到响应花费的总时间
  2. 并发数: 指系统同时能处理的请求数量
    • 并发连接数:指时客户端向服务器发送请求,并建立了 TCP链接,每秒钟服务器链接的总TCP数量。
    • 请求数: 也称为QPS(Query Per Second)指每秒多少请求。
    • 并发用户数: 单位时间内有多少用户。
  3. 吞吐量: 指单位时间内系统能处理的请求量
    • QPS:Query Per Second每秒查询数
    • TPS:Transactions Per Second每秒事务数
    • 一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程,客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务数。
    • 一个页面的一次访问,就只会形成一个 TPS ,但一次页面请求可能会产生多次对服务器的请求,就会有多少个 QPS
      注意:(QPS>并发连接数>TPS)
    • 高性能:提供快速访问的体验。
    • 高可用:网站服务一直可以正常访问。
    • 可伸缩: 通过硬件增加/减少,提高/降低处理能力。
    • 高可扩展:系统间耦合低,方便的通过新增/移除方式,增加/减少新的功能模块。
    • 安全性:提供网站安全访问和数据加密,安全存储等策略。
    • 敏捷性:随需求应变,快速响应。

架构的演进
单体架构 -> 垂直架构 -> 分布式架构 -> SOA架构 -> 微服务架构
Dubbo是SOA时代产物,Spring Cloud是微服务的产物!

二、Dubbo概述

2.1 Dubbo概念

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。
  • 致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案
  • Dubbo 基于消费端的自动服务发现能力,其基本工作原理如下图:
    图片

2.2 Dubbo架构

@Reference:@Reference(远程注入)

  • 从zookeeper注册中心获取服务提供者的访问URL。
  • 进行远程调用RPC。
  • 将结果封装成一个代理对象,给变量赋值。

三、Dubbo高级特性

3.1 Dubbo-Admin管理平台

dubbo-admin简介:

  • dubbo-admin管理平台,是图形化的服务管理页面。
  • 从注册中心中获取到所有的提供者/消费者进行配置管理。
  • 路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡等管理功能。
  • 是一个前后端分离的项目,前端Vue,后端Spring Boot。
  • 安装dubbo-admin其实就是部署该项目。

3.2 Dubbo常用的高级配置

Dubbo高级特性:

  • 序列化:两个机器传输数据,如何传输Java对象?
    图片
  • Dubbo内部已经将序列化和反序列化的过程内部封装了!
  • 我们只需要在定义pojo类时实现Serializable接口即可,一般我们会定义一个公共的pojo模块,让生产者和消费者都依赖该模块。

3.3 地址缓存

(面试) 注册中心挂了,服务是否可以正常访问?

  • 可以,因为Dubbo服务消费者在第一时间调用时会将服务提供方地址缓存到本地,以后再调用则不会访问注册中心。
  • 当服务提供者地址发生变化时,注册中心会通知服务消费者。

3.4 超时重试机制

3.4.1 超时

  • 服务消费者在调用服务提供者的时候发生了阻塞,等待的情形这个时候服务消费者会一直等待下去。
  • 在某个峰值时刻,大量的请求都在同一时刻请求服务消费者造成线程的大量堆积,势必会造成雪崩。
  • Dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则会自动断开链接。
  • 使用timeout属性配置超时时间,默认1000毫秒。

3.4.2 重试

  • 设置了超时时间,在这个时间段内无法完成服务访问则会断开。
  • 如果是出现网络抖动,则这一次请求就会失败。
  • Dubbo提供重试机制来避免类似问题发生。
  • 通过retries属性来设置重试次数,默认两次。

3.5 多版本

图片

  • 灰度发布:当出现新功能时,会让一部分用户使用新功能用户反馈没有问题,再进行所有用户迁移到新功能。
  • Dubbo中使用version属性来设置和调用同一个接口的不同版本。
    例如:
    1
    @Reference(version = "v2.0")

3.6 负载均衡

负载均衡策略(4种):
  • Random:按权重随机默认值,按权重设置随机概率。
  • RoundRobin:按权重轮询。
  • LeastActive:最少活跃调用数,相同活跃数随机。
  • consistentHash: 一致性Hash,相同参数的请求总是发到同一个提供者。

3.7 集群容错

  • Forking Cluster: 并行调用多个服务器,只要有一个成功即返回。
  • Failover Cluster: 失败重试。默认值当失败时重试其他服务器,默认重试两次,使用retries配置,一般用于读操作。
  • Failfast Cluster: 快速失败,只发起一次调用失败立即报错,通常用于写操作!
  • Failfase Cluster: 失败安全,出现异常时,直接忽略返回一个空结果。
  • Failback Cluster: 失败自动恢复,后台记录失败请求,定时重发。
  • Broadcast Cluster: 广播调用所有提供者,逐个调用。任意一台报错则报错。

3.8 服务降级

手画的图

1
@Reference(mock = "fail:return null")
  • mock = force : return null表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方无影响。
  • mock = fail : return null表示消费方对该服务的方法调用在失败后,再返回null值,不执行异常。用来容忍不重要的服务不稳定时对调用方的影响。