2 吴声子夜歌

尚未进行身份认证

我要认证

个人学习记录

等级
TA的排名 1k+

Dubbo——消费者过滤器的实现原理

ActiveLimitFilter的实现原理和服务提供者端的ExecuteLimitFilter相似,ActiveLimitFilter是消费者端的过滤器,显示的是客户端的并发数。<!-- 限制com.foo.BarService的每个方法在每个客户端的并发执行数(或占用连接的请求数)不能超过10个 --><dubbo:service interface="com.foo.BarService" actives="10" />或<dubbo:reference inte

2020-07-04 01:16:20

Dubbo——服务提供者过滤器实现的原理

服务提供者过滤器实现的原理@Activate注解上可以设置group属性,从而设定某些过滤器只有在服务提供者端才生效。AccessLogFilter的实现原理1. AccessLogFilter的使用:AccessLogFilter是一个日志过滤器,如果想记录服务每一次的请求日志,则可以开启这个过滤器。虽然AccessLogFilter有@Activate注解,默认会被激活,但还是需要手动配置来开启日志的打印。有两种方式来配置开启AccessLogFilter:<!-- ①将日志输出到应用本

2020-07-04 00:25:57

Dubbo——过滤器概述

Dubbo过滤器概述Dubbo中的过滤器和Web应用中的过滤器的概念是一样的,提供了在服务调用前后插入自定义逻辑的途径。过滤器是整个Dubbo框架中非常重要的组成部分,Dubbo中很多功能都是基于过滤器扩展而来的。过滤器提供了服务提供者和消费者调用过程的拦截,即每次都执行RPC调用的时候,对应的过滤器都会生效。虽然过滤器的功能强大,但由于每次调用时都会执行,因此在使用的时候需要注意它对性能的影响。过滤器的使用一种方式是使用@Active注解默认启用;一种方式是在配置文件中配置;<!--

2020-07-03 23:06:22

Dubbo——扩展点详解

扩展点整体架构1. RPC层扩展点按照完整的Dubbo结构分层,RPC层可以分为四层:Config、Proxy、Registry、Cluster。由于Config属于API范畴,因此只关注Proxy、Registry、Cluster三层的扩展点。1.1 Proxy层扩展点Proxy层主要的扩展接口是ProxyFactory。Dubbo中的ProxyFactory有两种默认实现:Javassist和JDK,用户可以自行扩展自己的实现,如CGLIB。Dubbo默认选择Javassist作为默认字节码生

2020-07-03 01:24:36

Dubbo——Mock

Mock在Cluster中,还有最后一个MockClusterWrapper,由它实现了Dubbo的本地伪装。这个功能的使用场景较多,通常会应用在以下场景中:服务降级;部分非关键服务全部不可用,希望主流程继续进行;在下游某些节点调用异常时,可以以Mock的结果返回。Mock常见的使用方法Mock只有在拦截到RpcException的时候会启用,数异常容错方式的一种。业务层面其实也可以用try-catch来实现这种功能,如果使用下沉到框架中的Mock机制,则可以让业务的实现更优雅常见配置如下://配

2020-07-02 17:13:09

Dubbo——Merger的实现

Merger的实现当一个接口有多种实现,消费者又需要同时引用不同的实现时,可以用group 来区分不同的实现,如下所示。<dubbo:service group=" group1" interface=" com.xxx.testService" /><dubbo:service group="group2" interface=" com.xxx.testService" />如果我们需要并行调用不同group 的服务,并且要把结果集合并起来,则需要用到Merger特性。

2020-07-02 14:50:19

Dubbo——负载均衡的实现

负载均衡的实现在整个集群容错流程中,首先经过Directory获取所有Invoker列表,然后经过Router根据路由规则过滤Invoker,最后幸存下来的Invoker还需要经过负载均衡这一关,选出最终要调用的Invoker。包装后的负载均衡所有的容错策略中的负载均衡都使用了抽象父类AbstractClusterInvoker中定义的Invoker <T> select方法,而并不是直接使用LoadBalance方法。因为抽象父类在LoadBalance的基础上有封装了一些新的特性:

2020-07-02 14:01:23

Dubbo——路由的实现

路由的实现路由接口会根据用户配置的不同路由策略对Invoker列表进行过滤,只返回符合规则的Invoekr。例如:如果用户配置了接口A的所有调用,都是用IP为192.168.1.22的节点,则路由会过滤其他的Invoekr,只返回IP为192.168.1.22的Invoker。路由的总体结构路由分为条件路由、文件路由、脚本路由,对应dubbo-admin中三种不同的规则匹配方法。条件路由是用户使用Dubbo定义的语法规则去写路由规则;文件路由则需要用户提交一个文件,里面写着对应的路由规则,框架基

2020-07-02 01:02:58

Dubbo——Directory的实现原理

Directory的实现整个容错过程中首先会使用Directory#list来获取所有的Invoker列表。Directory也有多种实现子类,既可以提供静态的Invoker列表,也可以提供动态的Invoker列表。静态的列表是用户自己设置的Invoker列表;动态列表根据注册中心的数据动态变化,动态更新Invoker列表的数据,整个过程对上层透明。总体实现Directory是顶层接口。AbstractDirectory封装了通用的实现逻辑。抽象类包含RegistryDirectory和Static

2020-07-01 22:46:57

Dubbo——容错策略

Cluster接口关系在微服务环境中,可能多个节点同时都提供同一个服务。当上层调用Invoker时,无论实际存在多少个Invoker,只需要通过Cluster层,即可完成整个调用容错逻辑,包括获取服务列表、路由、负载均衡等,整个过程对上层都是透明的。当然,Cluster接口只是串联起整个逻辑,其中ClusterInvoker只实现了容错逻辑部分,其他逻辑则是调用了Directory、Router、LoadBalance等接口实现。容错的接口主要分为两大类,第一类是Cluster类,第二类是Cluster

2020-07-01 18:27:00

Dubbo——集群容错

Cluster层概述在微服务环境中,为了保证服务的高可用,很少会有单点服务出现,服务通常都是以集群的形式出现的。然而,被调用的远程服务并不是每时每刻都保持良好状况,当某个服务调用出现异常时,如网路抖动、服务短暂不可用需要自动容错,或者只想本地测试、服务降级、需要Mock返回结果,就需要使用集群容错机制。我们可以把Cluster看作一个集群容错层,该层中包含Cluster、Directory、Router、Loadbalance几大核心接口。注意这里要区分Cluster层和Cluster接口,Cluste

2020-07-01 15:23:09

Dubbo——底层handler

核心Handler和线程模型Dubbo中Handler(ChannelHandler)的5种状态:状态描述connectedChannel已经被创建disconnectedChannel已被断开sent消息被发送received消息被接收caught捕获到异常Dubbo针对每个特性都会实现对应的ChannelHandler:Handler作用ExchangeHandlerAdapter用于查找服务方法并调用Head

2020-07-01 10:59:55

Dubbo——协议详解

Dubbo协议详解Dubbo协议设计参考了现有TCP/IP协议。一次RPC调用包括协议头和协议体两个部分。16字节长的报文头部主要携带了魔法数(0xdabb),以及当前请求报文是否是Request、REsponse、心跳和事件的信息,请求时也会携带当前报文体内序列化协议编号。除此之外还携带了请求状态,以及请求唯一标识和报文体长度。Dubbo协议字段解析:偏移比特位字段描述作用0~7魔数高位存储的是魔法数高位(0xda00)8~15魔数低位存储的是魔法数低位(0xb

2020-06-30 22:38:21

Dubbo——服务消费的实现原理

单注册中心消费原理整体RPC的消费原理: ReferenceCnofig ↓ Protocol ----> Dubbo、injvm等 ↓ Invoker -----> DubboInvoker等 ↓ ProxyFactoy -----> Javassist、JDK动态代理 ↓ Ref在整体上看,Dubbo框架做服务消费也分为两大部分:第一部分通过持有远程服务实例生成In

2020-06-30 16:25:55

Dubbo——服务暴露的实现原理

配置承载初始化不管在服务暴露还是服务消费场景下,Dubbo框架都会根据优先级对配置信息做聚合处理,目前默认覆盖策略主要遵循以下几点规则:-D 传递给JVM参数优先级最高,比如-Ddubbo.protocol.port=20880。代码或XML配置优先级次高,比如Spring中XML文件制定<dubbo:protocol port="20880"/>。配置文件优先级最低,比如dubbo.properties文件制定dubbo.protocol.port=20880。一般推荐使用dub

2020-06-30 12:08:42

Dubbo——扩展点动态编译的实现

扩展点动态编译的实现Dubbo SPI的自适应特性让整个框架非常灵活,而动态编译又是自适应特性的基础,因为动态生成的自适应类只是字符串,需要通过编译才能得到真正的Class。虽然我们可以使用反射来动态代理一个类,但是在性能上和直接编译好的Class会有一定差距。Dubbo SPI通过代码的动态生成,并配合动态编译器,灵活地在原始类基础上创建新的自适应类。总体结构Dubbo中有三种代码编译器,分别是JDK编译器、Javassist编译器和AdaptiveCompiler编译器。这几种编译器都实现了Com

2020-06-29 20:43:30

Dubbo——ExtensionFactory的实现原理

ExtensionFactory的实现原理RegistryFactory工厂类通过@Adaptive({"protocol"})注解动态查找注册中心实现,根据URL中的protocol参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。而实现这个特性的ExtensionLoader类,本身又是通过工厂方法ExtensionFactory创建的,并且这个工厂接口上也有SPI注解,还有多个实现。AdaptiveExtensionFactory这个实现类工厂上有@Adaptive注解。因此,Ada

2020-06-29 18:30:10

Dubbo——ExtensionLoader的工作原理

ExtensionLoader的工作原理

2020-06-29 17:15:54

Dubbo——扩展点注解

扩展点注解:@SPI@SPI注解可以使用在类、接口和枚举类上,Dubbo框架中都是使用在接口上。它的主要作用就是标记这个几口是一个Dubbo SPI接口,即是一个扩展点,可以有多个不同的内置或用户定义的实现。运行时需要通过配置找到具体的实现类。可以看到SPI注解有一个value属性,通过这个属性,我们可以传入不同的参数来设置这个接口额默认实现类。例如,我们可以看到Transporter接口使用Netty作为默认实现:Dubbo中很多地方通过getExtension(Class<T>

2020-06-29 00:03:07

Dubbo——注册中心缓存机制、重试机制

缓存机制缓存的存在就是用空间换取时间,如果每次远程调用都要从注册中心获取一次可调用的服务列表,则会让注册中心承受巨大的流量压力。另外,每次额外的网络请求也会让整个系统的性能下降。因此,Dubbo的注册中心实现了通用的缓存机制,在抽象类AbstractRegistry中实现。消费者或服务治理中心获取注册信息后会做本地缓存。内存中会有一份,保存在Properties对象里,磁盘上也会持久化一份文件,通过file对象引用。在AbstractRegistry抽象类中有如下定义:内存中的缓存notifie

2020-06-28 22:27:54

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 签到王者
    签到王者
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证
    技术圈认证
    用户完成年度认证,即可获得
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。