Dubbo概述
1. 什么是RPC
RPC(Remote Procedure Call):远程过程调用。
目标是为了实现多台计算机/服务器,互相调用方法的解决方案。
补充:他只是一个思想,并不是一个实现。
2.RPC的概念主要定义了两部分内容:
- 通信协议
- 序列化协议
通信协议
通信协议就是远程调用的通信方式,例如TCP,UDP等。
序列化协议
序列化协议指通信的内容格式,双方都要能理解的格式。
发送信息是序列化的过程,接受信息需要反序列化
3. 什么是Dubbo
Dubbo是一套RPC框架。既然是框架,我们可以在框架结构高度,定义Dubbo中使用的通信协议,使用的序列化框架技术,而数据格式由Dubbo定义,我们负责配置之后直接通过客户端调用服务端代码。
简单来说,Dubbo是RPC概念的实现。
Dubbo是Spring Cloud Alibaba提供的一个框架,能够实现微服务项目的互相调用。
4.Dubbo通讯协议
Dubbo支持多种通讯协议和序列化协议,可以通过配置文件进行修改。
支持的通信协议
- dubbo协议(默认)
- rmi协议
- hessian协议
- http协议
- webservice协议
- ...
支持的序列化协议
- hessian2(默认)
- java序列化
- compactedjava
- nativejava
- fastjson
- dubbo
- fst
- kryo
Dubbo默认情况下,协议的特征如下:
- 采用NIO单一长连接
- 优秀的并发性能,但是大型文件的处理差
- Dubbo开发简单,有助于提升开发效率
5.Dubbo服务的注册与发现
在Dubbo的调用过程中,必须包含注册中心的支持。
注册中心推荐使用Nacos,但是如果使用其他软件也能实现,例如redis、zookerper等。
服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与IP地址的情况下实现通信。
Dubbo服务发现过程
1.首先服务的提供者启动服务到注册中心注册,包括各种ip端口信息,Dubbo会同时注册该项目提供的远程调用的方法
2.服务的消费者(使用者)注册到注册中心,订阅发现
3.当有新的远程调用方法注册到注册中心时,注册中心会通知服务的消费者有哪些新的方法,如何调用的信息
4.RPC调用,在上面条件满足的情况下,服务的调用者无需知道ip和端口号,只需要 服务名称 就可以调用到服务提供者的方法
简单分析主要分为三个部分:服务提供者、服务消费者、注册中心。
整体的思路是:服务提供者启动后,会向注册中心注册提供者信息(包括IP地址,服务名,方法定义等),之后服务消费者启动后,会向注册中心订阅服务信息,一旦服务提供者的信息发生了变更,注册中心将会负责把这些变更通知给消费者吗,之后由消费者调用服务提供者提供的方法,无需经过注册中心,直接调用经过即可。

6.dubbo服务发现原理
1.注册中心
注册中心的作用:
可以把服务提供者发生的变更通知给服务消费者。通过 长连接 将服务提供者连接,如果服务提供者 异常中断 ,注册中心将会从服务列表中 移除 该服务。这里选择的是zookeeper(分布式的协调框架),其中会存储服务提供者和服务消费者的相关信息。
2.服务提供者
服务提供者先向注册中心注册,需要将自身的服务名和服务地址发送给注册中心,以便于消费者从服务中心获得服务连接、进行服务调用。
服务提供者需要进行配置的有:
- 端口信息
- 应用程序的名字,需要唯一,不能和注册中心其他程序冲突
- 注册中心的地址
- 设置连接注册中心的超时时间
- 指定导出服务的包名
3.服务消费者
服务消费者和提供者需要有公共的AIP接口将两者进行联接起来。
服务消费者需要配置的有:
端口信息
消费者应用程序的唯一名字
注册中心的地址
超时时间
4.调用流程
(1)浏览器中访问消费者的地址
(2)根据此地址找到控制器中相对应的方法,接下来代用userService
(3)但是由于userService是一个接口,具体的实现并不在消费者这边
(4)dubbo会根据这个userService生成一个代理对象
(5)代理对象会访问注册中心,把userService服务的信息下载至本地,把这些服务缓存在本地,后续的调用不会再依赖注册中心。(这里底层使用的是netty nio非阻塞io跟服务提供者之间进行通信)
Dubbo的特点
其中dubbo中的消费者和提供专人都是java语言,数据格式使用的是二进制
底层是基于TCP,没有跨语言,但因为使用可二进制作为数据传输,因此数据传输效率较高。
基于长连接,适合连接较少,但是相对比较稳定的情况。
补充:
在Dubbo中,远程调用一句是服务的提供者在Nacos中注册的服务名称。
服务发现,可能有多个运行的实例,任何一个空闲的实例都能提供服务。
7.Dubbo内置的四种负载均衡策略算法
- random loadBalance 随机分配策略(默认)
- round Robin loadBalance 权重平均分配
- leastactive loadBalance 活跃度自动感知分配
- consistanthash loadBalance 一致性hash算法分配
补充:实际运行中,每个服务器性能都不同
随机分配策略(默认)
随机生成数
在哪个范围就谁执行
优点:
算法简单,效率高,长时间运行下,比较稳定
缺点:
可能出现连续访问比较弱的服务器 ,会导致异常甚至宕机
权重平均分配
如果几个服务器权重一致,那么就是依次运行,但是服务器的性能权重一致的可能性很小。
所以我们需要权重评价分配。
补充:
Dubbo2.6.4之前平均分配权重算法有问题。后添加了平滑权重算法
例如:5:3:1,
0-5次给第一台服务器、
5-8次给第二台服务器、
第9次会给第三台服务器,
如以此来了五个请求,这样可能会导致第一台服务器工作,其他服务器闲着。
活跃度自动感知
记录每个服务器处理一次请求的时间。
安装时间比例来分配任务数,运行一次需要时间多的分配的请求数较少。
一致性hash算法 ⭐
根据请求的参数进行hash运算选择服务器。
优点:
- 以后每次相同参数的请求都会访问固定服务器
缺点:
- 因为根据参数来选择服务器,所以不能平均分配
8.Dubbo生产者消费者配置
生产者
- 要有service接口的依赖
- 提供服务的业务逻辑层实现类需要添加@DubboService注解
- Springboot启动类要添加@EnableDubbo注解
消费者
- pom文件添加消费模块的service依赖
- 业务逻辑层远程调用其他模块时使用@DubboReference注解获取业务逻辑层实现类
9.rest和dubbo的区别
dubbo:两个使用java 语言的程序之间进行调用,性能上字节服务应用程序之间规模上更适合长连接,规模较小,管理上支持服务治理。
rest:适合不同语言的应用程序之间的调用(任意语言),任意平台之间进行调用,规模较大,更适合短连接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析