Dubbo生态之初识dubbo协议

1.RPC框架

在java的发展中,随着业务的越来越庞大,单体架构的工作繁琐且耦合度高,因此单体架构过渡到了分布式架构,而分布式架构就必然涉及到各个服务之间的远程通信(RPC框架),RPC框架如图所示:

工作流程:

a.客户端调用客户端Sub(client stub).这个调用是在本地

b.客户端stub会将要传输的参数进行包装,并通过系统调用发送到服务端机器。打包的过程就叫做序列化。(常见的方式有:XML、JSON、二进制编码)

c.客户端本地操作系统发送信息至服务器。(可通过自定义TCP协议或HTTP传输)

d.服务器系统将信息传送至服务端stub(server stub)

e.服务端stub(server stub)解析信息。该过程叫反序列化

f.服务端(server stub)调用程序,并通过类似的方法返回给客户端

这样来讲:我们调用远程服务,一是要遵守能够传输的消息格式,二是传输的方式,三是调用异常的怎么办。这些我们客户端都是不可行自行去管理的,交给RPC框架去处理;

RPC协议正是定义了这样的一种通信的标准规范,为了满足不同的场景需求,于是很多标准化的RPC框架就在这个协议的基础上产生了。

2.dubbo

        dubbo就是在rpc协议的基础上诞生的,但是它不仅仅是一个RPC框架,更是一款微服务框架,为大规模微服务时间提供高性能RPC通信、流量治理、可观测性等解决方案。

思考: 我们讲了dubbo的由来,那么dubbo为什么能够被快速用起来呢? 肯定是解决了一些棘手的问题。

(1) 服务越来越多了,那是不是就说明服务调服务,服务链路越来越长了,如何对服务链路进行跟踪和监控呢?

(2)服务通信之间的异常,是否会牵一发而动全身呢?因此我们需要有一种保护机制防止一个节点故障引发大规模的系统故障,就是说要有容错机制

(3)服务的大规模集群之间是怎么互相发现互相感知的,因此需要有一个注册中心对服务进行集体管理

(4)服务的大规模集群请求量的分发需要引入负载均衡机制。

3.dubbo特性

dubbo有着一系列高性能的对上述问题的解决方案

a.面向接口代理的高性能RPC调用,服务以接口为粒度,屏蔽了远程调用底层细节

b.智能负载均衡,内置了多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量

c.服务自动注册与发现,支持多种注册中心服务,服务实例上下线实时感知

d.可视化的服务治理与运维,提供丰富的服务治理、运维工具。可以随时查询服务元数据、服务健康状况及调用统计,实时下发路由策略,调整配置参数

e.运行期流量调度,内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

f.高度可扩展能力,遵循微内核+插件的设计原则,平等对待内置实现和第三方实现。

4.dubbo架构

Provider:暴露服务的服务提供方

Consumer:条用远程服务的服务消费方

Registry: 服务注册与发现的注册中心

Monitor: 统计服务的调用次数和调用时间的监控中心

Container: 服务运行容器

5.demo案例

假设我们有这样的一个简单的需求,需要查询当前用户还可以领取的优惠券列表。则基于dubbo的实现架构为分析: user为一个独立部署的服务,coupon也为一个独立部署的服务。

我们这样来学习dubbo协议,我们知道dubbo协议是一个远程网络通信框架,那么我们user服务如果想要调用到coupon服务,那么我们就需要在user服务中配置conpon服务提供的这个接口url地址才能够访问。这就是dubbo的点对点通信。

    <!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="coupon-portal"/><!-- 使用multicast广播注册中心暴露服务地址 --><dubbo:registry address="N/A"/><!-- 用dubbo协议在20880端口暴露服务 --><!-- 声明需要暴露的服务接口 --><dubbo:referenceinterface="zsc.com.cn.user.IUserService" id="userService"url="dubbo://192.168.36.1:20881/zsc.com.cn.user.IUserService"/>

于是我们使用dubbo协议的这个需求的整个流程就是  前端访问--> REST接口->dubbo协议点对点访问user-api--->user api的实现类---> dubbo协议点对点访问coupon-api ---> coupon api的实现类-->再将结果返回。

思考: 我们的接口越来越多怎么办,如果服务是集群部署呢,我们的url也需要配置多个的吗?如何集体管理这么多个服务? 于是注册中心就派上了大用场,将这些接口都统一注册到注册中心中,其它服务如果引用,去注册中心上订阅即可。显然,从dubbo架构图中我们可以看出来,dubbo天然就支持服务注册与发现,目前dubbo能够支持的注册中心如consul,etcd,nacos,sofa,zookeeper,eureka,redis等已经很多了。

Springboot有着天生集成dubbo的优势,那么在springboot中如何使用dubbo

a.首先引入jar包依赖

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope>
</dependency>

spring-boot与dubbo的兼容包以及注册中心zookeeper包

        <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><type>pom</type></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency>

b.在启动类上开启dubbo

c.  dubbo的相关配置(在properties中进行配置)

# 应用名称
spring.application.name=coupon-service-providerdubbo.application.name=coupon-service# dubbo的协议 -1代表的是端口号随机生成
dubbo.protocol.port=-1
dubbo.protocol.name=dubbo# 注册中心 配置中心 元数据中心  id为key
dubbo.registry.id=zk-registry
dubbo.registry.address=zookeeper://192.168.8.133:2181?timeout=20000
dubbo.config-center.address=zookeeper://192.168.8.133:2181?timeout=20000
dubbo.metadata-report.address=zookeeper://192.168.8.133:2181?timeout=20000

d. 服务怎么发布 增加@DubboService注解即可,就会自动进行扫描,并发布到注册中心

e. 服务怎么引用订阅 增加@DubboReference 注解即可,就会从注册中心中引用这个接口

分析: c中我们配置了3个中心地址,registry注册中心,接口服务url的存储,config-center 配置中心,这是dubbo的公共配置可以单独抽取出来(dubbo.properties),metadata 元数据中心,这是dubbo的url过于长的话,把url上携带的相关参数进行剥离开来。注册中心,元数据中心和配置中心都是可以单独部署的。

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

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

相关文章

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样&#xff0c;设置命令的搜索路径&#xff0c;以冒号为分割HOME当前用户主目录&#xff1a;/rootSH…

有道:一季度业绩超市场预期,生成式AI商业化落地进程加快

5月23日&#xff0c;教育科技公司网易有道&#xff08;NYSE&#xff1a;DAO&#xff09;公布了2024年第一季度未经审计的财务报告。报告期内&#xff0c;受益于“AI”加“教育”双轮驱动&#xff0c;业绩表现超市场预期&#xff0c;业务健康度大幅改善。 财报显示&#xff0c;…

5.23小结

1.java项目创新 目前想添加一个自动回复的功能和设置验证方式有&#xff08;允许任何人添加&#xff0c;禁止添加&#xff0c;设置回答问题添加&#xff0c;普通验证添加&#xff09; 目前只完成画好前端界面&#xff0c;前端发送请求&#xff0c;还有表的修改 因为涉及表字…

大语言模型量化方法对比:GPTQ、GGUF、AWQ 包括显存和速度

GPTQ: Post-Training Quantization for GPT Models GPTQ是一种4位量化的训练后量化(PTQ)方法&#xff0c;主要关注GPU推理和性能。 该方法背后的思想是&#xff0c;尝试通过最小化该权重的均方误差将所有权重压缩到4位。在推理过程中&#xff0c;它将动态地将其权重去量化为f…

决策树最优属性选择

本文以西瓜数据集为例演示决策树使用信息增益选择最优划分属性的过程 西瓜数据集下载&#xff1a;传送门 首先计算根节点的信息熵&#xff1a; 数据集分为好瓜、坏瓜&#xff0c;所以|y|2根结点包含17个训练样例&#xff0c;其中好瓜共计8个样例&#xff0c;所占比例为8/17坏…

2024-5-4-从0到1手写配置中心Config之基于h2的config-server

添加依赖 新建的web工程中添加h2的依赖 添加h2的配置 设置数据源和密码设置初始化sql语句打开h2的控制台 初始化语句创建一个config表&#xff0c;保存服务配置信息。 完成CRUD接口 controller类 mapper接口 测试 在web控制台可以看到sql已经初始化完成&#xff0c;crud接口…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域&#xff0c;PLC工程师扮演着至关重要的角色&#xff0c;他们负责构建、维护自动化系统&#xff0c;推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段&#xff0c;每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、详细步骤 1.光学指纹模块 2.配置STM32CUBEMX 3.程序设计 3.1 输出重定向 3.2 导入AS608库 3.3 更改端口宏定义 3.4 添加中断处理部分 3.5 初始化AS608 3.6 函数总览 3.7 录入指纹 3.8 验证指纹 3.9 删除指纹 3.10 清空指纹库 三、总结及资源 一、前言 …

Day37 贪心算法part04

LC860柠檬水找零(未掌握) 未掌握分析&#xff1a;20的时候找零卡住&#xff0c;同时贪心思路就想了很久 当bill[i]20的时候&#xff0c;我们有两种找零范式&#xff0c;找零10、5和找零三个5&#xff0c;优先找零10、5&#xff0c;因为三个5是可以替代10、5的情况的&#xff0…

Nebula街机模拟器 Mac移植版(400+游戏roms)汉化版

nebula星云模拟器是电脑上最热门的街机游戏模拟器之一&#xff0c;玩家可以通过这个小巧的模拟器软件进行多款经典街机游戏启动和畅玩&#xff0c;本次移植的包含400多款游戏roms&#xff0c;经典的三国志、三国战纪、拳皇、街霸、合金弹头、1941都包含在内。 下载地址&#xf…

前端 CSS 经典:好看的标题动画

前言&#xff1a;好看的标题动画实现。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

蓝桥楼赛第30期-Python-第三天赛题 从参数中提取信息题解

楼赛 第30期 Python 模块大比拼 提取用户输入信息 介绍 正则表达式&#xff08;英文为 Regular Expression&#xff0c;常简写为regex、regexp 或 RE&#xff09;&#xff0c;也叫规则表达式、正规表达式&#xff0c;是计算机科学的一个概念。 所谓“正则”&#xff0c;可以…

【Linux取经路】初识线程——线程控制

文章目录 一、什么是线程&#xff1f;1.1 Linux 中线程该如何理解&#xff1f;1.2 如何理解把资源分配给线程&#xff1f;1.2.1 虚拟地址到物理地址的转换 1.3 线程 VS 进程1.3.1 线程为什么比进程更轻量化&#xff1f;1.3.2 线程的优点1.3.3 线程缺点1.3.4 线程异常1.3.5 线程…

关于基础的流量分析(1)

1.对于流量分析基本认识 1&#xff09;简介&#xff1a;网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 2&#xff09;在我们平时的考核和CTF比赛中&#xff0c;基本每次都有…

MySQL用户管理操作

用户权限管理操作 DCL语句 一.用户管理操作 MySQL软件内部完整的用户格式&#xff1a; 用户名客户端地址 admin1.1.1.1这个用户只能从1.1.1.1的客服端来连接服务器 admin1.1.1.2这个用户只能从1.1.1.2的客服端来连接服务器 rootlocal host这个用户只能从服务器本地进行连…

ACM实训

【碎碎念】继续搞习题学习&#xff0c;今天完成第四套的ABCD&#xff0c;为下一周挤出时间复习&#xff0c;加油 Digit Counting 问题 法希姆喜欢解决数学问题。但有时解决所有的数学问题对他来说是一个挑战。所以有时候他会为了解决数学难题而生气。他拿起一支粉笔&#xff…

Java面试八股之进程和线程的区别

Java进程和线程的区别 定义与作用&#xff1a; 进程&#xff1a;在操作系统中&#xff0c;进程是程序执行的一个实例&#xff0c;是资源分配的最小单位。每个进程都拥有独立的内存空间&#xff0c;包括代码段、数据段、堆空间和栈空间&#xff0c;以及操作系统分配的其他资源…

工厂模式(简单工厂模式+工厂模式)

工厂模式的目的就是将对象的创建过程隐藏起来&#xff0c;从而达到很高的灵活性&#xff0c;工厂模式分为三类&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 在没有工厂模式的时候就是&#xff0c;客户需要一辆马车&#xff0c;需要客户亲自去创建一辆马车&#xff0c;…

经验分享:C++ error:‘syscall’ was not declared in this scope

明明已经加了头文件 #include <sys/syscall.h>#define gettid() syscall(__NR_gettid)但是依旧不能使用 syscall() 函数&#xff0c; 检查源码后&#xff1a; sys/syscall.h 内部表示&#xff0c;他封装了 打开对应的 syscall.h 文件内部依旧没有 syscall()函数的声明…

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…