节点说明:
- Provider:暴露服务的服务提供方
- Container:服务运行容器
- Registry:服务注册于发现的注册中心
- Consumer:调用注册于发现的注册中心
- Monitor:统计服务的调用次数和调用的监控中心
关系说明:
- 0:服务容器负责启动,加载,运行服务提供者
- 1:服务提供者在启动的时候,向注册中心注册自己提供的服务
- 2:服务消费者在启动的时候,想注册中心订阅自己所需要的服务
- 3:注册中心返回服务提供者的地址列表给消费者,如果有变更,注册中心将基于长连接推送变更的数据给消费者
- 4:服务消费方,从提供者地址列表中,基于软负载的均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
- 5:服务消费者和提供者,在呢哦村中累计调用次数和调用的时间,定时每分钟发送一个统计数据到监控中心
连通性:
注册中心负责服务地址的注册于查找,相当于目录服务,服务提供者和消费者只在启动的时候于注册中心交互,注册中心不转发请求,压力较小。
监控中心负责统计各服务调用的次数,调用的时间等,统计先在内存汇总后每分钟发送一次到监控中心服务器,并以报表展示
服务提供者想注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
服务消费方在注册中心获取服务提供者地址列表,并根据负载短发直接调用服务提供者,同时汇报调用时间到监控中心,此时间包含网络开销的时间
注册中心,服务提供者,服务消费者三者之间均属于长连接,监控中心除外
注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
注册中心和监控中心都是可选的,服务消费者可以直姐连接到服务提供者
健壮性:
- 监控中心宕机后不影响使用,只是丢失部分采样数据
- 数据库宕机后,注册中心仍能通过缓存提供服务列表查询,但不能注册新的服务
- 注册中心对等集群,任意一台宕机后,将自动切换到另一台
- 注册中心全部宕机后,服务提供者和服务消费者仍能通过本地缓存通信
- 服务提供者无状态,任意一台宕机后,不影响使用
- 服务提供者全部宕机后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复(可以设置重试连接的次数)
伸缩性:
- 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的 注册中心
- 服务提供者无状态,可动态增加机器部署的实例,注册中心将推送新的服务信息给消费者
当zookeeper宕机后,dubbo的消费者也可以访问生产者,因为项目在启动的时候,回去主动拉取生产者的地址端口等数据,每次消费者应用访问的时候首先是从本地址的缓存中读取。
服务方配置 : 可以引入服务和发布服务
流程:首先服务名称- --- >服务发布的地址--- > 服务的端口 ---> 使用的协议 --- > 提供的服务的版本号,协议 -- > 依赖的版本号,连接的次数,超时的时间,-- > 引入的服务(可选) -- > 提供的服务(可选)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="${dubbo.name}" />
<dubbo:registry protocol="zookeeper" address="${dubbo.url}" />
<dubbo:protocol name="dubbo" port="-1" />
<!-- rest协议 -->
<dubbo:protocol name="rest" server="servlet" port="${rest.port}" contextpath="${rest.contextpath}"/>
<!-- 该标签为<dubbo:service>和<dubbo:protocol>标签的缺省值设置
retries ==> 服务调用超时时自动重试的次数
timeout = => 服务超时时间(单位:毫秒)
-->
<dubbo:provider retries="0" timeout="20000" protocol="dubbo" version="${dubbo.version1}" />
<!-- 该标签为<dubbo:reference>标签的缺省值设置
retries ==> 服务调用超时时自动重试的次数
timeout ==> 服务超时时间(单位:毫秒)
-->
<dubbo:consumer retries="0" timeout="10000" version="${dubbo.version}" />
<dubbo:reference id="cbService" interface="com.strongit.nj.czyd.sim.service.inter.shipinfo.ICbService" />
</beans>
对外提供的服务,在设置对外提供的接口的时候,ref引用的是接口的实现类的@Server(name="xxxxx")中的xxxx
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:service interface="com.strongit.nj.wjcz.ais.service.inter.BindingTransactionalService" protocol="dubbo" ref="bindingTransactionalServiceImpl" timeout="10000" />
<dubbo:service interface="com.strongit.nj.wjcz.ais.service.inter.BindingQueryService" protocol="dubbo" ref="bindingQueryServiceImpl" timeout="10000" />
<dubbo:service interface="com.strongit.nj.wjcz.rest.ILocationInfoService" protocol="rest" ref="locationInfoServiceImpl" timeout="5000" />
</beans>
消费方: 消费不能自己提供服务,但是可以引入服务
流程:发布到注册中心的名称 ---> 注册中心的地址 ----- > 引入服务的地址 ---- > 引入相关的接口
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--在发布服务的时候的名称 -->
<dubbo:application name="${appname}" />
<!-- 注册中心地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.address}" timeout="300000"/>
<!-- 用于指定协议和端口号,协议是由提供方指定,消费方被动接受 -->
<dubbo:protocol name="dubbo" port="-1" />
<!-- 该标签为<dubbo:reference>标签的缺省值设置
retries ==> 服务调用超时时自动重试的次数
timeout ==> 服务超时时间(单位:毫秒)
-->
<dubbo:consumer retries="0" timeout="100000" version="${dubbo.version}" />
<dubbo:reference id="organiseService" interface="com.strongit.nj.czyd.bim.service.inter.organise.IOrgService" />
<dubbo:reference id="yhService" interface="com.strongit.nj.czyd.bim.service.inter.user.IYhService" />
<dubbo:reference id="permissionService" interface="com.strongit.nj.czyd.bim.service.inter.permission.IPermissionService" />
<dubbo:reference id="uploadFileService"
interface="com.strongit.nj.czyd.bim.service.inter.uploadFile.IUploadFileService"/>
</beans>
在引用服务的时候, id表示的是@Server(name="xxxx")服务层的Server的名称,interface引用的是api中的接口
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:reference id="cbService" interface="com.strongit.nj.czyd.sim.service.inter.shipinfo.ICbService" />
<dubbo:reference id="bindingTransactionalService" interface="com.strongit.nj.wjcz.ais.service.inter.BindingTransactionalService" />
<dubbo:reference id="bindingQueryService" interface="com.strongit.nj.wjcz.ais.service.inter.BindingQueryService" />
<dubbo:reference id="qyfxService" interface="com.strongit.nj.wjcz.qyfx.service.inter.IQyfxService" />
</beans>