从零开始认识Dubbo

Python017

从零开始认识Dubbo,第1张

[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组件更新太快,配置繁琐。