Dubbo
文章平均质量分 92
贝克街的流浪猫
公众号: 贝贝猫技术分享
展开
-
Dubbo设计思想
引言之前在开发第一个项目的时候用到了Dubbo,但是对其实现原理并没有深入研究,最近想要总结一下关于RPC的相关知识,所以就选择Dubbo作为切入点,来一窥服务治理型RPC的设计。本文主要介绍 Dubbo 设计上的一些思想。背景随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的原创 2021-03-30 08:40:40 · 238 阅读 · 0 评论 -
Dubbo SPI 简介
引言前面,我们已经介绍了 Dubbo 设计上的一些思想,本文主要介绍 Dubbo 在 SPI(Service Provider Interface)上的一些改进。SPI我们知道Dubbo的设计原则是微内核+富扩展,它的内核部分就是将各个模块组装起来,而各个模块都抽象称为接口,这样替换任意模块都非常方便。接下来就让我们一起来看一看Dubbo的扩展点是如何设计的。来源Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。原创 2021-03-30 08:40:35 · 198 阅读 · 0 评论 -
Dubbo SPI 实现
引言前文中,我们已经介绍 Dubbo SPI 和 Java SPI 的区别以及一些增强,本文我们着重介绍 Dubbo SPI 的实现方式。实现原理SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过原创 2021-03-30 08:40:31 · 210 阅读 · 0 评论 -
Dubbo实现方案总览
引言从这篇文章开始,我们就开始深入到 Dubbo 的实现细节中,本文旨在一个较高的层面上总览 Dubbo 的实现方案。总览首先,我们简单的介绍一下各个功能点的实现,然后再深入代码中,详细分析每个功能点的细节。解析服务基于 dubbo.jar 内的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler。所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,原创 2021-03-30 08:40:25 · 212 阅读 · 0 评论 -
Dubbo服务暴露
引言通过前面的文章,想必大家对 Dubbo 的整体实现思想已经有了一个全面的认识,本文中,我们主要深入介绍服务暴露的实现细节。暴露服务方式Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。起点服务导出的入口方法是 ServiceBean原创 2021-03-29 09:03:21 · 173 阅读 · 0 评论 -
Dubbo服务引用
引言前面的文章中,我们已经详细介绍了服务暴露的相关细节,本文中,我们主要深入介绍服务引用的实现细节。引用服务方式在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,接下来我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,服务消费者还需要经历 Invoker 创建、代理类创建等步骤。Dubbo 服务引用的转载 2021-03-29 09:03:16 · 281 阅读 · 0 评论 -
Dubbo服务目录
引言前面的文章中,我们分别介绍了服务暴露与服务引用的相关细节,本文中,我们来看一看上述两个过程的粘合剂服务目录的实现细节。服务目录在进行深入分析之前,我们先来了解一下服务目录是什么。服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。在一个服务集群中,服务提供者数量并不是一成不变的,如果集群中新增了一台机器,相应地在服务目录中就要新增一条服务提供者记录。或者,如果原创 2021-03-29 09:03:07 · 149 阅读 · 0 评论 -
Dubbo服务路由
引言当一个服务存在多个 Provider 时,势必就需要考虑服务路由问题,本文中,我们就来介绍 Dubbo 服务路由的实现细节。服务路由服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。Dubbo 目前提供了三种服务路由实现,分别为条件路由 ConditionRouter、脚本路由 ScriptRouter 和标签路由 TagRouter原创 2021-03-29 09:03:02 · 228 阅读 · 0 评论 -
Dubbo集群容错
引言本文中,我们将详细地介绍 Dubbo 在集群容错这个方向上所做出的努力。集群容错为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及原创 2021-03-29 09:02:57 · 132 阅读 · 0 评论 -
Dubbo负载均衡
引言本文中,我们将详细地介绍 Dubbo 在负载均衡这个方向上所做出的努力。负载均衡LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx原创 2021-03-29 09:02:51 · 161 阅读 · 0 评论 -
Dubbo Provider 函数执行过程
引言在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 的函数执行过程。服务调用过程在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。接下来我们将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收原创 2021-03-29 09:02:45 · 271 阅读 · 0 评论 -
Dubbo Consumer 发送请求
引言在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 发送请求的执行过程。消费方发送请求本节我们来看一下同步调用模式下,服务消费方是如何发送调用请求的。在深入分析源码前,我们先来看一张图。这张图展示了服务消费方发送请求过程的部分调用栈,略为复杂。从上图可以看出,经过多次调用后,才将请求数据送至 Netty NioClientSocketChannel。这样做的原因是通过 Exchange 层为框架引入 Request原创 2021-03-29 09:02:27 · 183 阅读 · 0 评论 -
Dubbo Provider 接收请求
引言在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 接收请求的执行过程。提供方接收请求前面说过,默认情况下 Dubbo 使用 Netty 作为底层的通信框架。Netty 检测到有数据入站后,首先会通过解码器对数据进行解码,并将解码后的数据传递给下一个入站处理器的指定方法。所以在进行后续的分析之前,我们先来看一下数据解码过程。这里直接分析请求数据的解码逻辑,忽略中间过程,如下:public class Exchang原创 2021-03-29 09:02:16 · 346 阅读 · 0 评论 -
Dubbo Provider 返回结果
引言在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Provider 返回结果的执行过程。返回调用结果服务提供方调用指定服务后,会将调用结果封装到 Response 对象中,并将该对象返回给服务消费方。服务提供方也是通过 NettyChannel 的 send 方法将 Response 对象返回。本节我们仅需关注 Response 对象的编码过程即可,这里仍然省略一些中间调用,直接分析具体的编码逻辑。public class Exch原创 2021-03-29 09:01:57 · 386 阅读 · 0 评论 -
Dubbo Consumer 接收返回值
引言在 Dubbo 系列文章的最后,我们回过头来看一下整个 RPC 过程是如何运作起来的,本文着重介绍整个调用链路中 Consumer 接收返回值的执行过程。接收调用结果服务消费方在收到响应数据后,首先要做的事情是对响应数据进行解码,得到 Response 对象。然后再将该对象传递给下一个入站处理器,这个入站处理器就是 NettyHandler。接下来 NettyHandler 会将这个对象继续向下传递,最后 AllChannelHandler 的 received 方法会收到这个对象,并将这个对象派原创 2021-03-28 10:47:28 · 572 阅读 · 0 评论