使用Dubbo进行远程调用实现服务交互,它支持多种协议,如Hessian、HTTP、RMI、Memcached、Redis等等。由于Dubbo将这些协议的实现进行了封装了,无论是服务端(开发服务)还是客户端(调用服务),都不需要关心协议的细节,只需要在配置中指定使用的协议即可,从而保证了服务提供方与服务消费方之间的透明。
1.Dubbo架构
节点角色说明:
- Provider: 暴露服务的服务提供方。
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container:服务运行容器
调用关系说明:
- 0. 服务容器负责启动,加载,运行服务提供者。
- 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
- 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
2.Dubbo的连接方式
Dubbo的客户端和服务端有三种连接方式,分别是:广播,直连和使用zookeeper注册中心
2.1 Dubbo广播
这种方式是dubbo官方入门程序所使用的连接方式,但是这种方式有很多问题,在企业开发中不使用
服务端配制:
<!--配制dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-service"/>
<!--使用multicast广播注册暴露服务地址-->
<dubbo:registry address="multicast://192.168.9.4:88888" />
<!--使用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明暴露的服务接口-->
<dubbo:service interface="com.demo.manger.service.TestService" ref="testServiceImpl" />
客户端配制
<!--配合dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-web"/>
<!--使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://19.188.8.9:8888"/>
<!--声明需要暴露的接口-->
<dubbo:reference interface="com.demo.manager.service.TestService" id="testService" timeout="1000000" />
2.2Dubbo直连
Dubbo直连,首先要取消广播,然后客户端直接到指定的url获取服务即可。这种方式在企业中一般在开发中环境中使用,但是生产环境很少使用,因为服务是直接调用,没有使用注册中心,很难对服务进行管理
服务端
<!--配制dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-service"/>
<!--使用multicast广播注册暴露服务地址-->
<-- <dubbo:registry address="multicast://192.168.9.4:88888" /> -->
<dubbo:registry adress="N/A">
<!--使用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明暴露的服务接口-->
<dubbo:service interface="com.demo.manger.service.TestService" ref="testServiceImpl" />
客户端
<!--配合dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-web"/>
<!--使用multicast广播注册中心暴露服务地址 -->
<-- <dubbo:registry address="multicast://19.188.8.9:8888"/> -->
<!--声明需要暴露的接口-->
<dubbo:reference interface="com.demo.manager.service.TestService" id="testService" timeout="1000000" url="dubbo://127.0.0.1:20880" />
2.3Dubbo注册中心
Dubbo注册中心和广播配置类似,不过需要指定注册中心类型和注册中心地址,这个时候就不是把服务信息进行广播了,而是告诉给注册中心进行管理,这个时候我们就需要有一个注册中心。官方推荐使用zookeeper作为注册中心。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者在启动时与注册中心交互,消费者不断的发起请求获取服务信息,注册中心不转发请求,压力较小。
2.3.1 zookeeper使用
服务端
<!--配制dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-service"/>
<!--使用multicast广播注册暴露服务地址-->
<!-- <dubbo:registry address="multicast://192.168.9.4:88888" /> -->
<!--<dubbo:registry adress="N/A"> -->
<dubbo:registry protocol="zookeeper" address="192.168.37,136:2181">
<!--使用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明暴露的服务接口-->
<dubbo:service interface="com.demo.manger.service.TestService" ref="testServiceImpl" />
客户端
<!--配合dubbo-->
<!--提供应用信息,用于计算依赖关系-->
<dubbo:application name="demo-web"/>
<!--使用multicast广播注册中心暴露服务地址 -->
<-- <dubbo:registry address="multicast://19.188.8.9:8888"/> -->
<dubbo:registry protocol="zookeeper" address="192.168.37.1336:2181"/>
<!--声明需要暴露的接口-->
<dubbo:reference interface="com.demo.manager.service.TestService" id="testService" timeout="1000000" />