可能我们在平常工作中都会用到dubbo,但是好多同学只是知道应用但是却不一定知道他的原理,今天来说一说dubbo的原理,首先我们要知道dubbo到底是什么,都能提供些什么服务?
一、dubbo是什么?
dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案。说白了其实dubbo就是一个远程调用的分布式框架。
二、dubbo的核心服务是什么?
1.远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2.集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3.自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
三、dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
采用spring的配置方式进行配置,完全透明化的接入应用,对应用没有任何入侵,只需要spring加载dubbo的配置就可以了。
看一下dubbo架构图
四、服务提供者暴露一个服务的详细过程:
如果你仔细观察dubbo的启动日志你会发现,dubbo的provider启动主要是以下几个过程
1.首先provider启动时,先把想要提供的服务暴露在本地。
2.然后再把服务暴露到远程。
3.启动netty服务,建立长连接。
4.连接到注册中心zk上。
5.然后监控zk上的消费服务。
五、服务消费者消费一个服务的详细过程
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例。接下来把Invoker转为客户端需要的接口。
六、下面来看本地暴露于远程暴露的区别:
本地暴露是暴露在本机JVM中,调用本地服务不需要网络通信.
远程暴露是将ip,端口等信息暴露给远程客户端,调用远程服务时需要网络通信.
七、什么情况下适用dubbo协议,什么时候适用rmi协议?
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是dubbo协议是官网推荐使用的,dubbo 缺省协议是dubbo协议,采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。RMI协议采用阻塞式(同步)短连接和 JDK 标准序列化方式。适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。后面会对其他几种协议详细介绍,这里就不赘述了。
八、Dubbo主要的配置项有哪些,作用是什么?
provider配置
consumer配置
九、Dubbo有几种容错机制
什么是容错机制?容错机制指的是某中系统控制在一定范围的一种允许或包容犯错情况的发生,举个简单的例子,我们在电脑上运行一个程序,有时候会出现无响应的情况,然后系统回弹出一个提示框让我们选择,是立即结束还是继续等待,然后根据我们的选择执行对应的操作,这就是“容错”。
在分布式架构下,网络,硬件,应用都可以发生故障,由于各个服务之间可能存在依赖关系,如果一条链路中的某一个节点出现故障,将会导致雪崩效应。为了减少某一个节点故障的影响范围,所以我们才需要去构建容错服务,来优雅的处理这种中断的响应结果
1.failsafe 失败安全,可以认为是把错误吞掉(记录日志)
2.failover(默认) 重试其他服务器;retries(2)重试的次数,默认为2次
3.failback 失败后自动恢复
4.forking forks. 设置并行数
5.Broadcast 广播,任意一台报错,则执行的方法报错,通过cluster方式,配置制定的容错方案
十、dubbo的服务降级
降级的目的是为了保证核心服务可用
降级可以有几个层面的分类:自动降级,人工降级;按照功能可以分为:读服务降级和写服务降级;
1.对一些非核心服务进行人工降级,在大促之前通过降级开关关闭那些推荐内容,评价等对主流程序没有影响的功能
2.故障降级,比如调用的远程服务挂了,网络故障,或者RPC服务返回异常。那么可以直接降级,降级的方案比如设置默认值,采用兜底数据(系统推荐的行为广告挂了,可以提前准备静态页面做返回)等等
3.限流降级,在秒杀这种流量比较集中并且流量特别大的情况下,因为突发访问量特别大可能导致系统支撑不了。这个时候可以采用限流来限制访问量。当达到阈值时,后续的请求被降级,比如进入排队页面,比如跳转到错误页面(活动火爆,请稍后重试)
Dubbo的降级方式:Mock
实现步骤
1.在client端创建一个testmock类,实现对应的IGphello的接口(需要对哪个接口进行mock,就实现哪个)名称必须以mock结尾
2.在client端的xml配置文件中,添加如下配置,增加一个mock属性指向创建的testmock
3.模拟错误(设置timeout)模拟超时异常,运行测试代码即可访问到testmock这个类,当服务端故障解除以后,调用过程将恢复正常
十一、dubbo的优先级配置
配置优先级别
1.以timeout为例,显示了配置的查找顺序,其他retries,loadbalance等类似。
(1)方法级优先,接口级次之,全局配置在次之
(2)如果级别一样,则消费方优先,提供方次之
(3)其中,服务提供方配置,通过URL经由注册中心传递给消费方
2.建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。