Dubbo解释及代码分析

Dubbo是什么
dubbo是一个分布式服务框架,那什么是分布式服务呢,简单的说,就是将复杂的服务拆分成多个小型服务共同实现完成(我自己差不多就这么理解的)
Dubbo的架构图
Dubbo解释及代码分析
角色说明
Provider:暴露服务的服务提供方
Consumer: 调用远程服务的服务消费方。Registry:服务注册与发现的注册中心
Monitor: 统计服务的调用次调和调用时间的监控中心。Container: 服务运行容器
调用关系说明
0、服务容器启动,加载服务提供者
1、服务提供者启动后,向注册中心注册服务
2、服务消费者启动,向注册中心订阅自己需要的服务,如果订阅中心当时没有自己需要的服务,会不断的向注册中心进行订阅
3、根据消费者订阅的服务,注册中心会将这些服务的地址列表发送给消费者;当注册中心有新的注册服务或者有些服务断掉的时候,会定时把变更的服务推送给消费者
4、消费者根据注册中心提供的地址列表,基于软负载均衡算法,选择其中的一台服务器进行调用其服务,如果调用失败,会另行选择别的服务器进行调用
5、消费者和提供者,调用次数和调用时间,会每分钟发送一次数据到监控中心

注:注册中心、服务提供者、服务消费者之间均为长连接
长连接:在一个TCP连接上可以连续发送多个数据包,在TCP连接期间,如果没有数据包发送,双方需要发检测包以维持此连接,一般需要自己在线维持
短连接:通信双方有数据交互的时候会建立一个TCP连接, 数据发送完成之后就断开连接,一般银行多采用短连接

Dubbo和Spring无缝对接

在Dubbo+ZK的测试代码中,主要分两个项目,一个是Provider,一个是Consumer
Provider
Dubbo解释及代码分析

下面的配置主要分为4部分:命名、注册到注册中心、对外端口号、定义服务
命名
<!-- 提供方应用信息,用于计算依赖关系 --> 
<dubbo:application name="provider"  />
注册到注册中心(这里我们用zk来作为注册中心)
<!-- 使用zookeeper注册中心暴露服务地址 -->  
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
对外端口号(暴露对外端口号,才能供消费者进行使用)
<!-- 用dubbo协议在20880端口暴露服务 -->  
<dubbo:protocol name="dubbo" port="20880" />  
定义服务
<!-- 具体的实现bean-->
<bean id="userService" class="com.service.impl.DemoServiceImpl" /> 
<!-- 声明需要暴露的服务接口--><dubbo:service interface="com.service.DemoService" ref="userService" />
 或者用Spring注解完成bean的依赖注入,同时以注解的形式调用
<!-- 开启spring注解 -->
<context:annotation-config /> 
<!-- 加入spring注解扫描 -->
<context:component-scan base-package="com.service" />
 <!-- 使用注解方式暴露接口 --> 
<dubbo:annotation package="com.service" /> 
在服务的实现里面
Dubbo解释及代码分析
其中@Component就是spring bean的注解,而@Service就是dubbo本身的注解,这两个注解合起来的意思就跟我们配置文件中先声明一个bean然后再声明接口暴露的意思是一样的。

Consumer
命名
<dubbo:application name="provider"  />
注册到注册中心
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
订阅服务
<dubbo:reference interfere="com.service.UserService" />

调用的时候切记 在服务接口上用 @Reference  
Dubbo解释及代码分析

总结:
1服务消费者 访问 本机提供者提供的服务
经过昨天一天的努力,启动服务提供者项目,在dubbo管理中心确实能看到注册成功的服务信息,但是启动消费者项目,在管理中心依然显示消费者数是0,所以产生的猜测是消费者并没有从注册中心订阅服务,原因可能是内网与外网之间的问题,如下图
Dubbo解释及代码分析

为了验证消费者是否真的可以通过dubbo从提供者调用服务,根据网上查阅的资料,将消费者的配置文件中的配置做简单修改,使其直接访问提供者提供的服务,从而避开了注册中心的问题
更改如下:
Dubbo解释及代码分析
这样消费者就可以直接访问本地搭建的提供者的服务,测试如下
Dubbo解释及代码分析

服务提供者 配置优化
从上面的服务提供者的配置中我们可以发现,提供者提供的服务接口都会在配置中进行对外暴露,如下
Dubbo解释及代码分析
这样势必会造成我们定义多少个服务接口就要在配置中配置多少个dubbo:service bean,不适合后期的维护管理等。鉴于dubbo和spring有极强的融合性,所以我直接用spring去包下面扫面,自动注册为dubbo:service,做法如下
Dubbo解释及代码分析
重点是红框标记的内容,代表使用注解的方式暴露服务接口
同时,在服务的实现上加上注释即可,如下
Dubbo解释及代码分析
注意:这里的@service并不是spring注解的service,而是alibaba的dubbo注解@service