dubbo 扩展点里自动包装】的更多相关文章

在看protrocol扩展点时,发现很费解的一点:当前invoker的url是register协议,在export的时候都会从qos->lister->filer这3个包装类开始,看了一下getExtension()的过程,createExtension()里有这样一些代码: // 装饰器类,用来增加扩展实现. Set<Class<?>> wrapperClasses = cachedWrapperClasses; if (wrapperClasses != null…
扩展点能力 能load class,这个class除了顶层接口class(在ExtensionLoader中对应type字段),还能load各实现类的class. 能创建instance. 能指定这个顶层接口的默认实现类的beanName.做法参见SPI注解部分. 能把创建出来的instance的字段注入.set开头的且有一个参数且是public的,注入. 能adaptive.根据url上对该接口配置的实现类,将该接口的事情交给这个实现类去做(我更多的理解成委托).此能力采用代码生成再编译的方式…
负载均衡其本质就是将请求分摊到多个操作单元上进行,从而共同完成工作任务.其策略主要用于客户端春常在多个提供者时根据算法选择某个提供者.在集群负载均衡时,Dubbo提供了多种均衡策略(包括随机.轮询.最少活跃调用数.一致性Hash等),缺省为随机调用(具体可参考dubbo官网). 配置负载均衡,既可以在服务提供者一方进行配置也可以在服务消费者一方配置,如下: Dubbo中也是利用SPI机制实现负载均衡的功能.其SPI接口是org.apache.dubbo.rpc.cluster.LoadBalan…
对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool.那么这样的扩展点在程序运行的哪个节点调用的呢?跟踪之前性能监控扩展点的执行流程,找到扩展点加载时机,如下: 以该文章中关于线程池的扩展点为例,调试分析dubbo扩展点的加载原理.首先看注解版的配置(以服务端为例,那么调用的是自适应的扩展点threadpool): 查看配置类: 红框中是典型的Java Bean 的一个应用,就是将扫描目录下的bean和一个Regist…
Dubbo的扩展机制是怎么实现的?最简单的回答就是@SPI. Dubbo的插件化思路来源于Java SPI.   JAVA SPI 机制     SPI的全名为Service Provider Interface. 大多数人可能不了解,因为它是JDK针对插件或者厂商的.java spi机制的思想就是: 我们的系统的抽象模块(接口),往往有很多不同方案的实现.如日志模块,jdbc模块等.而在面向对象的设计里,我们一般都要做模块解耦,面向接口编程.但如果要切换接口的不同实现,就可能需要改动代码.为了…
SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实现,而是在外部进行装配. 要想了解 Dubbo 的设计与实现,其中 Dubbo SPI 加载机制是必须了解的,在 Dubbo 中有大量功能的实现都是基于 Dubbo SPI 实现解耦,同时也使得 Dubbo 获得如此好的可扩展性. Java SPI 通过完成一个 Java SPI 的操作来了解它的机…
与很多框架一样,Dubbo也存在拦截(过滤)机制,可以通过该机制在执行目标程序前后执行我们指定的代码.Dubbo中Filter只是Dubbo提供的可自定义扩展的扩展点之一.通过该扩展点地理解,可以触类旁通地理解其他类似自激活的扩展点. 那么什么是自激活?如果一个扩展点有多个实现,那么最后究竟使用哪个实现呢?根据不同的条件参数来动态选择可以使用的扩展时(可能需要同时使用多个扩展),就会使用到自激活扩展了.这个就是自激活. Dubbo的Filter机制是专门为服务提供方和服务消费方调用过程进行拦截设…
dubbo源码版本:2.5.4 经统计,dubbo一共有31个扩展,如下: ------------------------------------------------------ META-INF/dubbo/internal/com.alibaba.dubbo.common.compiler.CompilerMETA-INF/dubbo/internal/com.alibaba.dubbo.common.extension.ExtensionFactoryMETA-INF/dubbo/i…
问题 dubbo内部定制的版本中,在处理大于10K的包的时候,会出现内存溢出的现象 原因是我们在定制dubbo http协议的时候,使用了jboss包里面的HttpRequestDecoder的http decoder方法来解析http协议内容 该方法在解析非http协议的大内容时,会出现内存溢出的情况 某个服务因为这个问题,出现了full gc 的情况 复现问题 根据描述复现该问题 指定dubbo版本 dubbo请求,非http请求 消息体大于10K jvm堆配置,jmap -heap pid…
实现细节 (+) (#) 初始化过程细节 (+) (#) 解析服务 基于dubbo.jar内的META-INF/spring.handlers配置,Spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler. 所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象. 在ServiceConfig.export()或ReferenceConfig.get()初始化时,将Bean对象转…
Dubbo不只提供了堵塞式的同步调用,同时提供了异步调用的方式.这种方式主要应用于提供者接口响应耗时明显,消费者端可以利用调用接口的时间去做一些其他的接口调用,利用Future模式来异步等待和获取结果即可(参考FutureTask类的get方法如何实现线程同步等待 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)).这种方式可以大大地提升消费端的利用率.目前这种方式可以通过XML的方式进行引入. 下面探讨Dubbo实现异步调用流程: 需要注意的是,这种方式的使用条件是确保dubbo的…
线程池也是Dubbo自动自适应扩展点之一,也可以自定义线程池.Dubbo中已实现的线程池扩展点有: 其中框架提供的线程池都是通过创建真实的业务线程池进行操作的,目前线程池模型中有两个和Java中线程池相对应: 1)fix:表示创建固定大小的线程池.也是Dubbo默认的使用方式,默认创建的执行线程数为200,并且是没有任何等待队列的.所以在极端的情况下可能会存在问题,比如操作大量执行时,可能存在堵塞的情况. 2)cache:创建非固定大小的线程池,当线程不足时,会自动创建新的线程.但是使用的时候需…
服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务有策略的降低服务级别以释放服务器资源保证核心任务的政策运行. 为什么要使用服务降级呢?这是为了防止分布式服务发送雪崩效应,也就是蝴蝶效应:当一个请求发送超时,一致等待中服务响应,那么在高并发情况下,很多请求都是因为这样一直等待响应知道服务资源耗尽宕机.二宕机之后会导致分布式其他服务调用该宕机的服务也会出现资源耗尽宕机,从而到孩子整个分布式服务都瘫痪--这就是雪崩.具体可参考如下示意图: Dubbo中服务降级如何实现的呢?主要四种…
关于ExtensionLoader,http://wely.iteye.com/blog/2304718  这篇文章讲的相当不错:备份一下:)…
Dubbo SPI机制之三Adaptive自适应功能 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中,示例案例中自定义了扩展接口而不是使用Dubbo已提供的扩展接口.在案例中,主程序分别使用了不同的加载方法,如下: getExtensionLoader:获取扩展点加载器并加载锁对于的所有扩展点实现 getExtension:根据name获取扩展的指定实现 从ExtensionLoader扩展点加载类注释分析: 图中红框中的三个类是配合使用,如果在单进程中存在多dubbo服务应用是…
一.基础铺垫 1.@SPI .@Activate. @Adaptive a.对于 @SPI,Dubbo默认的特性扩展接口,都必须打上这个@SPI,标识这是个Dubbo扩展点.如果自己需要新增dubbo的扩展点我们就需要新增接口,并且这个接口必须标注@SPI. b.@SPI可以填入一个值,这个值代表某个扩展点的名称,一般作为默认扩展点. c.@Activate,这个注解可以打在方法上或者类上,主要的作用是自动的激活某个扩展点. d.@Adaptive 注解为自适应注解,该注解可以标注在方法上或者类…
Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现.负载均衡.流量调度等服务治理诉求.同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求   本文主要给大家讲解下Dubbo的扩展点原理. 一.SPI介绍   JDK中的SPI(Servic…
写在前面 最近接触了 gRPC 体会到虽然众多 RPC 框架各有各的特点但是他们提供的特性和功能有很多的相似之处 , 这就说明他们面对同样的分布式系统带来的问题.从 2016 年左右开始接触到 dubbo ,基本停留在使用的层面,对 dubbo 的设计以及着重要解决的问题都没有系统的研究过,通过对 dubbo 和其他类似 RPC 产品的系统学习 ,学习分布式系统中面临的共同问题以及解决之道. 微内核架构 微内核架构 (Microkernel architecture) 模式也被称为插件架构 (P…
可扩展设计是框架要重点考虑的设计,因为它直接影响到框架的稳定性和功能的扩展,Dubbo扩展点重构.它在扩展性设计上踩过的坑,值得框架设计者借鉴学习. 第一步,微核心,插件式,平等对待第三方 即然要扩展,扩展点的加载方式,首先要统一,微核心+插件式,是比较能达到 OCP 原则的思路. 由一个插件生命周期管理容器,构成微核心,核心不包括任何功能,这样可以确保所有功能都能被替换,并且,框架作者能做到的功能,扩展者也一定要能做到,以保证平等对待第三方,所以,框架自身的功能也要用插件的方式实现,不能有任何…
写在前面 最近接触了 gRPC 体会到虽然众多 RPC 框架各有各的特点但是他们提供的特性和功能有很多的相似之处 , 这就说明他们面对同样的分布式系统带来的问题.从 2016 年左右开始接触到 dubbo ,基本停留在使用的层面,对 dubbo 的设计以及着重要解决的问题都没有系统的研究过,通过对 dubbo 和其他类似 RPC 产品的系统学习 ,学习分布式系统中面临的共同问题以及解决之道. 微内核架构 微内核架构 (Microkernel architecture) 模式也被称为插件架构 (P…
1. Dubbo的扩展机制 在Dubbo的官网上,Dubbo描述自己是一个高性能的RPC框架.今天我想聊聊Dubbo的另一个很棒的特性, 就是它的可扩展性. 如同罗马不是一天建成的,任何系统都一定是从小系统不断发展成为大系统的,想要从一开始就把系统设计的足够完善是不可能的,相反的,我们应该关注当下的需求,然后再不断地对系统进行迭代.在代码层面,要求我们适当的对关注点进行抽象和隔离,在软件不断添加功能和特性时,依然能保持良好的结构和可维护性,同时允许第三方开发者对其功能进行扩展.在某些时候,软件设…
牛逼的框架,看似复杂难懂,思路其实很清晰.---me 上篇文章,在整体扩展思路上进行了源码分析,比较粗糙,现在就某些点再详细梳理下. dubbo SPi的扩展,基于一类.三注解. 一类是ExtensionLoader类 三注解是@SPI.@Adaptive.@Activate 本文总结dubbo是如何使用ExtensionLoader实现扩展的,详细看看它是怎么设计的,为何这样设计? 1. ExtensionLoader属性 首先是ExtensionLoader包含的属性,如下. 主要包含常量定…
很荣幸,作为这样一款业界使用率和好评率出众的RPC框架的维护者,今天这个文章主要是想帮助那些热爱开源的同学,更好的来研究dubbo的源代码. 一.Dubbo整体架构 1.Dubbo与Spring的整合 Dubbo在使用上可以做到非常简单,不管是Provider还是Consumer都可以通过Spring的配置文件进行配置,配置完之后,就可以像使用 spring bean一样进行服务暴露和调用了,完全看不到dubbo api的存在.这是因为dubbo使用了spring提供的可扩展Schema自定义配…
框架设计 整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service和Config层为API,其它各层均为SPI. 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类. 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继…
开发者指南 参与 流程 任务 版本管理 源码构建 框架设计 整体设计 模块分包 依赖关系 调用链 暴露服务时序 引用服务时序 领域模型 基本原则 扩展点加载 扩展点配置 扩展点自动包装 扩展点自动装配 扩展点自适应 扩展点自动激活 实现细节 初始化过程细节 远程调用细节 远程通讯细节 SPI参考手册 协议扩展 调用拦截扩展 引用监听扩展 暴露监听扩展 集群扩展 路由扩展 负载均衡扩展 合并结果扩展 注册中心扩展 监控中心扩展 扩展点加载扩展 动态代理扩展 编译器扩展 消息派发扩展 线程池扩展 序…
一.SPI SPI全称为Service Provider Interface,对应中文为服务发现机制.SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在使用的时候无需过多关注具体的实现细节.在Java中,SPI体现了面向接口编程的思想,满足开闭设计原则. 1.1 JDK自带SPI实现 从JDK1.6开始引入SPI机制后,可以看到很多使用SPI的案例,比如最常见的数据库驱动实现,在JDK中只定义了java.sql.Driver的接口,具体实现由各数据…
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但是依赖的版本较早,只支持0.8.0,而且还对协议做一些扩展,并非原生的thrift协议. github上虽然也有朋友对dubbo做了扩展支持原生thrift,但是代码实在太多了,只需要一个类即可: Thrift2Protocal.java: package com.alibaba.dubbo.rpc…
第一节:概述 Spring-Dubbo 是我自己写的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可以学习一下dubbo的框架) 项目介绍: github: https://github.com/Athlizo/spring-dubbo-parent 码云: https://git.oschina.net/null_584_3382/spring-dubbo-parent 声明: 这个只是个人研究…
Dubbo框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载.权限控制等功能. 工厂模式 Provider在export服务时,会调用ServiceConfig的export方法.ServiceConfig中有个字段: private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); Dubbo里有很多这种代码.这也是一种…
最近抽空开始了 Dubbo 源码的阅读之旅,希望可以通过写文章的方式记录和分享自己对 Dubbo 的理解.如果在本文出现一些纰漏或者错误之处,也希望大家不吝指出. Dubbo SPI 介绍 Java SPI 在阅读本文之前可能需要你对 Java SPI(Service Provider Interface) 机制有过简单的了解.这里简单介绍下:在面向对象的设计中,我们提倡模块之间基于接口编程.不同模块可能会有不同的具体实现,但是为了避免模块的之间的耦合过大,我们需要一种有效的服务(服务实现)发现…