dubbo的学习总结
1.什么是dubbo
dubbo是一个分布式服务架构,致力于提供高性能和透明化的RPC远程服务调用方案,是SOA服务化治理方案的核心框架。
分布式服务架构RPC:应用之间产生交互,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能够快速的响应多变的市场需求。
流动计算架构:当服务越来越多,容量的评估,资源的浪费等问题显现,此时增加一个调度中心基于访问压力实时管理集群容量,提高集群的利用率,即资源调度和治理中心SOA。
dubbo就是资源调度和治理中心的管理工具。
dubbo是系统之间通信的框架,可以统计和管理服务之间的调用情况。包括服务被谁调用了,调用的次数,以及服务的使用情况。
此外:dubbo还可以实现软负载均衡。
2.dubbo的架构
角色节点说明
Provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Register:注册中心 --这里就是zookeeper
Monitor:监控中心
Container:服务运行容器
调用关系说明
0.服务运行容器,负责启动,加载,运行服务提供者。
1.服务提供者向注册中心注册自己提供的服务
2.服务消费者在启动时,向注册中心订阅自己所需的服务
3.注册中心返回服务提供者地址列表给消费者,若有变更,推送变更
4.******服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用
invoke
5.服务者和消费者,定时发送数据到监控中心
在实际调用过程中,Provider的位置对于Consumer来说是透明的,上一次调用服务的位置(IP地址)和下一次调用服务的位置,是不确定的。这个地方就是实现了软负载。
3.dubbo的使用
采用全spring配置方式
对比:
(1)单一工程中spring的配置
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
action层直接引入service
(2)远程服务
将服务定义部分放在服务提供方 provide.xml
将服务引用部分放在服务消费方consumer.xml
在提供方增加暴露服务配置,在消费方增加引用服务配置
服务层发布服务:(提供者)
<!-- 和本地服务一样实现远程服务 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 增加暴露远程服务配置 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
表现层调用服务:(消费者)
<!-- 增加引用远程服务配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服务一样使用远程服务 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
理解为二者通过标绿部分找到。
逻辑关系仔细理清一下!!!
提供者
<!-- 使用dubbo发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="taotao-manager" />
<dubbo:registry protocol="zookeeper" address="192.168.25.128:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.taotao.service.TestService" ref="testServiceImpl" />
消费者
<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.128:2181"/>
<dubbo:reference interface="com.taotao.service.TestService" id="testService" />
思考:为什么ref="testServiceImpl"可以没有指明呢?