
dubbo
龚厂长
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
dubbo解析-RpcContext解析
本文基于dubbo 2.7.5版本代码dubbo提供了RpcContext上下文对象。我们可以使用该对象传递隐式参数,同时该对象也记录了一次调用的状态数据。先介绍如何传递隐式参数。RpcContext提供了attachments属性,客户端调用时,使用:RpcContext contentx=RpcContext.getContext();contentx.setAttachment("isTest","测试");//调用远程服务remoteService.service();服务端使.原创 2020-08-16 19:57:38 · 3123 阅读 · 0 评论 -
dubbo解析-回声测试实现原理
dubbo的回声测试功能作用是,当客户端正式访问服务端前通过回声测试,以了解服务是否可用或者网络是否畅通,而且还可以使用该功能对服务监控。dubbo的每个服务都自动实现了EchoService接口,使用方式也非常简单。原创 2020-08-08 21:36:22 · 939 阅读 · 0 评论 -
dubbo解析-详解心跳机制
dubbo的心跳发送是由Netty的IdleStateHandler对象处理的。该对象配置在netty的责任链里面,当发送请求或者收到响应时,都会经过该对象处理。在双方通讯开始后该对象会创建一些空闲检测定时器,用于检测收到请求会触发读事件、连接、发送请求会触发写事件。当在指定的空闲时间内没有收到读事件或写事件,便触发超时事件,然后IdleStateHandler将超时事件交给责任链里面的下一个handler处理,NettyClientHandler是客户端使用的,它收到事件后向对方发送一个心跳事件的请求。原创 2020-06-30 22:33:41 · 2689 阅读 · 0 评论 -
dubbo解析-详解日志适配原理
dubbo自身在运行的过程中也要打印日志,打印日志的框架有很多,那么dubbo是通过哪个框架打印日志的?本文研究一下dubbo的日志适配原理。先说一下如何使用指定的日志框架,可以使用如下配置:可以在配置文件中配置:dubbo.application.logger=slf4j 也可以在启动命令里:java -Ddubbo.application.loggerLoggerFactorydubbo默认是log4j 配置文件的设置值会覆盖启动命令的值。原创 2020-06-28 16:08:11 · 1108 阅读 · 0 评论 -
dubbo解析-详解令牌验证原理
过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者,另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。服务端启动的时候会监听注册中心的“/dubbo/接口名/configurators”节点,服务端的监听器OverrideListener收到修改后的配置,服务端会重新发布服务,并且重新注册信息。消费端启动的时候会监听注册中心的“/dubbo/接口名/providers”节点,当提供者启动完毕或者重新发布服务,都会修改该节点原创 2020-06-27 11:20:47 · 1279 阅读 · 4 评论 -
dubbo解析-线程dump原理解析
本文基于dubbo 2.7.5版本代码在一些场景中,比如服务端收到请求需要在业务线程池中处理请求时,dubbo需要通过ExecutorRepository创建线程池。在创建线程池的时候,dubbo设置了RejectedExecutionHandler,也就是当线程池满的时候,会调用RejectedExecutionHandler。dubbo提供了RejectedExecutionHandler的实现类AbortPolicyWithReport。当线程池满的时候,AbortPolicyWithRepor.原创 2020-06-26 22:25:42 · 1214 阅读 · 0 评论 -
dubbo解析-介绍服务端和客户端启动和服务调用步骤
前面的文章介绍了很多dubbo的各个组件,本文将对通过介绍启动和服务调用过程梳理一下这些组件,也让大家对dubbo的全局有一个了解。一、服务端启动二、客户端启动三、服务调用原创 2020-06-26 18:00:41 · 1254 阅读 · 0 评论 -
dubbo解析-详解服务目录的原理以及代码实现
服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。dubbo访问服务时,会先使用StaticDirectory从多个注册中心里面选择一个合适的注册中心,然后使用RegistryDirectory从多个分组中选择一个分组,最后使用StaticDirectory从分组的服务提供者集合里面选择一个合适的服务提供者,之后调用该提供者访问远程服务。原创 2020-06-18 17:17:34 · 947 阅读 · 0 评论 -
dubbo解析-解析线程模型
在RPC调用中,线程一共要做两件事:一是接受消息或者发送消息,也就是网络交互,这个可以认为是IO处理,二是处理业务,包括将请求转发给底层提供服务的对象,并且执行服务逻辑,这个可以认为是业务处理。这两件事可以使用不同的线程处理,也可以用相同的线程处理。由此便产生了不同的线程模型。本文将介绍线程模型中涉及到的配置以及各个实现类的功能原创 2020-06-13 18:59:47 · 646 阅读 · 0 评论 -
dubbo解析-扩展RPC协议(基于dubbo协议优化)
本文通过对dubbo协议的编解码器扩展,实现一个优化后的协议。由于dubbo将协议与编解码器绑定了,所以本文还扩展了dubbo协议。 1. 对报文体压缩,在报文头使用四个bit表示压缩格式,这样报文体可以使用的压缩算法最多可以有16种; 2. 优化status表示,status共有10个状态,4个bit可以表示16种状态,因此不在使用8个bit表示status字段,而使用4个bit; 3. RPC Request ID使用变长表示,RPC Request ID在原dubbo协议中使用long表示原创 2020-06-13 00:01:59 · 1225 阅读 · 2 评论 -
dubbo解析-dubbo协议如何使用netty完成了报文发送和接收
本文分析一下dubbo协议如何使用netty完成了报文的发送和接收,分为服务端和消费端解析源代码。下面的代码来自类NettyServer的doOpen方法,该方法完成netty服务端的启动,执行完该方法,netty就可以接收请求了。消费端代码来自类NettyClient(基于netty4),消费端netty启动分为两步,第一个步是启动netty(doOpen方法),第二步是建立与服务端的连接(doConnect方法)。 .原创 2020-06-09 22:57:03 · 1466 阅读 · 0 评论 -
dubbo解析-从dubbo协议分析如何设计RPC协议
本文介绍一下dubbo协议的组成,通过对dubbo协议的学习,为我们以后设计自己的RPC协议提供指导。也会从代码上介绍dubbo如何使用Netty。dubbo默认RPC协议是使用dubbo协议。dubbo协议分为协议头和协议体。协议头占16个字节,协议体是可变长的,协议体是具体的请求/响应数据。一、dubbo协议二、dubbo协议特性三、设计协议需要考虑的问题原创 2020-06-08 22:23:24 · 1226 阅读 · 0 评论 -
dubbo解析-消费端启动检查(check属性)
本文基于dubbo 2.7.5版本代码dubbo的客户端在启动的时候,默认检查是否有可用的远程服务,如果没有dubbo报如下异常:java.lang.IllegalStateException: Failed to check the status of the service XXX. No provider available for the service test.Process from the url zookeeper://localhost:2181/.....(省略) to t.原创 2020-06-06 16:29:00 · 3985 阅读 · 4 评论 -
dubbo解析-探讨dubbo稳定性
dubbo成功完成服务调用需要多个组件的参与,比如注册中心、配置中心、元数据中心、服务端提供服务。今天忽然想到一个问题,如果参与组件有任何一个宕机了,那么服务调用还会成功吗?或者有任何一个网络不通,消费端或者服务端能正常启动吗?接下来通过本文探讨这个问题。因为dubbo在2.7.5版本里面新增了云原生服务自省架构,所以接下来的分析分为传统架构和服务自省架构。原创 2020-06-03 22:30:03 · 759 阅读 · 0 评论 -
dubbo解析-不同参数设置方式之间的覆盖关系
dubbo可以通过多种方式配置。本文研究一下不同方式之间属性值的覆盖关系如何。 本文首先介绍五种配置方式:1. 系统属性,通过-D设置,或者环境变量 2. 配置中心3. XXXConfig API编程方式配置,可以通过springboot配置文件、Annotation注解设置XXXConfig的属性值4. 本地dubbo.properties配置文件5. 对于消费端来说,还有一些配置来自服务端。对每种方式都会举例。并介绍其优先级,最后分析代码介绍如何实现参数覆盖原创 2020-06-02 21:16:56 · 1097 阅读 · 0 评论 -
dubbo解析-关于dubbo架构设计的思考和总结
到现在为止,已经对dubbo的源代码分析了很多,看到了很多很好的设计,本文总结一下,以便对以后编码设计提供一些指导。本文将长期不断更新。一、dubbo优秀功能汇总1、SPI2、代码生成器3、时间轮二、dubbo设计的一些启示1、系统要提供尽可能多的配置2、多层级配置优先级3、合理的分层架构三、dubbo使用到的设计模式1、工厂模式2、代理模式3、装饰模式4、单例模式原创 2020-06-01 23:06:56 · 238 阅读 · 0 评论 -
dubbo解析-服务自省架构原理图
前面几篇文章详细介绍了dubbo云原生服务自省架构的各个组件,本文将详细介绍这些组件如何配合完成服务自省。这些组件涉及到了配置中心、服务发现、MetadataService原创 2020-05-30 21:27:08 · 1194 阅读 · 9 评论 -
dubbo解析-基于服务自省的ServiceDiscovery原理
dubbo在传统服务发现功能的基础上,提供了服务自省模式的服务发现。dubbo在启动的时候,会将dubbo实例注册到注册中心,注册中心的ip地址端口以及注册中心的类型由上面的第一行配置指定,这里的注册中心使用的是zk。dubbo将服务注册到本地的元数据中心,消费端启动时访问元数据中心,从元数据中心获得服务信息,然后创建连接服务端的Invoker对象。原创 2020-05-29 21:21:19 · 4899 阅读 · 0 评论 -
dubbo解析-详解配置中心
本文将介绍ConfigCenterBean的作用,如何读取配置中心的配置,以及如何监听配置中心。dubbo支持多种形式的配置中心,包括zk,consul,apollo等。dubbo也提供了访问各种配置中心的实现类,dubbo还提供了一些监听器,当配置中心的数据发生变化,这些监听器会监听到数据变化进而修改本地配置。原创 2020-05-27 00:39:02 · 8507 阅读 · 2 评论 -
dubbo解析-详解MetadataService
这篇文章介绍一个和元数据中心密切相关的接口MetadataService。可以这么说没有MetadataService,元数据中心就无法正常使用。本文主要分析WritableMetadataService的实现类:InMemoryWritableMetadataService和RemoteWritableMetadataService、RemoteWritableMetadataServiceDelegate。详细分析其方法原创 2020-05-19 17:45:55 · 10310 阅读 · 0 评论 -
dubbo解析-详解元数据中心MetadataReport
元数据中心是dubbo2.7版本之后新增的功能,主要是为了减轻注册中心的压力,将部分存储在注册中心的内容放到元数据中心。元数据中心的数据只是给自己使用的,改动不需要告知对端,比如服务端修改了元数据,不需要通知消费端。这样注册中心存储的数据减少,同时大大降低了因为配置修改导致注册中心频繁通知监听者,从而大大减轻注册中心的压力。本文将介绍如何配置启用元数据中心,还会介绍其实现原理并解析代码原创 2020-05-18 16:08:32 · 12125 阅读 · 0 评论 -
dubbo解析-详解监控Monitor的实现原理
DubboMonitor的作用总起来说是收集10项统计信息,然后使用定时任务将信息发送给监控中心。dubbo只提供了DubboMonitor实现,监控中心必须使用dubbo协议。如果收集的信息不符合要求,需要重新实现MonitorFactory和Monitor接口,并且在配置参数dubbo.monitor.address中指定协议。本文详细介绍DubboMonitor的创建以及send()、collect()方法的作用。原创 2020-05-16 18:32:49 · 3032 阅读 · 0 评论 -
dubbo解析-详解监控MonitorFilter的实现原理
dubbo将监控独立出一个监控层,但是我认为监控只能算作是dubbo的一个功能,可以监控服务的健康程度或者做服务治理,监控功能不是dubbo必须的,可以不开启监控。而且在运行过程中,监控宕机,也不会影响服务访问。dubbo提供了一个简单的监控中心,可以参考下面的文章。dubbo提供的监控中心只能满足简单的监控功能,对于复杂的需要自行开发。本文对监控中心不做过多介绍。原创 2020-05-16 11:59:49 · 1903 阅读 · 0 评论 -
Apache Dubbo 云原生服务自省架构设计
作者简介:小马哥@mercyblitz,Apache Dubbo PMC,Spring Cloud Alibaba项目架构师,《SpringBoot编程思想》作者。目前主要负责阿里巴巴集团中间件开源项目、微服务技术实施、架构衍进、基础设施构建等。小马哥发表了文章《Apache Dubbo 云原生服务自省架构设计》:这篇文章详细介绍了dubbo关于服务自省的设计与思考,提出了三种子架构: 服务注册与发现架构、元数据服务架构、事件驱动架构原创 2020-05-11 23:24:12 · 812 阅读 · 0 评论 -
dubbo解析-一文让你明白Route路由的来龙去脉
在dubbo中,Route是接口,每个实现类代表了一个路由规则,当客户端访问服务端时,dubbo根据路由规则筛选出合适的服务提供者列表,之后通过负载均衡算法再次筛选。router有四个实现类: ServiceRouter、 TagRouter、MockInvokersSelector、AppRouter。本文将详细讲解各个类的作用及功能。原创 2020-05-10 16:16:26 · 3018 阅读 · 0 评论 -
dubbo解析-DubboBootstrap启动过程详解
spring容器启动完毕后,会发布ContextRefreshedEvent事件,该事件会触发DubboBootstrap的start方法。start方法执行成功,意味着dubbo的启动结束。本文详细介绍start方法中调用的每个方法的功能及作用,介绍DubboBootstrap的启动流程。原创 2020-05-08 22:50:19 · 2568 阅读 · 0 评论 -
dubbo解析-DubboBootstrap初始化
在本文分析一下DubboBootstrap的initialize方法。该方法作用是初始化DubboBootStrap,而且在dubbo实例的生命周期中,只初始化一次。原创 2020-05-07 22:42:15 · 1904 阅读 · 0 评论 -
dubbo解析-DubboBootstrap在dubbo中的作用
DubboBootstrap主要处理dubbo所有的配置信息,功能主要有: 1. 持有ConfigManager、Environment对象并且对其初始化,这两个对象都是与配置相关的; 2. 更新配置中心配置对象ConfigCenterConfig的属性值; 3. 加载元数据中心对象; 4. 检查各个配置对象的属性值是否合法; 5. 注册java的关闭钩子; 6. 服务端服务的暴露。该对象在一个dubbo实例中只能有一个,通过静态方法getInstance获取。原创 2020-05-06 13:55:53 · 2591 阅读 · 0 评论 -
dubbo解析-ServiceRepository功能及属性详解
ServiceRepository是存储了所有服务端发布的服务、客户端需要访问的服务,通过ServiceRepository可以获取所有本dubbo实例发布的服务和引用的服务。里面包括三个字段:services、consumers、providers。作用分别是:services:类型是ConcurrentMap<String, ServiceDescriptor>,key是远程服...原创 2020-05-05 21:27:45 · 1451 阅读 · 0 评论 -
dubbo解析-服务降级原理、Mock功能实现
当远程服务不可用、网络异常或者远程服务执行异常,dubbo提供了Mock功能,可以实现服务降级。远程服务执行异常是远程服务执行过程中出现错误,向客户端返回Exception异常。dubbo实现该功能是在类MockClusterInvoker中完成,MockClusterInvoker实现了Invoker接口。在现有dubbo的SPI机制下,客户端发起任何远程调用,都必须通过MockCluste...原创 2020-05-04 15:38:27 · 1864 阅读 · 0 评论 -
dubbo解析-时间轮算法的实现HashedWheelTimer原理
本文介绍一下dubbo使用的时间轮算法HashedWheelTimer。dubbo里面涉及到定时任务调度的都是使用HashedWheelTimer。比如:客户端等待服务端返回,如果超时了,HashedWheelTimer调度定时任务触发超时异常。为什么要是用时间轮算法?下面这些引用来自文章:https://zhuanlan.zhihu.com/p/32906730。大量的调度任务如果每一个...原创 2020-04-30 22:45:25 · 2112 阅读 · 0 评论 -
dubbo解析-Merger接口作用及其实现类介绍
Merger接口只有一个方法merge,入参是数组,作用是将数组合并为一个对象。该接口在集群容错的MergeableClusterInvoker类中将多个服务提供者的返回值合并。该接口的实现类是通过SPI加载的,我们看一下org.apache.dubbo.rpc.cluster.merger.Merger文件,该文件中记录了所有的Merger实现类和其名字。文件内容如下:map=org.ap...原创 2020-04-30 14:05:39 · 649 阅读 · 0 评论 -
dubbo解析-集群容错八大Invoker实现类详解
AbstractClusterInvoker子类只实现了doInvoke方法,所以后面的文章只介绍doInvoke方法。FailoverClusterInvoker原创 2020-04-27 23:06:33 · 1475 阅读 · 3 评论 -
dubbo解析-集群容错顶层抽象类AbstractClusterInvoker详解
上一篇文章已经介绍了Cluster接口有10个实现类。每个Cluster实现类都会创建一个对应的Cluster Invoker对象。MockClusterWrapper是包装类,ZoneAwareCluster在多个配置中心场景下使用,这两个类其他文章介绍。其余的8个实现类及其对应的Cluster Invoker类如下:ClusterCluster Invoker作用F...原创 2020-04-27 22:55:45 · 1123 阅读 · 0 评论 -
dubbo解析-集群容错实现简介
为了避免单点故障,一般会在多台机器上部署多个服务,客户端可以访问任何一台机器,当调用服务失败,客户端也会有多种选择,是抛出异常,还是重试等。集群容错涉及到上述两个方面:选择合适的服务调用;对服务调用失败做出后续处理。dubbo的集群容错功能实现是在cluster路由层实现的。Cluster层将多个服务提供者合并为一个Cluster Invoker,并将Cluster Invoker暴露给...原创 2020-04-27 22:51:56 · 364 阅读 · 0 评论 -
dubbo解析-@EnableConfigurationBeanBindings详解
@EnableConfigurationBeanBindings引入了类ConfigurationBeanBindingsRegister,EnableConfigurationBeanBinding也是注解。EnableConfigurationBeanBinding需要配置prefix、type属性。prefix表示配置文件中配置名字的前缀,type表示该前缀对应的对象,multiple 表示是否可以创建多个XxxConfig对象。本注解是解析dubbo的配置核心。原创 2020-04-27 22:48:50 · 1419 阅读 · 0 评论 -
dubbo解析-通过spring boot配置文件配置dubbo
dubbo使用spring boot配置文件配置的属性可以参见类DubboConfigConfiguration。DubboConfigConfiguration有两个子类:Single和Multiple。@EnableConfigurationBeanBindings({ @EnableConfigurationBeanBinding(prefix = "dubbo....原创 2020-04-27 22:46:26 · 923 阅读 · 0 评论 -
dubbo解析-客户端启动入口
@DubboComponentScan引入了类DubboComponentScanRegistrar,DubboComponentScanRegistrar通过代码将ReferenceAnnotationBeanPostProcessor后处理器注册到spring容器中。ReferenceAnnotationBeanPostProcessor是dubbo处理@Reference的核心,继承了Abs...原创 2020-04-27 22:44:34 · 800 阅读 · 0 评论 -
dubbo解析-服务端启动入口
dubbo服务端启动是一个很复杂的过程,本文只介绍启动的入口。@DubboComponentScan引入类DubboComponentScanRegistrar。DubboComponentScanRegistrar里面创建ServiceAnnotationBeanPostProcessor后处理器,@DubboComponentScan的basePackages为ServiceAnnotati...原创 2020-04-27 22:42:48 · 649 阅读 · 0 评论 -
dubbo解析-服务结果缓存Cache实现类原理详解
Cache的实现类也有四个:ThreadLocalCache、ExpiringCache、LruCache、JCache。LruCacheLruCache按照最近最少使用原则删除多余缓存。public LruCache(URL url) { final int max = url.getParameter("cache.size", 1000); this.s...原创 2020-04-27 22:41:47 · 1137 阅读 · 0 评论