第35周Zookkeeper+Dubbo Dubbo

Dubbo 详解

一、Dubbo 是什么

官网与定义

Dubbo 是一款高性能、轻量级的开源服务框架,其官网为 double.apache.org,提供中文版本(网址含 “zh”)。

核心能力

Dubbo 具备六大核心能力:

  1. 面向接口代理的高性能 RPC 调用 :RPC(Remote Procedure Call)即远程过程调用,允许一个服务请求另一个远程服务的能力,是 Dubbo 的核心。Dubbo 通过高性能 RPC 调用,实现服务间通信,通信协议可指定,默认用 Dubbo 协议,而非 HTTP。
  2. 智能容错和负载均衡 :针对调用而言,保障系统稳定性和高可用性。
  3. 服务自动注册与发现 :简化服务管理,方便服务提供方和消费方动态发现和调用服务。
  4. 高度可扩展能力 :满足不同业务场景需求。
  5. 运行流量调度 :优化服务调用过程中的流量分配。
  6. 可视化的服务治理与运维 :提升运维效率和管理水平。

这些能力均围绕 RPC 调用进行扩展或辅助,因此 Dubbo 的核心在于服务间的 RPC 调用,在多服务场景下,服务相互调用可考虑使用 Dubbo。

发展情况

Dubbo 最初由阿里巴巴内部开发,后捐赠给 Apache,期间经历维护中断,一些公司基于其自行维护衍生品,如当当的 Dubbo X。如今,Dubbo 支持多种语言,应用广泛,涵盖互联网公司(考拉、去哪儿等)和非互联网公司(中国电信、中国人寿等)。

二、RPC 介绍

概念及发展历程

RPC(远程过程调用)是服务间通信的一种方式。早期程序主要是内部方法调用,随着发展,出现同一台电脑内多个进程间调用需求,即进程间通信。进一步地,当需要调用的能力不在同一台电脑内时,便引入了 RPC(Remote Procedure Call)的概念。RPC 框架能方便实现远程调用,如 Dubbo,使得其他计算机或程序提供的服务被本地程序利用,加强系统间协作。

常见框架及对比

常见的 RPC 框架有:

  • 阿里 Dubbo 框架 :性能好,目前较为主流。
  • 新浪魔毯框架 :架构简单,适合初学者学习原理及源码,或作为开发小型 RPC 框架的参考。
  • Facebook Thrift 框架 :可伸缩跨语言框架,有强大代码生成引擎,支持多种语言,适用于跨语言通信场景。

选择框架需根据业务需求权衡,如团队技术栈统一且对性能要求高,可选 Dubbo;若需跨语言通信,Thrift 是不错选择;技术栈不统一时,HTTP 可能更合适。

HTTP 和 RPC 对比

对比 Dubbo 通信协议与 HTTP 协议:

  • 传输效率 :RPC 通常更高,因其协议无过多无用报文内容,无需转 json。
  • 通用性 :HTTP 更强,几乎被所有公司默认支持,联调首选;RPC 框架间兼容性差。
  • 负载均衡 :RPC 框架自带负载均衡策略,HTTP 需额外处理。

开发选择建议依据团队技术栈、语言需求及性能要求等因素综合考量。

三、Dubbo 工作原理

模块信息及架构

Dubbo 架构涉及以下模块:

  • provider :服务提供方,如商品服务提供查询商品详情能力。
  • consumer :服务消费方,调用远程服务获取所需能力。
  • registry :注册中心,用于服务注册与发现。
  • monitor :监控中心,监控调用次数、时间等数据。
  • container :服务运行时容器。

工作流程如下:

  1. 启动 container,provider 在其中运行并向注册中心注册。
  2. consumer 订阅服务信息,注册中心将地址提供给 consumer。
  3. consumer 获取信息后,直接调用对应 provider。
  4. consumer 和 provider 定期向 monitor 上报数据。

图中紫色虚线表示初始化过程,蓝色线(实线为同步调用,虚线为异步操作如通知和数据上报)表示其他操作。

四、项目开发流程

项目创建与配置

  1. 引入依赖 :在项目中引入 Dubbo 相关依赖,添加 Dubbo 特有的 @Service 注解。
  2. 指定注册中心 :整合 Dubbo 时,通常选 Zookeeper 作为注册中心,配置其地址以便 Dubbo 找到服务。
  3. 项目结构 :采用 spring cloud 课程结构,包含服务提供者(如课程列表)和服务调用者(如课程价格服务)两个模块,相互配合完成项目。

生产者开发

  1. 创建模块 :在 Idea 中新建 Maven 项目,删除原有 src 模块,新建子模块(如 producer),建立依赖关系。
  2. 编写代码 :在 producer 中创建包(如 com.imook.producer),包含 service 包定义接口(如 CourseListService)和实现类(如 CourseListServiceImpl),实现具体业务逻辑,如从数据库获取课程并展示。编写实体类(如 Course),继承 Serializable 接口,包含主键 ID、课程 ID、名称、是否上架等字段,引入 List 列表和 JAVA Util 工具类。
  3. 配置文件 :在 resources 新建 application.properties 配置文件,配置服务版本号、通信协议、端口号、注册地址等信息,指定 Dubbo 服务位置(如通过 dubbo.scan.base-packages)。

消费者开发

  1. 配置依赖 :消费者依赖配置与生产者基本一致,可复制生产者依赖配置并修改名称。
  2. 配置文件 :复制生产者配置文件,修改端口号(如 8084)和项目名称(如 course price)。
  3. 编写业务逻辑 :新建包(如 com.imook.consumer),复制 entity 和 dao 包,新建 service 包定义接口(如课程价格服务接口,含通过 ID 查找价格、获取课程列表并匹配价格等方法)及实现类(如 CoursePriceServiceImpl),在实现类中通过 @Reference 注解引入 Dubbo 服务,实现具体逻辑,如调用 Mapper 查询价格、获取课程列表并遍历匹配价格等。
  4. 控制器与启动类 :创建控制器,引入 service,实现具体功能如获取课程价格、课程名称和价格列表等。构建 Spring Boot 启动类,更换注解为 @SpringBootApplication 以对外暴露服务,并确保正确配置 Dubbo 相关内容。

注意事项

  1. ZooKeeper 启动 :消费者启动前必须确保 ZooKeeper 已启动,否则消费者找不到依赖服务会报错。
  2. 启动顺序 :生产者需先于消费者启动,让消费者能正常找到所依赖的服务,可通过配置关闭此检查。
  3. 注解选择 :区分 spring framework 和 Apache Dubbo 的库,正确选择 Dubbo 的 @Service 和 @Reference 注解,并指定版本,避免冲突。
  4. 配置细节 :生产者要正确配置协议、端口号、注册地址等信息,实体类需考虑驼峰配置,以确保下划线字段自动转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值