Dubbo
文章平均质量分 84
Dubbo基础
吴声子夜歌
个人学习记录
展开
-
Dubbo——XML配置详解
因为dubbo有多种配置方式,即存在多个配置源,配置源也有优先级。比如通过xml方式配置了一个ServiceConfig且指定属性version=1.0.0,同时我们又在外部配置(配置中心)中配置了dubbo.service.{interface}.version=2.0.0,在没有引入config-mode配置项之前,按照原有的配置源优先级,最终实例的version=2.0.0。配置的key为dubbo.config.mode,配置的值为如上描述的几种,默认的策略值为strict。服务提供者缺省值配置。原创 2023-08-02 23:25:40 · 1706 阅读 · 0 评论 -
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 · 831 阅读 · 1 评论 -
Dubbo——服务提供者过滤器实现的原理
服务提供者过滤器实现的原理@Activate注解上可以设置group属性,从而设定某些过滤器只有在服务提供者端才生效。AccessLogFilter的实现原理1. AccessLogFilter的使用:AccessLogFilter是一个日志过滤器,如果想记录服务每一次的请求日志,则可以开启这个过滤器。虽然AccessLogFilter有@Activate注解,默认会被激活,但还是需要手动配置来开启日志的打印。有两种方式来配置开启AccessLogFilter:<!-- ①将日志输出到应用本原创 2020-07-04 00:25:57 · 828 阅读 · 1 评论 -
Dubbo——过滤器概述
Dubbo过滤器概述Dubbo中的过滤器和Web应用中的过滤器的概念是一样的,提供了在服务调用前后插入自定义逻辑的途径。过滤器是整个Dubbo框架中非常重要的组成部分,Dubbo中很多功能都是基于过滤器扩展而来的。过滤器提供了服务提供者和消费者调用过程的拦截,即每次都执行RPC调用的时候,对应的过滤器都会生效。虽然过滤器的功能强大,但由于每次调用时都会执行,因此在使用的时候需要注意它对性能的影响。过滤器的使用一种方式是使用@Active注解默认启用;一种方式是在配置文件中配置;<!--原创 2020-07-03 23:06:22 · 1306 阅读 · 1 评论 -
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 · 2748 阅读 · 0 评论 -
Dubbo——Mock
Mock在Cluster中,还有最后一个MockClusterWrapper,由它实现了Dubbo的本地伪装。这个功能的使用场景较多,通常会应用在以下场景中:服务降级;部分非关键服务全部不可用,希望主流程继续进行;在下游某些节点调用异常时,可以以Mock的结果返回。Mock常见的使用方法Mock只有在拦截到RpcException的时候会启用,数异常容错方式的一种。业务层面其实也可以用try-catch来实现这种功能,如果使用下沉到框架中的Mock机制,则可以让业务的实现更优雅常见配置如下://配原创 2020-07-02 17:13:09 · 3600 阅读 · 0 评论 -
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 · 960 阅读 · 0 评论 -
Dubbo——负载均衡的实现
负载均衡的实现在整个集群容错流程中,首先经过Directory获取所有Invoker列表,然后经过Router根据路由规则过滤Invoker,最后幸存下来的Invoker还需要经过负载均衡这一关,选出最终要调用的Invoker。包装后的负载均衡所有的容错策略中的负载均衡都使用了抽象父类AbstractClusterInvoker中定义的Invoker <T> select方法,而并不是直接使用LoadBalance方法。因为抽象父类在LoadBalance的基础上有封装了一些新的特性:原创 2020-07-02 14:01:23 · 1876 阅读 · 2 评论 -
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 · 809 阅读 · 0 评论 -
Dubbo——Directory的实现原理
Directory的实现整个容错过程中首先会使用Directory#list来获取所有的Invoker列表。Directory也有多种实现子类,既可以提供静态的Invoker列表,也可以提供动态的Invoker列表。静态的列表是用户自己设置的Invoker列表;动态列表根据注册中心的数据动态变化,动态更新Invoker列表的数据,整个过程对上层透明。总体实现Directory是顶层接口。AbstractDirectory封装了通用的实现逻辑。抽象类包含RegistryDirectory和Static原创 2020-07-01 22:46:57 · 485 阅读 · 0 评论 -
Dubbo——容错策略
Cluster接口关系在微服务环境中,可能多个节点同时都提供同一个服务。当上层调用Invoker时,无论实际存在多少个Invoker,只需要通过Cluster层,即可完成整个调用容错逻辑,包括获取服务列表、路由、负载均衡等,整个过程对上层都是透明的。当然,Cluster接口只是串联起整个逻辑,其中ClusterInvoker只实现了容错逻辑部分,其他逻辑则是调用了Directory、Router、LoadBalance等接口实现。容错的接口主要分为两大类,第一类是Cluster类,第二类是Cluster原创 2020-07-01 18:27:00 · 823 阅读 · 0 评论 -
Dubbo——集群容错
Cluster层概述在微服务环境中,为了保证服务的高可用,很少会有单点服务出现,服务通常都是以集群的形式出现的。然而,被调用的远程服务并不是每时每刻都保持良好状况,当某个服务调用出现异常时,如网路抖动、服务短暂不可用需要自动容错,或者只想本地测试、服务降级、需要Mock返回结果,就需要使用集群容错机制。我们可以把Cluster看作一个集群容错层,该层中包含Cluster、Directory、Router、Loadbalance几大核心接口。注意这里要区分Cluster层和Cluster接口,Cluste原创 2020-07-01 15:23:09 · 210 阅读 · 0 评论 -
Dubbo——底层handler
核心Handler和线程模型Dubbo中Handler(ChannelHandler)的5种状态:状态描述connectedChannel已经被创建disconnectedChannel已被断开sent消息被发送received消息被接收caught捕获到异常Dubbo针对每个特性都会实现对应的ChannelHandler:Handler作用ExchangeHandlerAdapter用于查找服务方法并调用Head原创 2020-07-01 10:59:55 · 781 阅读 · 0 评论 -
Dubbo——协议详解
Dubbo协议详解Dubbo协议设计参考了现有TCP/IP协议。一次RPC调用包括协议头和协议体两个部分。16字节长的报文头部主要携带了魔法数(0xdabb),以及当前请求报文是否是Request、REsponse、心跳和事件的信息,请求时也会携带当前报文体内序列化协议编号。除此之外还携带了请求状态,以及请求唯一标识和报文体长度。Dubbo协议字段解析:偏移比特位字段描述作用0~7魔数高位存储的是魔法数高位(0xda00)8~15魔数低位存储的是魔法数低位(0xb原创 2020-06-30 22:38:21 · 1398 阅读 · 1 评论 -
Dubbo——服务消费的实现原理
单注册中心消费原理整体RPC的消费原理: ReferenceCnofig ↓ Protocol ----> Dubbo、injvm等 ↓ Invoker -----> DubboInvoker等 ↓ ProxyFactoy -----> Javassist、JDK动态代理 ↓ Ref在整体上看,Dubbo框架做服务消费也分为两大部分:第一部分通过持有远程服务实例生成In原创 2020-06-30 16:25:55 · 578 阅读 · 0 评论 -
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 · 1213 阅读 · 0 评论 -
Dubbo——扩展点动态编译的实现
扩展点动态编译的实现Dubbo SPI的自适应特性让整个框架非常灵活,而动态编译又是自适应特性的基础,因为动态生成的自适应类只是字符串,需要通过编译才能得到真正的Class。虽然我们可以使用反射来动态代理一个类,但是在性能上和直接编译好的Class会有一定差距。Dubbo SPI通过代码的动态生成,并配合动态编译器,灵活地在原始类基础上创建新的自适应类。总体结构Dubbo中有三种代码编译器,分别是JDK编译器、Javassist编译器和AdaptiveCompiler编译器。这几种编译器都实现了Com原创 2020-06-29 20:43:30 · 223 阅读 · 0 评论 -
Dubbo——ExtensionFactory的实现原理
ExtensionFactory的实现原理RegistryFactory工厂类通过@Adaptive({"protocol"})注解动态查找注册中心实现,根据URL中的protocol参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。而实现这个特性的ExtensionLoader类,本身又是通过工厂方法ExtensionFactory创建的,并且这个工厂接口上也有SPI注解,还有多个实现。AdaptiveExtensionFactory这个实现类工厂上有@Adaptive注解。因此,Ada原创 2020-06-29 18:30:10 · 782 阅读 · 0 评论 -
Dubbo——ExtensionLoader的工作原理
ExtensionLoader的工作原理原创 2020-06-29 17:15:54 · 788 阅读 · 0 评论 -
Dubbo——扩展点注解
扩展点注解:@SPI@SPI注解可以使用在类、接口和枚举类上,Dubbo框架中都是使用在接口上。它的主要作用就是标记这个几口是一个Dubbo SPI接口,即是一个扩展点,可以有多个不同的内置或用户定义的实现。运行时需要通过配置找到具体的实现类。可以看到SPI注解有一个value属性,通过这个属性,我们可以传入不同的参数来设置这个接口额默认实现类。例如,我们可以看到Transporter接口使用Netty作为默认实现:Dubbo中很多地方通过getExtension(Class<T>原创 2020-06-29 00:03:07 · 268 阅读 · 0 评论 -
Dubbo——注册中心缓存机制、重试机制
缓存机制缓存的存在就是用空间换取时间,如果每次远程调用都要从注册中心获取一次可调用的服务列表,则会让注册中心承受巨大的流量压力。另外,每次额外的网络请求也会让整个系统的性能下降。因此,Dubbo的注册中心实现了通用的缓存机制,在抽象类AbstractRegistry中实现。消费者或服务治理中心获取注册信息后会做本地缓存。内存中会有一份,保存在Properties对象里,磁盘上也会持久化一份文件,通过file对象引用。在AbstractRegistry抽象类中有如下定义:内存中的缓存notifie原创 2020-06-28 22:27:54 · 3279 阅读 · 4 评论 -
Dubbo——基于API实现
基于API实现Dubbo框架大部分场景都会在Spring中使用,但是不局限于这种场景。除了XML和注解的方式,Dubbo框架还支持API的方式。虽然大部分场景不会直接使用API的方式暴露和消费服务,但是在某些场景下API非常有用。比如开发网关类的应用,需要动态消费不同版本的服务,通过API方式,可以根据前端请求参数构造不同版本的服务实例等。接口:public interface EchoService { String echo(String message);}基于API编写服务器原创 2020-06-28 15:53:40 · 864 阅读 · 0 评论 -
Dubbo——基于注解实现
接口:public interface EchoService { String echo(String message);}基于注解的服务端:通过注解暴露服务,只需要在服务接口上标注@Service注解即可:import com.alibaba.dubbo.config.annotation.Service;import com.alibaba.dubbo.rpc.RpcContext;import com.alibaba.dubbo.samples.echo.api.Echo原创 2020-06-28 14:04:49 · 706 阅读 · 0 评论 -
Dubbo--框架设计、启动原理
框架设计config 配置层: 对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类proxy 服务代理层: 服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactoryegistry 注册中心层...原创 2020-02-13 23:26:17 · 174 阅读 · 0 评论 -
Dubbo--RPC原理、Netty通信
RPC原理一次完整的RPC调用流程(同步调用,异步另说)如下:服务消费方(client)调用以本地调用方式调用服务;client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;client stub找到服务地址,并将消息发送到服务端;server stub收到消息后进行解码;server stub根据解码结果调用本地的服务;本地服务执行并将结果返回给ser...原创 2020-02-13 23:20:42 · 289 阅读 · 0 评论 -
Dubbo--处理降级、服务熔断、整合hystrix
服务降级当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。向注册中心写入动态配置覆盖规则:RegistryFactory registryFactory = ExtensionLoader.getExtension...原创 2020-02-13 21:49:40 · 1263 阅读 · 0 评论 -
Dubbo--高可用(zookeeper宕机、dubbo直连、负载均衡)
zookeep宕机与dubbo直连现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。原因:监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将自动切换到另一台注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯服务提供者无状态,任意一台宕掉后,不影响使用服...原创 2020-02-13 21:18:40 · 343 阅读 · 0 评论 -
Dubbo--配置
配置原则JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。重试次数失败自动切...原创 2020-02-13 20:38:19 · 128 阅读 · 0 评论 -
Dubbo--集成SpringBoot
创建Maven 工程 (dubbo_test)引入依赖: <dependencies> <!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo&l...原创 2020-02-13 15:35:12 · 293 阅读 · 0 评论 -
Dubbo--安装监控中心(dubbo-monitor-simple)
dubbo-monitor-simple简单的监控中心。下载dubbo-ops:https://github.com/apache/incubator-dubbo-ops修改配置指定注册中心地址:进入 dubbo-monitor-simple\src\main\resources\conf修改 dubbo.properties文件打包dubbo-monitor-simple:mv...原创 2020-02-13 14:19:10 · 472 阅读 · 0 评论 -
Dubbo--入门程序
需求某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;我们现在 需要创建两个服务模块进行测试模块功能订单服务web模块创建订单等用户服务service模块查询用户地址等测试预期结果:订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。创建Maven 工程 (dubbo_test)引入依赖: <depen...原创 2020-02-13 14:07:33 · 197 阅读 · 0 评论 -
Dubbo--RPC概述、Dubbo概述
RPCRPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。RPC基本原理RPC两个核心模块:通讯序列化DubboApach...原创 2020-02-12 20:10:35 · 343 阅读 · 0 评论 -
Dubbo--分布式概述
什么是分布式系统分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统分布式系统(distributed system)是建立在网络之上的软件系统。随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。发展演变单一应用架构当网站流量很小时,只需一个应用,将所有功能都...原创 2020-02-12 20:05:11 · 220 阅读 · 0 评论