热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dubbo的设计理念是什么

这篇文章主要讲解了“Dubbo的设计理念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Du

这篇文章主要讲解了“Dubbo的设计理念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dubbo的设计理念是什么”吧!

1、服务注册与发现机制

Dubbo的服务注册与发现机制如下图所示:

Dubbo的设计理念是什么

在Dubbo中存在4类角色:

  • Registry 注册中心。

  • Consumer 服务调用者、消费端。

  • Provider 服务提供者。

  • Monitor 监控中心。

具体的交互流程包括如下关键步骤:

  1. 服务提供者在启动的时候向注册中心进行注册。

  2. 消息消费者在启动的时候向注册中心订阅指定服务,注册中心将以某种机制(推或拉)模式告知消费端服务提供者列表。

  3. 当服务提供者数量变化(服务提供者扩容、缩容、宕机等因素),注册中心需要以某种方式(推或拉)告知消费端,以便消费端进行正常的负载均衡。

  4. 服务提供者、服务消费者向监控中心汇报TPS等调用数据,以便监控中心进行可视化展示等。

Dubbo官方提供了多种注册中心,接下来将以使用最为普遍的Zookeeper进一步介绍注册中心的原理。

首先我们来看一下Zookeeper注册中心中的数据存储目录结构,从目录结构来窥探其实现机制。 Dubbo的设计理念是什么

Dubbo Zookeeper注册中心,其目录组织结构为 /dubbo/{ServiceName},再每一个服务名称下会有4个目录:

  • providers 服务提供者列表。

  • consumers 消费者列表

  • routers 路由规则列表,关于一个服务可以设置多个路由规则。

  • configurators 动态配置条目。在Dubbo中可以在不重启消费者、服务提供者的前提下动态修改服务提供者、服务消费者的配置,例如修改线程的数量,超时时间等参数。

基于Zookeeper注册中心的实现细节如下:

  1. 服务提供者启动时会向注册中心注册,主要是在对应服务的providers目录下增加一条记录(临时节点),同时监听 configurators节点。

  2. 服务消费者启动时会向注册中心订阅,主要是在对应服务的consumers目录下增加一条记录(临时节点),同时监听 configurators、routers 目录。

  3. 由于当有新的服务提供者上线后 providers 目录会增加一条记录,消费者能立马收到一个服务提供者列表变化的通知,得以将最新的服务提供者列表推送给服务调用方(消费端);如果一个服务提供者宕机,由于创建的节点是临时节点,Zookeeper会将该节点移除,同样会触发事件,消费端得知最新的服务提供者列表,从而实现路由的动态注册与发现。

  4. 当Dubbo新版本上线后,如果需要进行灰度发布,可以通过dubbo-admin等管理平台添加路由规则,最终会写入到指定服务的router节点(持久节点),服务调用方会监听该节点的变化,从而感知最新的路由规则,将其用于服务提供者的筛选,从而实现灰度发布等功能。

  5. configurators 节点的运作机制与 router 节点一样,就不重复介绍。

扩展思考

1、如果注册中心全部宕机,对整个服务体系会有什么影响?

如果整个注册中心全部宕机,整个服务调用能正常工作,不会影响现有的服务消费者调用,但消费端无法发现新注册的服务提供者。

2、如果注册中心内存溢出或频繁发生 Full Gc,对整个集群又会带来什么影响呢?

如果频繁发生Full GC,并且如果Full GC的时间超过了Zookeeper会话的过期时间,将会造成非常严重的影响,会触发所有临时节点被删除,消费端将无法感知服务提供者的存在,影响服务调用,将大面积抛出 No provider 等错误。正所谓成也临时节点、败也临时节点

为了避免Full Gc带来的严重后果,用于Dubbo注册中心的Zookeeper,一定会要独享,并及时做好内存、CPU等的监控与告警。

2、服务调用

Dubbo的服务调用设计十分优雅,其实现原理如下图所示: Dubbo的设计理念是什么

服务调用,重点阐述客户端发起一个RPC服务调用时的所有实现细节,包括服务发现故障转移路由转发负载均衡等方面,是Dubbo实现灰度发布的理论基础。

2.1 服务发现

客户端在向服务端发起请求时,首先需要知道的是当前有哪些可用的服务提供者,通常有两种服务发现机制:

  • 静态化配置 不妨回想一下,在Dubbo等微服务框架出现之前,一个模块调用另外一个模块通常的做法是使用一个配置文件,将服务提供的列表配置配置在配置文件中,客户端从按照配置文件中的列表进行沦陷。

    弊端也非常明显:如果需要调用的服务众多,配置文件会变得臃肿,对扩容缩容的管理、机器宕机等变更不友好,管理非常困难。

  • 动态发现

    通常基于注册中心实现服务的注册与动态发现,由于上文已详细介绍,在这里就不累述。

2.2 负载均衡

客户端通过服务发现机制,能动态发现当前存活的服务提供者列表,接下来要考虑的是如果从服务提供者列表中选择一个服务提供者发起调用,这就是所谓的负载均衡,即 LoadBalance。

在Dubbo中默认提供了随机、加权随机、最少活跃连接、一致性Hash等负载均衡算法。

2.3 路由机制

其实Dubbo中不仅提供了负载均衡机制,还提供了智能路由机制,这是实现Dubbo灰度发布的理论基础。

所谓的路由机制,是在服务提供者列表中,再设置一定的规则,进行过滤选择,负载均衡时只从路由过滤规则筛选出来的服务提供者列表中选择,为了更加形象的阐述路由机制的工作原理,给出如下示意图:

Dubbo的设计理念是什么

上述设置了一条路由规则,即查询机构ID为102的查询用户请求信息,请发送到新版本,即192168.3.102上,那主要在进行负载均衡之前先执行路由规则,从原始的服务提供者列表者按照路由规则进行过滤,从中挑选出符合要求的提供者列表,然后再进行负载均衡。

路由机制的核心理念:在进行负载均衡之前先对服务提供者列表运用路由规则,得出一个参与负载均衡的提供者列表。

2.4 故障转移

远程服务调用通常涉及到网络等因素,客户端向服务提供者发起RPC请求调用时并不一定100%成功,当调用失败后该采用何种策略呢?

Dubbo提供了如下策略:

  • failover 失败后选择另外一台服务提供者进行重试,重试次数可配置,通常适合实现幂等服务的场景

  • failfast

    快速失败,失败后立即返回错误。

  • failsafe 调用失败后打印错误日志,返回成功,通常用于记录审计日志等场景

  • failback 调用失败后,返回成功,但会在后台定时无限次重试,重启后不再重试。

  • forking 并发调用,收到第一个响应结果后返回给客户端。通常适合实时性要求比较高的场景,但浪费服务器资源,通常可以通过forks参数设置并发调用度。

3、线程派发机制

Dubbo的通信线程模型入下图所示: Dubbo的设计理念是什么

3.1 网络通信协议

网络传输通常需要自定义通信协议,通常采用 Header + Body 的协议设计理念,并且 Header 长度固定,并且包含一个长度字段,用于记录整个协议包的大小。

网络传输为了提高传输效率,可以采取对传输数据进行压缩,通常是对 body 进行序列化与压缩。

Dubbo支持目前支持 java、compactedjava、nativejava、fastjson、fst、hessian2、kryo等序列化协议。

3.2 线程派发机制

在Dubbo中默认会创建200个线程用于处理业务方法,所谓的线程派发机制就是IO线程如何决定何种请求转发到哪类线程中执行。

目前Dubbo中所有的心跳包、网络读写在IO线程中执行,无法通过配置进行修改。

Dubbo提供了如下几种线程派发机制(Dispatcher):

  • all 所有的请求转发到业务线程池中执行(除IO读写、心跳包)

  • message 只有请求事件在线程池中执行,其他在IO线程上执行。

  • connection 请求事件在线程池中执行,连接、断开连接事件排队执行(含一个线程的线程池)

  • direct

    所有请求直接在IO线程中执行。

> 温馨提示:有关线程模型,网络通信模式,可以参考笔者如下这篇文章。

线程派发机制之所有会有多种策略,主要是考虑线程切换带来的开销是否能容忍,即线程切换带来的开销小于多线程处理带来的提升。

例如在Dubbo中,对心跳包只需直接返回PONG包(OK),逻辑非常简单,如果将其转换到业务线程池,并不能带来性能提升,反而因为需要线程切换,带来性能损耗,故在IO线程中直接发送响应包是一个非常可取的做法。

在网络编程中需要遵循一条最佳实践IO线程中不能有阻塞操作,阻塞操作需要转发到业务线程池

感谢各位的阅读,以上就是“Dubbo的设计理念是什么”的内容了,经过本文的学习后,相信大家对Dubbo的设计理念是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程笔记,小编将为大家推送更多相关知识点的文章,欢迎关注!


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
龙猫123456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有