目录

Dubbo基础

Dubbo架构图

节点角色说明

调用关系说明

Dubbo高级

Dubbo分层架构概述

分层说明

适配器类原理

动态编译原理

Dubbo的线程池

服务降级策略

集群容错

负载均衡策略

隐式参数传递


Dubbo是阿里巴巴开发的一个开源的高性能RPC调用框架,致力于提供高性能和透明化的RPC远程调用服务解决方案

Dubbo基础

Dubbo架构图

节点角色说明

节点角色 节点说明
Provider 服务提供者。负责暴露提供的服务,并将服务注册到服务注册中心
Consumer 服务消费者。通过RPC远程调用服务提供者提供的服务
Registry 服务注册中心。负责服务注册与发现
Monitor 监控中心。统计服务的调用次数和调用时间
Container 服务运行容器。

调用关系说明

     0.start:container服务容器负责启动、加载、运行服务提供者

  1. register:Provider服务提供者在启动时会将自己提供的服务注册到服务注册中心
  2. subscribe:Consumer服务消费方在启动时会去服务注册中心订阅自己需要的服务的地址列表,然后服务注册中心异步把消费者需要的地址列表返回,服务消费者根据路由规则和负载均衡算法选择一个服务提供者进行调用
  3. notify:当消费者订阅的服务发生变更时,会触发通知
  4. invoke:具体调用
  5. count:在内存中统计调用次数和调用时间,每隔一分钟将统计数据发送到监控中心

Dubbo高级

Dubbo分层架构概述

分层:每一层各司其职,专注于实现本层的业务逻辑;上层依赖下层提供的功能,下层的改变对上层透明;每一层都是可被替换的组件

分层说明:

  • Service和Config为API接口层:用于让Dubbo使用方方便地发布服务和引用服务

  • Proxy服务代理层:主要对消费端使用的接口进行代理,把本地服务透明的转为远程服务;对提供方的接口实现类进行代理,把实现类转换为Wrapper类(目的:减少反射调用)

  • Registry服务注册中心层:主要功能是封装服务地址的注册与发现逻辑

  • Cluster路由层:封装服务提供者的路由规则、负载均衡、集群容错的实现,并桥接服务中心

    负载均衡扩展接口LoadBalance对应的实现类有:RandomLoadBalance(随机)、RoundRobinLoadBalance(轮询)、LeastActiveLoadBalance(最小活跃数)、ConsistentHashLoadBalance(一致性Hash)等

    集群容错扩展接口Cluster对应的实现类有:FailoverCluster(失败重试)、FailbackCluster(失败自动恢复)、FailfastCluster(快速失败)、FailsafeCluster(失败安全)、ForkingCluster(并行调用)等

  • Monitor监控层:用来统计调用的次数和消耗时长

    扩展接口为MonitorFactory,实现类为DubboMonitorFactory

    可以实现MonitorFactory扩展接口,实现自定义监控统计策略

  • Protocol远程调用层:封装RPC调用逻辑

    扩展接口为Protocol,实现类有RegistryProtocol、DubboProtocol、InjvmProtocol

  • Exchange信息交换层:封装请求响应模式,同步转异步

    扩展接口为Exchanger,实现类有HeaderExchanger等

  • Transport网络传输层:将Mina和Netty抽象为统一接口

    扩展接口Channel,实现类有NettyChannel、MinaChannel

    扩展接口Transport,实现类有NettyTransport、MinaTransport等

    扩展接口Codec2,实现类有DubboCodec、ThriftCodec等

  • Serialize数据序列化层:提供可复用的一些工具

    扩展接口Serialization,实现类有DubboSerialization、FastJsonSerialization、Hessian2Serialization、JavaSerialization等

    扩展接口ThreadPool,实现类有FixedThreadPool、CachedThreadPool、LimitedThreadPool等

适配器类原理

一个扩展接口可以有多个实现类,具体选择哪一个实现类,就是适配器类要做的事情 以Dubbo提供的扩展接口Protocal为例:Dubbo会使用动态编译技术为Protocal生成适配器类Protocal$Adaptive的对象实例。当需要使用Protocol的实例时,实际是通过调用Protocal$Adaptive实例对象的export()方法并根据URL中的协议类型参数来获取具体的实现类

动态编译原理

动态编译:在JVM运行过程中把源文件编译为字节码文件 Dubbo提供了一个扩展接口Compiler,对应的实现类有JavassistCompiler、JdkCompiler

@SPI("javassist")
public interface Compiler {Class<?> compile(String var1, ClassLoader var2);
}

首先从如何使用动态编译生成扩展接口对应的适配器类入手,打开ExtensionLoader的createAdaptiveExtensionClass(),该方法将源文件动态编译成Class,然后通过Class.newInstance()生成对象实例

private Class<?> createAdaptiveExtensionClass() {//生成扩展接口对应的适配器类的源码,其返回结果是一个字符串String code = (new AdaptiveClassCodeGenerator(this.type, this.cachedDefaultName)).generate();//选择类加载器ClassLoader classLoader = findClassLoader();//得到compiler的一个具体实现类Compiler compiler = (Compiler)getExtensionLoader(Compiler.class).getAdaptiveExtension();//编译器编译源码,生成适配器类的Class对象return compiler.compile(code, classLoader);}

小结:Dubbo为每个扩展接口生成对应的适配器类的源码,然后选择具体的动态编译器类对源码进行编译以生成适配器类的Class对象,然后就可以通过Class.newInstance()生成对象实例

Dubbo的线程池

Dubbo提供了线程池扩展接口ThreadPool,该扩展接口有如下一些实现:

  • FixedThreadPool:创建一个固定个数线程的线程池

  • LimitedThreadPool:创建一个线程池,池中的线程个数动态增加,但不会超过配置的最大值。

    注:空闲线程不会被回收,会一直存在

  • EagerThreadPool:创建一个线程池,当所有核心线程都处于忙碌状态时,将创建新的线程来执行新任务

  • CachedThreadPool:创建一个自适应线程池,当线程空闲1分钟时,线程会被回收;当有新请求到来时,会创建新线程

服务降级策略

如果URL中包含mock字段,如果值以force开头,则说明设置了forck:return 降级策略,此策略会返回mock值,而不发起远程调用;如果其值以fail开发,则说明设置了fail:return降级策略,那么会先发起远程调用。如果远程调用成功,则返回远程调用结果,如果远程调用结果失败,则返回mock值

集群容错

Dubbo提供了以下集群容错模式:

  • Failover Cluster:失败重试

    当服务消费者调用服务提供者失败后,会自动切换到其他服务提供者进行重试,这通常用于读操作或者具有幂等的写操作。重试会带来更长的延迟,可以通过retries=2来设置重试次数

  • Failfast Cluster:快速失败

    当服务消费者调用服务提供者失败后,立即报错。这种模式通常用于非幂等性的写操作

  • Failsafe Cluster:安全失败

    当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作

  • Failback Cluster:失败自动恢复

    当服务消费端调用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作

  • Forking Cluster:并行调用

    当消费者调用一个接口方法后,Dubbo Client会并行调用多个服务提供者,只要其中有一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源,可通过forks="4"来设置最大并行数

  • Broadcast Cluster:广播调用

    当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台服务器调用异常则标志这次调用失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息

负载均衡策略

Dubbo提供了多种负载均衡策略,默认为random随机调用,提供的负载均衡策略如下:

  • Random LoadBalance:随机策略。按照概率设置权重,比较均匀,且可以动态调节提供者的权重
  • RoundRobin LoadBalance:轮询策略。按权重设置轮询比率。存在执行比较慢的服务提供者堆积请求的情况
  • LeastActive LoadBalance:最少活跃调用数。如果每个提供者的活跃数相同,则随机选择一个。每个服务提供者维护着一个活跃数计数器,用来记录当前同时处理请求的个数,也就是并发处理任务的个数。这个值越小,说明提供者处理的速度越快或者当前机器的负载比较低,所以路由选择时就选择活跃度最低的提供者
  • ConsistentHash LoadBalance:一致性Hash策略。一致性Hash可以保证相同参数的请求总是发给同一个提供者,且当某一台机器宕机时,原本发往这台机器的请求将基于虚拟节点平摊给其他提供者,这样不会引起大范围的变动

隐式参数传递

Dubbo提供了隐式参数传递的功能,即服务调用方可以通过RpcContext.getContext().setAttachment()方法设置附加属性键值对,然后设置的键值对可在服务提供方方法内获取

【博学谷学习记录】超强总结,用心分享|【探花交友】Dubbo概要相关推荐

  1. [博学谷学习记录]超强总结,用心分享|第07节 常用的API-----笔记篇

    目录 1.API 1.1 API概述-帮助文档的使用 1.2 键盘录入字符串 2. String类 2.1 String概述 2.2 String类的构造方法 2.4 创建字符串对象的区别对比 2.5 ...

  2. {博学谷学习记录} 超强总结,用心分享|狂野架构师-前置互联网架构演变过程

    本章以系统架构,数据架构,两种维度来进行讲解 目录 1 系统架构 1,1 单体架构 1.2 中台战略 2 数据库架构 2,1 单体架构 2.2 主从读写 2.3 分库分表 3 总结 1 系统架构 1, ...

  3. [博学谷学习记录]超强总结,用心分享|架构 Nacos入门

    提示:学习笔记 欢迎指点 文章目录 前言 一.Nacos安装 二.Nacos服务注册与发现 1.服务提供者Provider 2.服务消费者Consumer 三.Nacos作为配置中心 前言 Nacos ...

  4. [博学谷学习记录]超强总结,用心分享|架构 敏捷 - 开发管理之道

    提示:学习笔记 欢迎指点 文章目录 1.敏捷开发思想之道 2.面向对象开发之道 3.敏捷学习之道 1.敏捷开发思想之道 一名敏捷开发者,敏捷思想的掌握自然首当其冲.在敏捷开发实施的过程中,我们虽然不是 ...

  5. [博学谷学习记录]超强总结,用心分享|第16节 集合续-----笔记篇

    目录 1.HashSet集合 1.1HashSet集合概述和特点[应用] 1.2HashSet集合的基本应用[应用] 1.3哈希值[理解] 1.4哈希表结构[理解] 1.5HashSet集合存储学生对 ...

  6. [博学谷学习记录] 超强总结,用心分享|陌陌综合案例

    注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flin ...

  7. [博学谷学习记录]超强总结,用心分享|Hive的压缩格式

    压缩格式 工具 算法 文件扩展名 是否可切分 DEFAULT 无 DEFAULT .deflate 否 Gzip gzip DEFAULT .gz 否 bzip2 bzip2 bzip2 .bz2 是 ...

  8. [博学谷学习记录]超强总结,用心分享|软件测试之计算机基础(一)

    本周开始学习软件测试,而我也即将开始在平台记录我的学习之路.我会把我的个人心得及掌握的知识发布在此平台,俗话说最好的输入就是输出,希望在输出的同时能有更多的收获,也希望与大家多多交流. 为了更好的学习 ...

  9. [博学谷学习记录]超强总结,用心分享|人工智能机械学习基础知识线性回归总结分享

    1.线性回归的核心是参数学习,线性回归和回归方程(函数)有关 2.线性回归是目标值预期是输入变量的线性组合 3.欠拟合的产生原因是学习到数据的特征过少 4.多元线性回归中的"线性" ...

  10. [博学谷学习记录] 超强总结,用心分享|JavaEE就业课-尊享无忧+Java基础语法|面向对象(1wk)

    学习笔记目录 目录 学习笔记目录 前言 一.变量 1. 关键字:被java赋予特殊含义的字符 2. 常量:不会发生改变的量(数据)​编辑 3. 变量:内存中的存储空间. 4. 类型转换 5. 算术运算 ...

最新文章

  1. RasberryPi快速启动(适合首次接触树莓派学习者)
  2. mockjs针对value生成随机数值(随机字符串,数值,日期,url,图片地址,email,ip等)
  3. 【Python】Error:'int' object is not callable
  4. 【熊猫多模式站群开发日志】 优化了关键词调度和模板调度
  5. Java 垃圾回收机制(GC)简述
  6. resin java_让resin4自动编译java文件
  7. kindle型号查询
  8. 计算机桌面怎么改为d盘,win7怎么把桌面文件夹路径改为d盘
  9. 眼镜计算机检查,电脑验光
  10. PCB设计1 模块间的隔离
  11. SQL Sever 数据库视频 (一) (SQL基础及管理工具)
  12. mysql:列类型之decimal、numeric
  13. 2018年前端开发回顾
  14. C++上机实验3-个人所得税计算器
  15. 插件自动解决谷歌翻译用不了,win、mac、linux通用,附链接
  16. ISO 8583报文
  17. 年终总结PPT 注意事项
  18. 强大的Python分析5000+抖音大V,几行代码发现大家都喜欢这类视频【源码分享】
  19. 新版本ubuntu13.10软件安装
  20. Efficient RANSAC for Point-Cloud Shape Detection 点云形状检测的高效RANSAC法

热门文章

  1. PhotoShop简单案例(2)——利用时间轴功能制作制作省略号GIF动画
  2. SpringBoot中实现简单策略模式
  3. cocos2d-x 文本框
  4. 〖Python APP 自动化测试实战篇⑧〗- 实战 - appium 模拟手机滑动操控的操作
  5. window.print()打印时出现网页的链接等信息的页眉页脚,去除方法
  6. gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)
  7. db2界面调用存储过程_DB2 存储过程调用 存储过程
  8. 【ZYNQ-FPGA】zynq学习笔记(一)——使用ILA进行硬件调试
  9. js小工具-给多行文本框添加字符统计
  10. Word自带公式编辑器卡死的解决办法