[TOC]
1.Dubbo是什么
Apache Dubbo 是一款高性能Java RPC框架。
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东, 说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册) 其核心部分包含:
2.Dubbo能做什么
Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
3.Dubbo架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
4.Dubbo的使用方法
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,可以通过API的方式进行调用(注解式,不推荐使用)
下载安装zookeeper注册中心(不建议使用multicast)
1.Windows
下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
使用方法:下载解压即可,进入解压目录运行zkServer.cmd启动注册服务中心
截图:
2.MacOS
下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
使用方法:下载解压即可,进入解压目录运行zkServer.sh start启动注册服务中心
3.Linux
下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
使用方法:下载解压即可,进入解压目录运行zkServer.sh start启动注册服务中心
服务提供者
1.定义服务接口(该接口需单独打包,在服务提供方和消费方共享)
DemoService.java
2.服务提供方实现接口:(对服务消费方隐藏实现)
DemoServiceImpl.java
dubbo-provider.xml:
4.加载Spring配置,启动服务:
Provider.java:
或者使用springBoot启动
服务消费者:
applicationContext-dubbo.xml 中注册自己需要调用的接口。
1.通过Spring配置引用远程服务
dubbo-consumer.xml:
2.加载Spring配置,并调用远程服务:
Consumer.java
或者使用springBoot启动
并添加对应的restful接口提供接口访问
修改对应index页面
3.dubbo管理页面:
启动后访问 http://localhost:8080/dubbo-admin/
输入账号密码root/root
应用页面:
提供者页面:
消费者页面:
服务页面:
测试是否成功,只要看状态是否正常,就ok了 ....
provider-log:
5.使用Dubbo可能遇到的问题
1、org.springframework.beans.factory.BeanCreationException
原因分析:
解决方案
2、org.apache.dubbo.rpc.RpcException
原因分析
解决方案
可能是因为providers没有启动,或者是provider对应暴露的服务被禁用,启动providers或者解除禁用即可
3、java.lang.IllegalStateException
原因分析
解决方案
总结以上两点,通俗点讲,就是重启了工程(可能是因为直接修改代码,工程reload了), 并且,连过了数据库(登录等),才出现了上述报错信息。原因是因为在tomcat重启的时候,之前的tomcat的线程还没有完全关闭,最新启动tomcat就会报这个异常。
4、org.apache.dubbo.remoting.TimeoutException
原因分析
解决方案
在dubbo-provider.xml增加超时时间
Dubbo是 Alibaba 开源的分布式服务框架远程调用框架,在网络间传输数据,就需要通信协议和序列化。
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的,默认也是用的dubbo协议。
先介绍几种常见的协议:
缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用
1、dubbo默认采用dubbo协议,dubbo协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
2、他不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
配置如下:
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name=“dubbo” port=“9090” server=“netty” client=“netty” codec=“dubbo”
serialization=“hessian2” charset=“UTF-8” threadpool=“fixed” threads=“100” queues=“0” iothreads=“9”
buffer=“8192” accepts=“1000” payload=“8388608” />
3、Dubbo协议缺省每服务每提供者每消费者使用单一长连接,如果数据量较大,可以使用多个连接。
<dubbo:protocol name="dubbo" connections="2" />
4、为防止被大量连接撑挂,可在服务提供方限制大接收连接数,以实现服务提供方自我保护
<dubbo:protocol name="dubbo" accepts="1000" />
Java标准的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:TCP
传输方式:同步传输
序列化:Java标准二进制序列化
适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
适用场景:常规远程服务方法调用,与原生RMI服务互操作
RMI协议采用JDK标准的java.rmi.*实现,采用阻塞式短连接和JDK标准序列化方式 。
基于Hessian的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
1、Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
2、Hessian是Caucho开源的一个RPC框架: http://hessian.caucho.com ,其通讯效率高于WebService和Java自带的序列化。
基于http表单的远程调用协议。参见:[HTTP协议使用说明]
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:表单序列化
适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
适用场景:需同时给应用程序和浏览器JS使用的服务。
基于WebService的远程调用协议。
连接个数:多连接
连接方式:短连接
传输协议:HTTP
传输方式:同步传输
序列化:SOAP文本序列化
适用场景:系统集成,跨语言调用
序列化是将一个对象变成一个二进制流就是序列化, 反序列化是将二进制流转换成对象
为什么要序列化?
Dubbo序列化支持java、compactedjava、nativejava、fastjson、dubbo、fst、hessian2、kryo,其中默认hessian2。其中java、compactedjava、nativejava属于原生java的序列化。
hessian2序列化:hessian是一种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的,它是dubbo RPC默认启用的序列化方式。
json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。
java序列化:主要是采用JDK自带的Java序列化实现,性能很不理想。
1,dubbo是什么
dubbo是阿里巴巴开源的,基于JAVA的 RPC (Remote Procedure Call)分布式服务框架。现已成为Apache基金孵化项目
2,为什么要使用dubbo
dubbo内部使用了Netty,zookeeper,保证了应用的高可用性和高性能。使用dubbo可以将核心业务抽取出来,最为独立的服务,并逐渐发展成稳定的服务中心。这样就可以复用灵活拓展,满足前端多变的市场需求,最重要的一点是,分布式架构能够承受更大规模的并发量
3、Dubbo 和 Spring Cloud 有什么区别?
两者没有关联,非要说区别。1,通信方式不同:dubbo使用的是RPC通信,Spring Cloud使用的是HTTP RESTFull方式。2,组成方式不同
4,Dubbo都支持哪些协议,推荐使用哪种
dubbo(推荐),http,webservice,rmi,redis
5,dubbo需要web容器吗?
不需要,如果硬要用web容器,只会增加复杂性,也浪费资源
6,dubbo内置了哪几种服务容器
spirng container , jetty container , log4j container。dubbo的服务容器只是一个简单的main方法,并加载一个简单的spring容器,用于暴露服务。
7,dubbo里面有哪几种节点角色
8、画一画服务注册与发现的流程图
9、Dubbo默认使用什么注册中心,还有别的选择吗?
推荐使用zookeeper,还有redis,multicast,simple注册中心,但不推荐
10、Dubbo有哪几种配置方式?
1,spring(XML)配置方式 2,java api配置方式
11、Dubbo 核心的配置有哪些?
12、在 Provider 上可以配置的 Consumer 端的属性有哪些?
1)timeout:方法超时
2)retries:失败重试次数,默认尝试两次
3)loadbalance:负载均衡算法
4)actives:消费者端,最大并发调用次数
13、Dubbo启动时如果依赖的服务不可用会怎样?
Dubbo会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止spring初始化完成,默认check=“true”,可以通过设置check="false",关闭检查。(比如spring是懒加载的,或者设置成了循环依赖,必须有一方要先启动时)
14、Dubbo推荐使用什么序列化框架,你知道的还有哪些?
推荐使用hessian序列化框架。还有dubbo,FastJson,java自带的序列化框架
15、Dubbo默认使用的是什么通信框架,还有别的选择吗?
默认使用的是Netty框架
16、Dubbo有哪几种集群容错方案,默认是哪种?
failover cluster:失败自动切换,自动重试其他服务器。
failfast cluster:快速失败,立即报错,只调用一次
failsafe cluster:失败安全,出现异常直接忽略
forking cluster:并行调用多个服务器,只要一个成功,就返回
broadcast cluster:广播逐个调用所有提供者,任意一个报错就报错
17、Dubbo有哪几种负载均衡策略,默认是哪种?
Random loadbalance :随机
RandomRobin loadbalance:轮询
LeastActive loadbalance:最少活跃次数
ConsistentHash loadbalance:一致性hash
18、注册了多个同一样的服务,如果测试指定的某一个服务呢?
可以配置点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表,A接口配置点对点,不影响B接口从注册中心获取列表。如果是线上需求需要点对点,可在<dubbo:reference>中配置url指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下:(1.0.6及以上版本支持):
<dubbo:reference id="xxxService"interface="com.alibaba.xxx.XxxService"url="dubbo://localhost:20890"/>
19、Dubbo支持服务多协议吗?
支持。dubbo支持不同的服务使用不同的协议,也支持同一个服务上同时支持多种协议。
20、当一个服务接口有多种实现时怎么做?
当一个接口有多种实现时,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。
21、服务上线怎么兼容旧版本?
使用版本号(version)过渡,多个不同版本的服务注册到注册中心,版本号不同的服务间相互不引用,这个和group分组有点像。
22、Dubbo可以对结果进行缓存吗?
可以。dubbo提供了声明式缓存,用于加速热门数据的访问速度。减少用户加载缓存的工作量
23、Dubbo服务之间的调用是阻塞的吗?
默认是阻塞的。但支持异步调用,可以在方法没有返回值的时候使用。
24、Dubbo支持分布式事务吗?
目前暂时不支持,后续可能采用基于JTA/XA的规范实现
25、Dubbo telnet 命令能做什么?
通过telnet命令实现服务的治理。telnet localhost 8090
26、Dubbo支持服务降级吗?
dubbo2.2.0以上版本支持服务降级
27、Dubbo如何优雅停机?
dubbo是通过JDK自带的shutdownhook,来完成优雅停机的。如果使用kill 9 -pid等强制关闭指令,是不会执行优雅停机的,只有通过kill PID才会执行
28、服务提供者能实现失效踢出是什么原理?
基于zookeeper的临时节点
29、如何解决服务调用链过长的问题?
通过pinPoint和skywalking实现服务追踪
30、服务读写推荐的容错策略是怎样的?
读操作使用failover cluster。失败自动切换,默认重试两次其他服务器
写操作使用failfast cluster。快速失败,立即报错,只执行一次
31、Dubbo必须依赖的包有哪些?
dubbo必须依赖jdk,其他为可选
32、Dubbo的管理控制台能做什么?
路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡等等功能
33、说说 Dubbo 服务暴露的过程。
dubbo在spring容器实例化bean之后,刷新容器最后一步发布ContextRefreshEvent事件,通知实现了ApplicationListener的service执行onApplicationEvent事件方法,在该方法中,dubbo就会调用ServiceBean的父类,ServiceConfig中的export方法,而该方法真正实现了服务的暴露(异步或者非异步)
34、Dubbo 停止维护了吗?
2014年停止维护,2017年重新开始维护,并进入了apache项目
35、Dubbo 和 Dubbox 有什么区别?
dubbox是dubbo停止维护之后,当当网根据dubbo做的一个拓展项目,如加了服务可以restful调用,更新了开源组件
36、你还了解别的分布式框架吗?
spring cloud 还有Facebook的twitter
37、Dubbo 能集成 Spring Boot 吗?
可以
38、在使用过程中都遇到了些什么问题?
dubbo的设计是针对高并发小数据量的应用,如果数据量规模过大,建议使用http或者rmi协议
39、你读过 Dubbo 的源码吗?
读过,巴拉巴拉
40、你觉得用 Dubbo 好还是 Spring Cloud 好?
扩展性的问题,没有好坏,只有适合不适合。不过我更倾向于dubbo,spring cloud组件更新太快,配置繁琐。