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

下面的配置主要分为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"   />  
在服务的实现里面
其中@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   

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值