Dubbo学习笔记

本文介绍了Dubbo,一个Java RPC框架,重点讲解了其作为服务提供者和消费者的角色,如何通过Zookeeper注册中心实现服务发现,以及与Spring框架的整合。Dubbo的调用流程和关键配置示例也进行了详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Dubbo简介

Dubbo功能其实跟上一节学习的spring cloud功能类似,都是一种分布式的服务架构,都解决了单体架构和垂直架构不易开发、拓展和维护等缺点。Dubbo是一个轻量级Java RPC框架,所谓RPC就是remote procedure call即远程调用。通俗理解,就是一个服务的controller方法,可以远程调用另一台服务器中一个服务的service方法。除了Dubbo以外,Java的RPC框架使用比较多的还有RMI、Hessian。但Dubbo又不仅有远程方法调用的功能,还具备容错和负载均衡以及服务自动注册和发现的功能。

  • RPC需要解决的为问题

通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

寻址问题:A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。

序列化与反序列化:当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。

同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

  • Dubbo使用

Provider: 暴露服务的服务提供方。 
Consumer: 调用远程服务的服务消费方。 
Registry: 服务注册与发现的注册中心。 
Monitor: 统计服务的调用次数和调用时间的监控中心。

       调用流程 
0.服务容器负责启动,加载,运行服务提供者。 
1.服务提供者在启动时,向注册中心注册自己提供的服务。 
2.服务消费者在启动时,向注册中心订阅自己所需的服务。 
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo使用zookeeper作为注册中心。先在服务器上运行zookeeper,然后在服务的provider和consumer中添加相应的xml配置文件。

Provider配置如下:

<?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-admin dubbo-monitor 会显示这个名字,方便辨识-->

<dubbo:application name="demo-provider" owner="wly" organization="dubbox"/>

<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->

<dubbo:registry address="zookeeper://localhost:2181"/>

<!-- dubbo协议在20880端口暴露服务 -->

<dubbo:protocol name="dubbo" port="20880" />

<!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->

<dubbo:service interface="com.dubbo.api.service.DemoService" ref="demoService" protocol="dubbo" />

<!--具体实现该接口的 bean-->

<bean id="demoService" class="com.dubbo.provider.service.impl.DemoServiceImpl"/>

</beans>

            Consumer配置如下:

<?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="demo-consumer" owner="wly" organization="dubbox"/>

<!-- zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->

<dubbo:registry address="zookeeper://localhost:2181"/>

<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->

<dubbo:reference id="demoService" interface="com.dubbo.api.service.DemoService"/>

</beans>

这里要注意,服务提供者处理@Service的时候就是dubbo中的服务发现注册,就是代表它是一个dubbo服务,所以@Service就代表是dubbo服务 ,它不是spring@Servie,但是既然于spring整合,那么这个dubbo服务肯定也是一个springbean。处理@Reference这个注解,这个注解一般用在服务消费方,比如订单服务需要访问库存服务,那么库房提供了服务,那么订单系统通过@Reference就可以引入库存服务,进行调用了,所以@Reference主要就是处理如何找到指定的服务进行调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值