RPC及Dubbo入门源码学习
文章平均质量分 89
军伟@
Java开发工程师
展开
-
Dubbo源码学习--ExceptionFilter 异常处理机制
背景我们的项目使用了dubbo进行不同系统之间的调用。每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException)。全局的异常处理会根据不同的异常类型进行不同的处理。最近我们发现,某个系统调用dubbo请求,provider端(服务提供方)抛出了自定义的业务异常,但consumer端(服务消费方)拿到的并不是自定义的业务异常。这是为什...转载 2019-05-28 10:26:31 · 848 阅读 · 0 评论 -
Dubbo源码学习--MergeableCluster集群容错(九)
MergeableCluster聚合集群,将集群中的调用结果聚合起来返回结果。比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。比较鸡肋,小点的项目应该都用不到配置如:(搜索所有分组)按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,...原创 2018-03-29 20:36:57 · 1291 阅读 · 0 评论 -
Dubbo源码学习--ForkingCluster集群容错(八)
Forking Cluster并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。在ForkingCluster中是由ForkingClusterInvoker来帮助完成实现的。public class ForkingCluster implements Cluster { public final...原创 2018-03-27 18:58:03 · 1173 阅读 · 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 · 1777 阅读 · 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 · 882 阅读 · 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 · 788 阅读 · 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 · 584 阅读 · 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源码学习--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源码学习--webservice协议(十)
基于 WebService 的远程调用协议,基于 Apache CXF 1 的 frontend-simple 和 transports-http 实现 2。可以和原生 WebService 服务互操作,即:提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用,或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 We...原创 2018-04-14 23:49:10 · 968 阅读 · 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 · 2197 阅读 · 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 · 11961 阅读 · 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 · 31368 阅读 · 5 评论 -
Dubbo源码学习--Hession协议(四)
Hessian 1 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用或者提供方用标准 Hessian 暴露服...原创 2018-04-13 20:14:47 · 897 阅读 · 0 评论 -
Dubbo源码学习--Http协议(三)
基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 1特性连接个数:多连接连接方式:短连接传输协议:HTTP传输方式:同步传输序列化:表单序列化适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。适用场景:需同时给应用程序和浏览器 JS 使用的服务。约束参数及返回值需符合 Bean 规范配置配置...原创 2018-04-13 20:14:27 · 1276 阅读 · 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 · 3171 阅读 · 1 评论 -
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源码学习--Filter过滤器
Dubbo提供反过滤器应该类似servlet中我们经常用到的Filter,是一种递归的链式调用,用来在远程调用真正执行的前后加入一些逻辑。Filter接口及实现类如下:@SPIpublic interface Filter { /** * do invoke filter. * <p> * <code> * // ...原创 2018-04-15 11:49:35 · 1109 阅读 · 0 评论 -
Dubbo源码学习--接口数据序列化Serialization
在数据传输和转换过程中都需要对接口数据进行序列化和反序列化操作,接下来我们看看Dubbo目前都提供了哪些序列化和反序列化实现方式。 将对象转成字节流,用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。 目前Dubbo提供并实现如下接口来完成数据序列化和反序列操作。com.alibaba.dubbo.common.serialize.Serialization...原创 2018-04-15 11:00:14 · 7862 阅读 · 0 评论 -
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 · 996 阅读 · 0 评论 -
Dubbo源码学习--ConsistentHashLoadBalance负载均衡(五)
ConsistentHash LoadBalance一致性 Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parame...转载 2018-03-26 20:19:39 · 3047 阅读 · 2 评论 -
Hessian源码分析--HessianServlet
Hessian可以通过Servlet来对外暴露服务,HessianServlet继承于HttpServlet,但这仅仅是一个外壳,使用web服务器来提供对外的Http请求,在web.xml中我们会进行如下配置,其实就是一个简单的servlet配置,不过是增加了两个属性的配置home-class和home-api,这两个配置其实就是用来调用真正的接口及实现类的: hes原创 2016-10-12 18:52:28 · 3379 阅读 · 0 评论 -
Hessian源码分析--HessianSkeleton
HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化,获得需要执行的函数及参数值,然后根据函数和参数值执行具体的函数,接下来对执行的结果进行序列化然后通过连接返回给客户端。接下来我们按照源码一步一步进行分析,在上一篇博客Hessian源码分析--He原创 2016-10-12 19:34:34 · 2452 阅读 · 0 评论 -
简单RPC之Socket实现
最近看到Dubbo大神写得使用Socket实现的简单的RPC调用,对RPC的理解更简单了,然后根据大神的代码自己也重构了一下。RPC Server端代码,主要是使用ServerSocket获得rpc调用客户端发送过来的类信息,方法信息及方法参数信息,通过反射在RPCServer端进行代码执行,最后将执行结果发送给Socket,第一步需要首先执行RPCServer。import java.io.IO原创 2016-10-28 10:54:47 · 6064 阅读 · 0 评论 -
简单RPC实现之Netty实现
所谓RPC就是远程方法调用(Remote Process Call ),简单的来说就是通过MQ,TCP,HTTP或者自己写的网络协议来传输我要调用对方的什么接口,对方处理之后再把结果返回给我.就这么简单的一个过程。运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:1、调用客户端句柄;执行传送参数2、调用本地系统内核发送网络消息3、消息传送到远程主机4、服务器句柄得到消息并取得参数原创 2016-10-31 09:52:41 · 10959 阅读 · 10 评论 -
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 评论 -
Dubbo源码学习--Dubbo服务提供接口SPI机制
Dubbo采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!大家是否熟悉spi(service providerinterface)机制,即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLoader类实现spi机制的服务查找功能。可以参考博客 Java spi机制浅谈 接下来我们来了解一下Dubbo是如何实...原创 2017-08-23 22:20:42 · 2836 阅读 · 0 评论 -
Dubbo入门学习--Dubbo总体架构的设计介绍
背景:随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。 此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 垂直应用架构`` 当访问量逐渐增大,单一应用增加机器带来的加...转载 2017-08-23 22:19:53 · 1216 阅读 · 1 评论 -
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 · 1547 阅读 · 2 评论 -
Dubbo入门学习--Dubbo简单示例
1、Zookeeper安装 从Zookeeper官网下载,进入到bin目录下,在cms中执行zkServer就可以运行Zookeeper了。2、API接口创建一个接口jar,此接口在服务提供者和服务消费者中使用public interface IDemoServer { String sayHello(String str);}3、服务提供者applicationContext.xml中添加原创 2017-05-03 21:07:47 · 1132 阅读 · 0 评论 -
Hessian源码分析--HessianProxy
在上一篇博客 Hessian源码分析--HessianProxyFactory 中我们了解到,客户端获得的对象其实是HessianProxy生成的目标对象,当调用目标对象的方法时,会调用HessianProxy的invoke方法,如下,当调用HelloService的helloWorld函数时,会调用HessianProxy的invoke函数(对代理机制不懂的同学可以去学习一下)。Hess原创 2016-10-12 17:01:55 · 1784 阅读 · 0 评论 -
Hessian源码分析--HessianProxyFactory
HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类。如下面代码:HessianProxyFactory factory = new HessianProxyFactory();HelloService helloService = (HelloService) factory.create(HelloService.cla原创 2016-10-12 15:40:07 · 8675 阅读 · 0 评论