阿里云产品Dubbo文档格式.docx
《阿里云产品Dubbo文档格式.docx》由会员分享,可在线阅读,更多相关《阿里云产品Dubbo文档格式.docx(21页珍藏版)》请在冰点文库上搜索。
![阿里云产品Dubbo文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/0ffbacf4-0eb2-400d-a1b9-3c5401bbaef6/0ffbacf4-0eb2-400d-a1b9-3c5401bbaef61.gif)
3原理逻辑示意图
节点角色说明:
✧Provider:
暴露服务的服务提供方。
✧Consumer:
调用远程服务的服务消费方。
✧Registry:
服务注册与发现的注册中心。
✧Monitor:
统计服务的调用次调和调用时间的监控中心。
✧Container:
服务运行容器。
调用关系说明:
1.服务容器负责启动,加载,运行服务提供者。
2.服务提供者在启动时,向注册中心注册自己提供的服务。
3.服务消费者在启动时,向注册中心订阅自己所需的服务。
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
4应用框架(说明该产品的应用模式)
集群容错
各节点关系:
∙这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。
∙Directory代表多个Invoker,可以把它看成List<
Invoker>
,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。
∙Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
∙Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。
∙LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选
负载均衡
在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。
RandomLoadBalance
∙随机,按权重设置随机概率。
∙在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobinLoadBalance
∙轮循,按公约后的权重设置轮循比率。
∙存在慢的提供者累积请求问题,比如:
第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActiveLoadBalance
∙最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
∙使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHashLoadBalance
∙一致性Hash,相同参数的请求总是发到同一提供者。
∙当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
∙算法参见:
http:
//en.wikipedia.org/wiki/Consistent_hashing。
∙缺省只对第一个参数Hash,如果要修改,请配置<
dubbo:
parameterkey="
hash.arguments"
value="
0,1"
/>
∙缺省用160份虚拟节点,如果要修改,请配置<
hash.nodes"
320"
线程模型
事件处理线程说明
∙如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。
∙但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。
∙如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
5使用限制
Dubbo运行JDK1.5之上。
6部署依赖关系
依赖系统
缺省依赖javassist、netty、spring等包,但不是必须依赖,通过配置Dubbo可不依赖任何三方库运行。
DUBBO缺省依赖:
∙log4j.jar和commons-logging.jar日志输出包。
可以直接去掉,dubbo本身的日志会自动切换为JDK的java.util.logging输出。
但如果其它三方库比如spring.jar间接依赖commons-logging,则不能去掉。
∙javassist.jar字节码生成。
如果<
providerproxy="
jdk"
或<
consumerproxy="
,以及<
applicationcompiler="
,则不需要。
∙spring.jar配置解析。
如果用ServiceConfig和ReferenceConfig的API调用,则不需要。
∙netty.jar网络传输。
protocolserver="
mina"
/>
grizzly"
,则换成mina.jar或grizzly.jar。
protocolname="
rmi"
DUBBO可选依赖:
以下依赖,在主动配置使用相应实现策略时用到,需自行加入依赖。
∙mina:
1.1.7
∙grizzly:
2.1.4
∙httpclient:
4.1.2
∙hessian_lite:
3.2.1-fixed
∙xstream:
1.4.1
∙fastjson:
1.1.8
∙zookeeper:
3.3.3
∙jedis:
2.0.0
∙xmemcached:
1.3.6
∙jfreechart:
1.0.13
∙hessian:
4.0.7
∙jetty:
6.1.26
∙hibernate-validator:
4.2.0.Final
∙zkclient:
0.1
∙curator:
1.1.10
∙cxf:
2.6.1
∙thrift:
0.8.0
项目的Maven的POM文件增加DUBBO的依赖
如果想将此发布包用于你的Maven项目,请在你项目的Maven的POM文件中加上以下依赖:
如果:
Dubbo已发布到Maven中央仓库中:
http:
//central.maven.org/maven2/com/alibaba/dubbo
Pom.xml文件如下:
<
project>
dependencies>
dependency>
groupId>
com.alibaba<
/groupId>
artifactId>
dubbo<
/artifactId>
version>
2.5.3<
/version>
/dependency>
/dependencies>
/project>
系统间数据流关系
服务提供者暴露一个服务的详细过程
图是服务提供者暴露服务的主过程:
首先ServiceConfig类拿到对外提供服务的实际类ref(如:
HelloWorldImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转化。
接下来就是Invoker转换到Exporter的过程。
Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程(如上图中的红色部分),下面我们以Dubbo和RMI这两种典型协议的实现来进行说明:
●Dubbo的实现
Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法,它主要是打开socket侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现。
●RMI的实现
RMI协议的Invoker转为Exporter发生在RmiProtocol类的export方法,
它通过Spring或Dubbo或JDK来实现RMI服务,通讯细节这一块由JDK底层来实现,这就省了不少工作量。
服务消费者消费一个服务的详细过程
上图是服务消费的主过程:
首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图中的红色部分),这是服务消费的关键。
接下来把Invoker转换为客户端需要的接口(如:
HelloWorld)。
关于每种协议如RMI/Dubbo/Webservice等它们在调用refer方法生成Invoker实例的细节和上一章节所描述的类似。
7产品环境要求
开发环境
基础样例
开发指南
1.服务提供者
(1)定义服务接口:
(该接口需单独打包,在服务提供方和消费方共享)
DemoService.java
packagecom.alibaba.dubbo.demo;
publicinterfaceDemoService{
StringsayHello(Stringname);
}
(2)在服务提供方实现接口:
(对服务消费方隐藏实现)
DemoServiceImpl.java
packagecom.alibaba.dubbo.demo.provider;
importcom.alibaba.dubbo.demo.DemoService;
publicclassDemoServiceImplimplementsDemoService{
publicStringsayHello(Stringname){
return"
Hello"
+name;
}
(3)用Spring配置声明暴露服务:
provider.xml
?
xmlversion="
1.0"
encoding="
UTF-8"
>
beansxmlns="
//www.springframework.org/schema/beans"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
dubbo="
xsi:
schemaLocation="
//www.springframework.org/schema/beans
//www.springframework.org/schema/beans/spring-beans.xsd
"
!
--提供方应用信息,用于计算依赖关系-->
applicationname="
hello-world-app"
--使用multicast广播注册中心暴露服务地址-->
registryaddress="
multicast:
//224.5.6.7:
1234"
--用dubbo协议在20880端口暴露服务-->
protocolname="
dubbo"
port="
20880"
--声明需要暴露的服务接口-->
serviceinterface="
com.alibaba.dubbo.demo.DemoService"
ref="
demoService"
--和本地bean一样实现服务-->
beanid="
class="
com.alibaba.dubbo.demo.provider.DemoServiceImpl"
/beans>
(4)加载Spring配置
Provider.java
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassProvider{
publicstaticvoidmain(String[]args)throwsException{
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(newString[]{"
provider.xml"
});
context.start();
System.in.read();
//按任意键退出
2.服务消费者
(1)通过Spring配置引用远程服务
consumer.xml
--消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样-->
consumer-of-helloworld-app"
--使用multicast广播注册中心暴露发现服务地址-->
--生成远程服务代理,可以和本地bean一样使用demoService-->
referenceid="
interface="
(2)加载Spring配置,并调用远程服务:
(也可以使用IoC注入)
Consumer.java
publicclassConsumer{
consumer.xml"
DemoServicedemoService=(DemoService)context.getBean("
);
//获取远程服务代理
Stringhello=demoService.sayHello("
world"
//执行远程方法
System.out.println(hello);
//显示调用结果
部署环境
部署方式
3.部署DUBBO注册中心(必选)
ZOOKEEPER注册中心安装:
✧建议使用dubbo-2.3.3以上版本的zookeeper注册中心客户端
✧Zookeeper是ApacheHadoop的子项目,强度相对较好,建议生产环境使用该注册中心
✧Dubbo未对Zookeeper服务器端做任何侵入修改,只需安装原生的Zookeeper服务器即可,所有注册中心逻辑适配都在调用Zookeeper客户端时完成
安装:
wgethttp:
//www.apache.org/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
tarzxvfzookeeper-3.3.3.tar.gz
cdzookeeper-3.3.3
cpconf/zoo_sample.cfgconf/zoo.cfg
配置:
viconf/zoo.cfg
如果需要集群,zoo.cfg的内容如下:
(其中data目录和server地址需改成你真实部署机器的信息)
如果不需要集群,zoo.cfg的内容如下:
(其中data目录需改成你真实输出目录)
zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/dubbo/zookeeper-3.3.3/data
clientPort=2181
clientPort=2181
server.1=10.20.153.10:
2555:
3555
server.2=10.20.153.11:
3555
并在data目录下放置myid文件:
(上面zoo.cfg中的dataDir)
mkdirdata
vimyid
myid指明自己的id,对应上面zoo.cfg中server.后的数字,第一台的内容为1,第二台的内容为2,内容如下:
myid
1
4.部署DUBBO监控中心(可选)
管理控制台为阿里内部裁剪版本,开源部分主要包含:
路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能/
wget
tarzxvfapache-tomcat-6.0.35.tar.gz
cdapache-tomcat-6.0.35
rm-rfwebapps/ROOT
unzipdubbo-admin-2.4.1.war-dwebapps/ROOT
配置:
(或将dubbo.properties放在当前用户目录下)
viwebapps/ROOT/WEB-INF/dubbo.properties
dubbo.properties
dubbo.registry.address=zookeeper:
//127.0.0.1:
2181
dubbo.admin.root.password=root
dubbo.admin.gu