RPC及Dubbo原理学习
文章平均质量分 89
RPC相关知识的学习、Dubbo相关知识的学习
军伟@
Java开发工程师
展开
-
Dubbo源码学习--ExceptionFilter 异常处理机制
背景我们的项目使用了dubbo进行不同系统之间的调用。每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException)。全局的异常处理会根据不同的异常类型进行不同的处理。最近我们发现,某个系统调用dubbo请求,provider端(服务提供方)抛出了自定义的业务异常,但consumer端(服务消费方)拿到的并不是自定义的业务异常。这是为什...转载 2019-05-28 10:26:31 · 847 阅读 · 0 评论 -
SOFA原理学习--sofa boot入门学习
目前Spring boot可以说是Spring web最为流行的开发框架了,目前很多框架都支持Spring boot注册扫描的模式,这篇博客我们用一个示例来展示一下sofa-boot简单的开发工程。1、创建API中相关接口及实现类接口:public interface IHelloService { public String sayHello(String...原创 2018-08-25 23:08:05 · 11958 阅读 · 0 评论 -
SOFA原理学习--sofa rpc入门示例
最近在项目开发中有用到sofa-rpc框架,其是蚂蚁金服开源的,简单的看了一下源码其和阿里巴巴另外一个比较出名的RPC框架Dubbo类似,其实sofa-rpc提供的dubbo协议最终就是使用的Dubbo的功能(sofa-rpc直接将dubbo的jar引入),所以如果对Dubbo有所了解的人我感觉在sofa-rpc学习上也是很快的。SOFARPC 简介 SOFARPC ...原创 2018-08-25 17:23:28 · 31362 阅读 · 5 评论 -
Dubbo源码学习--接口数据序列化Serialization
在数据传输和转换过程中都需要对接口数据进行序列化和反序列化操作,接下来我们看看Dubbo目前都提供了哪些序列化和反序列化实现方式。 将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。 目前Dubbo提供并实现如下接口来完成数据序列化和反序列操作。com.alibaba.dubbo.common.serialize.Serialization...原创 2018-04-15 11:00:14 · 7861 阅读 · 0 评论 -
Dubbo源码学习--Filter过滤器
Dubbo提供反过滤器应该类似servlet中我们经常用到的Filter,是一种递归的链式调用,用来在远程调用真正执行的前后加入一些逻辑。Filter接口及实现类如下:@SPIpublic interface Filter { /** * do invoke filter. * <p> * <code> * // ...原创 2018-04-15 11:49:35 · 1108 阅读 · 0 评论 -
Dubbo源码学习--webservice协议(十)
基于 WebService 的远程调用协议,基于 Apache CXF 1 的 frontend-simple 和 transports-http 实现 2。可以和原生 WebService 服务互操作,即:提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 We...原创 2018-04-14 23:49:10 · 967 阅读 · 0 评论 -
Dubbo源码学习--thrift协议(九)
当前 dubbo 支持 1的 thrift 协议是对 thrift 原生协议 2 的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。依赖<dependency> ...原创 2018-04-14 23:48:58 · 1213 阅读 · 0 评论 -
Dubbo源码学习--Rmi协议(八)
RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。注意:如果正在使用 RMI 提供服务给外部访问 1,同时应用里依赖了老的 common-collections 包 2 的情况下,存在反序列化安全风险 3。特性连接个数:多连接连接方式:短连接传输协议:TCP传输方式:同步传输序列化:Java 标准二进制序列化适用范围:传入传出参数数据包大小混...原创 2018-04-14 23:48:47 · 2921 阅读 · 0 评论 -
Dubbo源码学习--Memcached协议(七)
基于 memcached 1 实现的 RPC 协议 2。注册 memcached 服务的地址RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();Registry registry = registryFactory.ge...原创 2018-04-14 23:48:35 · 581 阅读 · 0 评论 -
Dubbo源码学习--redis协议(六)
基于 Redis 1 实现的 RPC 协议 2。注册 redis 服务的地址RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();Registry registry = registryFactory.getRegistr...原创 2018-04-14 23:48:22 · 1281 阅读 · 0 评论 -
Dubbo源码学习--Rest协议(五)
Dubbo的rest协议是采用的org.jboss.resteasy框架实现的,dubbo项目重新被维护之后才添加的功能,之前当当的dubbox对dubbo进行扩展支持Rest在dubbo中开发一个REST风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。这个服务要实现的功能是提供如下URL(注:这个URL不是完全符合REST的风格,但是更简单实用):http://localhost:8...原创 2018-04-14 23:47:58 · 2196 阅读 · 0 评论 -
Dubbo源码学习--Hession协议(四)
Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用或者提供方用标准 Hessian 暴露服...原创 2018-04-13 20:14:47 · 896 阅读 · 0 评论 -
Dubbo源码学习--Http协议(三)
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 1特性连接个数:多连接连接方式:短连接传输协议:HTTP传输方式:同步传输序列化:表单序列化适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。适用场景:需同时给应用程序和浏览器 JS 使用的服务。约束参数及返回值需符合 Bean 规范配置配置...原创 2018-04-13 20:14:27 · 1275 阅读 · 0 评论 -
Dubbo源码学习--dubbo协议(二)
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。Transporter: mina, netty, grizzySerialization: dubbo, hessian2, java, jsonDispatcher: ...原创 2018-04-13 20:13:10 · 614 阅读 · 0 评论 -
Dubbo源码学习--协议Protocol(一)
1、默认协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。[html] view plain copy<dubbo:protocolnamedubbo:protocolname="dubbo"port="20880"/>...原创 2018-04-13 20:12:40 · 7652 阅读 · 1 评论 -
Dubbo源码学习--服务目录Directory
Dubbo的目录服务简单来说就是消费者将自己能够调用的服务提供者的信息缓存到本地Directory中,当服务提供者有所变化时会通知到注册中心,消费者会监听注册中心相关服务的消息,当收到相关服务提供者变动的消息时会更新本地服务目录Directory,实现类RegistryDirectory中主要提供了两个功能接口:(1)notify(List<URL> urls):当注册中心有通...原创 2018-04-11 19:31:16 · 3170 阅读 · 1 评论 -
Dubbo源码学习--服务引用
服务引用是服务的消费者向注册中心订阅服务提供者的消息,根据java的接口编程获取代理接口远程调用服务提供者。<!-- consumer's application name, used for tracing dependency relationship (not a matching criterion), don't set it same as provider --&g...原创 2018-04-10 12:31:29 · 995 阅读 · 0 评论 -
Dubbo源码学习--服务发布过程
这篇博客我们简单了解一下Dubbo在服务发布过程中的相关流程。在上一篇博客 Dubbo源码学习--Dubbo与Spring融合中我们已经了解了Dubbo与spring相融合实现的原理,在解析xml中完成bean的初始化的时候会将服务发布到注册中心并对外提供服务。接下来我们分析以下配置的服务发布过程。<!-- provider's application name, used for ...原创 2018-04-07 20:41:16 · 1276 阅读 · 0 评论 -
Dubbo源码学习--Dubbo与Spring融合
Spring是java开发中最常用的实例管理框架了,接下来我们简单介绍一下Dubbo是如何和Spring进行整合的。1、Dubbo Spring开发配置在dubbo通过spring进行开发时一般会进行如下配置,dubbo使用的是一些自定义的标签<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.sprin...原创 2018-04-03 18:47:29 · 1592 阅读 · 0 评论 -
Dubbo源码学习--代理工厂ProxyFactory
Dubbo的消费者从spring容器中获取bean时获取到的是一个代理接口,在调用接口的方法时会通过代理类远程调用接口并返回结果,代理相关的知识这里不做介绍。Dubbo提供的代理工厂类是ProxyFactory,通过SPI机制默认实现的是JavassistProxyFactory@SPI("javassist")public interface ProxyFactory { /...原创 2018-04-03 18:47:17 · 2259 阅读 · 0 评论 -
Dubbo源码学习--MergeableCluster集群容错(九)
MergeableCluster聚合集群,将集群中的调用结果聚合起来返回结果。比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。比较鸡肋,小点的项目应该都用不到配置如:(搜索所有分组)按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,...原创 2018-03-29 20:36:57 · 1290 阅读 · 0 评论 -
Dubbo源码学习--ForkingCluster集群容错(八)
Forking Cluster并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。在ForkingCluster中是由ForkingClusterInvoker来帮助完成实现的。public class ForkingCluster implements Cluster { public final...原创 2018-03-27 18:58:03 · 1171 阅读 · 0 评论 -
Dubbo源码学习--FailsafeCluster集群容错(七)
Failsafe Cluster失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。在FailsafeCluster中服务的调用实现实在FailsafeClusterInvoker中完成的public class FailsafeCluster implements Cluster { public final static String NAME = "failsafe";...原创 2018-03-27 18:57:57 · 524 阅读 · 0 评论 -
Dubb源码学习--FailoverCluster集群容错(六)
Failover Cluster失败自动切换,当出现失败,重试其它服务器 1。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。重试次数配置如下:<dubbo:service retries="2" />或<dubbo:reference retries="2" />或<dubbo:reference> ..原创 2018-03-27 18:57:50 · 1776 阅读 · 0 评论 -
Dubb源码学习--FailfastCluster集群容错(五)
Failfast Cluster快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。在FailfastCluster中是通过创建一个FailfastClusterInvoker来完成一次调用失败报错机制的。public class FailfastCluster implements Cluster { public final static String N...原创 2018-03-27 18:57:40 · 1643 阅读 · 0 评论 -
Dubbo源码学习--FailbackCluster集群容错(四)
Failback Cluster失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。FailbackCluster的实现类如下:public class FailbackCluster implements Cluster { public final static String NAME = "failback"; public <T> Invoker...原创 2018-03-27 18:57:30 · 733 阅读 · 0 评论 -
Dubbo源码学习--BroadcastCluster集群容错(三)
Broadcast Cluster广播调用所有提供者,逐个调用,任意一台报错则报错 2。通常用于通知所有提供者更新缓存或日志等本地资源信息。实现类:public class BroadcastCluster implements Cluster { public <T> Invoker<T> join(Directory<T> directory) t...原创 2018-03-27 18:57:21 · 881 阅读 · 0 评论 -
Dubbo源码学习--AvailableCluster集群容错(二)
AvailableCluster 简单的集群容错方式,如果服务提供者可用就直接调用服务,并且不需要任何负载均衡处理。public class AvailableCluster implements Cluster { public static final String NAME = "available"; public <T> Invoker<T&g...原创 2018-03-27 18:56:50 · 603 阅读 · 0 评论 -
Dubbo源码学习--Cluster集群容错(一)
集群容错在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。各节点关系:这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 List 不同的是,它的值可能是...原创 2018-03-27 18:56:40 · 787 阅读 · 0 评论 -
Dubbo源码学习--ConsistentHashLoadBalance负载均衡(五)
ConsistentHash LoadBalance一致性 Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parame...转载 2018-03-26 20:19:39 · 3045 阅读 · 2 评论 -
Dubbo源码学习--RoundRobinLoadBalance负载均衡(四)
RoundRobin LoadBalance轮循,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。1)获取轮询key 服务名+方法名获取可供调用的invokers个数length设置最大权重的默认值maxWeight=0设置最小权重的默认值minWeight=Integer.MAX_VALU...原创 2018-03-26 19:06:33 · 3919 阅读 · 2 评论 -
Dubbo源码学习--LeastActiveLoadBalance负载均衡(三)
LeastActive LoadBalance最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。public class LeastActiveLoadBalance extends AbstractLoadBalance { public static final String NAME = "leastacti...原创 2018-03-26 19:06:27 · 2756 阅读 · 1 评论 -
Dubbo源码学习--RandomLoadBalance负载均衡(二)
Random LoadBalance随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。RandomLoadBalance中会根据每个服务调用的权值次数来进行随机数,这样权值越大,动态调整越均衡。public class RandomLoadBalance extends AbstractLoadBalance {...原创 2018-03-24 17:11:08 · 1060 阅读 · 0 评论 -
Dubbo源码学习--LoadBalance负载均衡(一)
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。可以自行扩展负载均衡策略,参见:负载均衡扩展负载均衡策略Random LoadBalance随机,按权重设置随机概率。在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。RoundRobin LoadBalance轮循,按公约后的权重设置轮循比率。存在慢的提供者...原创 2018-03-24 17:10:51 · 1969 阅读 · 0 评论 -
Dubbo源码学习--Multicast 注册中心(四)
Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。提供方启动时广播自己的地址消费方启动时广播订阅请求提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了 unicast=false,则广播给订阅者消费方收到提供方地址时,连接该地址进行 RPC 调用。组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.25...原创 2018-03-22 20:49:43 · 5616 阅读 · 0 评论 -
Dubbo源码学习--Redis注册中心(三)
基于 Redis 1 实现的注册中心 2。使用 Redis 的 Key/Map 结构存储数据结构:主 Key 为服务名和类型Map 中的 Key 为 URL 地址Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除 3使用 Redis 的 Publish/Subscribe 事件通知数据变更:通过事件的值区分事件类型:register, unregister, subscri...原创 2018-03-22 20:10:39 · 5996 阅读 · 0 评论 -
Dubbo源码学习--Zookeeper注册中心(二)
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 1。流程说明:服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址服务消费者启动时: 订阅 /dubbo/com.foo.BarService/p...原创 2018-03-22 20:10:17 · 702 阅读 · 0 评论 -
Dubbo源码学习--注册中心(一)
目前Dubbo官方提供的注册中心有Multicast、Zookeeper、Redis和Simple注册中心,官方推荐使用Zookeeper作为生产环境的注册中心。 Dubbo官方也提供了扩展机制,开发人员可以根据自己的需要遵守一定的扩展规范开发自己的注册中心,扩展接口主要有如下几个接口:com.alibaba.dubbo.registry.RegistryFactorycom.ali...原创 2018-03-22 18:33:44 · 855 阅读 · 0 评论 -
Dubbo源码学习--动态代码编译器Compiler
在之前一篇博客中Dubbo入门学习--SPI实现@SPI和@Adaptive,我们已经了解到Dubbo通过生成动态代码来实现动态代理的,Dubbo提供了动态代码编译器接口Compiler。Compiler接口:@SPI("javassist")public interface Compiler { /** * Compile java source code. * * @par...原创 2017-08-25 19:05:21 · 1540 阅读 · 2 评论 -
Dubbo源码学习--SPI实现@SPI和@Adaptive
上一篇博客 Dubbo入门学习--Dubbo服务提供接口SPI机制我们已经简单介绍了Dubbo的SPI机制,这篇博客我们来剖析一下Dubbo是如何使用SPI机制的,在接口中使用@SPI("值")使用默认的实现类,如果我们不想使用默认的实现类是如何处理的。1、获取指定实现类在ExtensionLoader中获取默认实现类或者通过实现类名称来获取实现类。Protocol refprotocol = E...原创 2017-08-23 22:21:15 · 9634 阅读 · 5 评论