Dubbo入门实战最全攻略(基于 Spring Boot 实现)

news2024/10/7 2:22:23

Dubbo应用

RPC通信

Apache Dubbo 3构建在 HTTP/2 协议之上,具有更好的穿透性与通用性 , 支持基于 IDL 的服务定义

集成了业界主流的大部分协议,使得用户可以在 Dubbo 框架范围内使用这些通信协议 , 这些协议包括 rest、hessian2、jsonrpc、thrift 等

服务发现

即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信

Dubbo 提供的是一种 Client-Based 的服务发现机制,通常还需要部署额外的第三方注册中心组件来协调服务发现过程,如常用的 Nacos、Consul、Zookeeper 等,Dubbo 自身也提供了对多种注册中心组件的对接,用户可以灵活选择

Dubbo服务注册与发现过程如下图(图片来自官网):
在这里插入图片描述

流量治理

Dubbo 提供了丰富服务治理规则,包括路由规则、动态配置等

部署架构

Dubbo 作为一个微服务框架,为在分布式环境下实现各个微服务组件间的协作,定义了一系列中心化组件,包括

注册中心:协调服务提供者(Provider)和服务消费者(Consumer)之间的地址注册与发现

配置中心:

存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性

负责服务治理规则(路由规则、动态配置等)的存储与推送

元数据中心:

接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)

作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展

下图描述了Dubbo各服务组件间协调的交互图(图片来自官网):
在这里插入图片描述

其他内容

可以参考官网的”什么是Dubbo?”内容,

https://dubbo.incubator.apache.org/zh/overview/what/

Dubbo示例

需求

构建一个基于用户的CRUD服务

服务提供者(Provider)根据契约提供服务

服务消费者(Consumer)根据契约消费服务

服务消费者(Consumer)以泛化方式消费服务

实现逻辑

在这里插入图片描述

分别开发如下项目,实现需求(如上图)

服务接口项目:定义的服务规范IUserService、公共实体类UserEntity

服务提供者(Provider)项目:

引入Nacos注册依赖

添加注册到指定Nacos服务注册中心的配置

引入契约接口依赖

定义UserService服务实现,定义实际的业务逻辑,继承于IUserService,并使用公共实体类UserEntity

服务消费者(Consumer)项目:

引入Nacos注册依赖

添加订阅指定Nacos服务注册中心的配置

引入契约接口依赖

定义自身业务,在需要时,按需自动装配IUserService接口实现,使用装配对象逻辑完成自身业务,就如调用本地实现一样,实际使用的是通过Nacos订阅服务提供者提供的服务逻辑

Nacos注册中心:

提供服务提供者(Provider)的注册

提供服务消费者(Consumer)的订阅

服务消费者(Consumer)–泛化消费

引入Nacos注册依赖

添加订阅指定Nacos服务注册中心的配置

无需引入契约接口依赖

定义自身业务,在需要时,使用Dubbo提供的泛化工具类,实现对IUserService服务接口的调用,也如调用本地实现一样,实际使用的是通过Nacos订阅服务提供者提供的逻辑

代码概览

服务接口项目

定义普通Spring Boot类库项目,定义接口IUserService、实体类UserEntity、标准响应封装ResponseData

具体见项目dubbo-interface,代码结构如下图
在这里插入图片描述

服务提供者项目

定义一个普通的Spring Boot项目,引入契约接口项目dubbo-interface,实现IUserService接口,实现业务逻辑

实现步骤:

1.在pom.xml中引入如下依赖

dubbo依赖:org.apache.dubbo.dubbo:3.0.3

nacos注册依赖:

org.apache.dubbo.dubbo-registry-nacos:3.0.3、

com.alibaba.spring.spring-context-support:1.0.11

引入契约接口dubbo-interface依赖

2.在application.properties中添加nacos配置,包括服务名称、协议、nacos服务器地址等

3.启用Dubbo,在启动类上添加@EnableDubbo注解

4.标识Dubbo服务,在继承于契约接口dubbo-interface中IUserService的服务类上进行标识,会注册到Nacos注册中心

@DubboService(version = “$版本号”)
public class UserService implements IUserService{
//实现契约接口逻辑
}

5.定义Dubbo服务拦截器,通过实现Filter接口实现,可选

具体见项目dubbo-provider,代码结构如下图
在这里插入图片描述

服务消费者项目

定义一个普通的Spring Boot项目,引入契约接口项目dubbo-interface,在自身的业务中,自动装配IUserService对象,调用服务提供者实现的业务逻辑

实现步骤:

1.在pom.xml中引入如下依赖

dubbo依赖:org.apache.dubbo.dubbo:3.0.3

nacos注册依赖:

org.apache.dubbo.dubbo-registry-nacos:3.0.3、
com.alibaba.spring.spring-context-support:1.0.11
引入契约接口dubbo-interface依赖

2.在application.properties中添加nacos配置,包括服务名称、协议、nacos服务器地址等

3.启用Dubbo,在启动类上添加@EnableDubbo注解

4.使用Dubbo服务,在自身的业务代码中,按需自动装配服务接口IUserService来调用 ,注意版本号要与服务提供者中的服务想匹配public class UserController {
@DubboReference(version = “版本号”)
IUserService userService;

//在方法中使用userService对象即可

}

具体见项目dubbo-consumer,代码结构如下图

在这里插入图片描述

服务消费者项目-泛化消费

定义一个普通的Spring Boot项目,引入契约接口项目dubbo-interface,在自身的业务中,通过Dubbo泛化工具类,使用IUserService规则,调用服务提供者实现的业务逻辑

实现步骤:

1.在pom.xml中引入如下依赖

dubbo依赖:org.apache.dubbo.dubbo:3.0.3

nacos注册依赖:

org.apache.dubbo.dubbo-registry-nacos:3.0.3、
com.alibaba.spring.spring-context-support:1.0.11
引入契约接口dubbo-interface依赖

2.在application.properties中添加nacos配置,包括服务名称、协议、nacos服务器地址等

3.启用Dubbo,在启动类上添加@EnableDubbo注解

4.使用Dubbo工具进行泛化方式消费服务,代码稍复杂,具体见代码中的util工具包

5.具体见项目dubbo-consumer-generic,代码结构如下图
在这里插入图片描述 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/775695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划】三步问题

🧁题目描述: 示例: 🧀(1)题目解析: 小孩每一次可以走1,2,3步,那么形成不同的排列组合,会有很多种上楼梯方式。 🧀(2)算法原理: 🥑[1]状态表示 根据题目要…

【C++杂货铺】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 📖默认成员函数 用户没有显式实现,编译器会自动生成的成员函数,称为默认成员函数。 构造函数:完成对象的初始化工作。析构函数&#xff…

容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档

一、Docker docker是一种开源的应用容器引擎,可以将应用程序和依赖打包成一个可移植的镜像,然后发布到任何支持docker的平台上,也可以实现虚拟化。docker的核心概念有三个:镜像(image)、容器(co…

QT中QTimer的循环时间与槽函数执行时间以及在事件循环中触发,不同时间的结果分析

目录 当循环时间小于槽函数时间时: 当循环间隔时间大于槽函数时间时: 当存在两个定时器器,其中一个还是间隔100ms,另一个间隔1000ms: 当两个定时器的循环周期大于槽函数执行时间时 当在主程序中添加一个for循环…

怎么把视频转为gif动态图,3个方法轻松转换!

如何将视频转换为GIF动态图呢?相信许多人在日常聊天中喜欢使用各种有趣的表情包。每当互联网上出现一些有趣的热门视频时,我们也往往会看到许多相关的GIF表情包。那么我们应该如何将自己的视频或者一些有趣的视频制作成GIF动态图呢?下面我就为…

从C语言到C++_27(AVL树)概念+插入接口实现(四种旋转)

目录 1. AVL树的概念 2. AVL树结点和树的定义 3. AVL树的插入(未包含旋转) 4. AVL树的旋转 4.1 右右_左单旋 4.2 左左_右单旋 4.3 左右双旋 4.4 右左双旋 5. AVL树的验证 6. AVL树的删除(了解)和性能 7. AVL树插入验证完整代码 8. AVL树笔试…

下载pdm遇到的坑:Could not find a version that satisfies the requirement pdm

pip install pdm遇到的问题: Could not find a version that satisfies the requirement pdm (from versions: ) No matching distribution found for pdm检查了版本后发现,python版本在3.6,pdm不支持该版本 换成python3.7版本,则…

【力扣算法14】之 15. 三数之和 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] num…

python编程语言之数据类型进阶操作

数值常用操作 python常用关于数值,数学常用的模块:math(数学),random(随机),numpy(科学计算),pandas(数据读写,数据分析&…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法,接下来将对其进行详细介绍。 首先简单复习一下: 1.定义约束条件可以使用矩阵拼接…

如何通过nvm管理多个nodejs版本

随着前端项目的越来越多,不同项目使用的nodejs版本可能不一样,导致在切换不同项目时需要更换不同的nodejs版本,非常麻烦。本次推荐使用nvm进行多个nodejs版本的统一管理。 1、nvm的下载 nvm全称Node Version Manager,即Node版本管…

科技政策 | 2023年广东省省级企业技术中心(第22批)认定开始啦!

原创 | 文 BFT机器人 原文链接: http://gdii.gd.gov.cn/zwgk/tzgg1011/content/post_4218083.html 各企业请注意,2023年广东省省级企业技术中心(第22批)认定已经开始了,广东省工业和信息化厅接收资料截止时间为2023年…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇 前言 🍺🍺 各位读者朋友大家好!得益于各位朋友的支持和关注,我的专栏《Java基础…

Python实战项目——物流行业数据分析(二)

今天我们对物流行业数据进行简单分析,数据来源:某企业销售的6种商品所对应的送货及用户反馈数据 解决问题: 1、配送服务是否存在问题 2、是否存在尚有潜力的销售区域 3、商品是否存在质量问题 分析过程: 依旧先进行数据处理 一…

vue Duplicate keys detected: ‘‘. This may cause an update error. found in

错误原因: 在使用v-for的时候,都要必须加上一个唯一的key值,key的值写成一样的了。所以就导致了警告。尽量不要使用index下标作为key值 换成后台数据返回的id或者i*随机数作为key值就好

linux中快速定位软件安装位置

linux中快速定位软件安装位置步骤如下: 根据进程的名字定位进程ID ps -ef | grep redis通过进程id查找软件安装位置 ll -l /proc/100788/cwd原理说明: linux中进程启动后,会在/proc/目录下新建进程工作目录; 目录规范为:/proc/…

寻找下一个生成式 AI 独角兽,亚马逊云科技创业加速器火热招募中!

生成式AI让人工智能技术又一次破圈,带来了机器学习被大规模采用的历史转折点。它正在掀起新一轮的科技革命,为人类带来前所未有的颠覆性的影响,而诸多创业者也应势而上,寻求创新机遇。生成式AI可以创造全新的客户体验、提高企业内…

将数字孪生系统接入 CesiumJS,能为智慧城市项目带来怎样的改变?

数字孪生系统接入 CesiumJS 的契机,正是智慧城市项目的需要。因为许多智慧城市项目中包含了大量地形、倾斜摄影、DOM、DEM 等 GIS 数据,那么为了能够在数字孪生系统中导入这些 GIS 数据,同时让这些数据在以可视化形式表现出来后,还…

C++-17. 电话号码的字母组合

题目来源:力扣 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输…

【MySQL】数据不存在则插入

系列文章 C#底层库–MySQLBuilder脚本构建类(select、insert、update、in、带条件的SQL自动生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类(推荐阅读&#xff0…