🎄欢迎来到@边境矢梦°的csdn博文🎄
🎄本文主要梳理Java面试中开源服务框架Dubbo会涉及到的知识点 🎄
🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆
学习Dubbo最好的资源:Dubbo 文档 | Apache Dubbo
前言
Dubbo是SOA架构(服务的演变在Nacos中)
概述
Dubbo是一款高性能、轻量级的开源服务框架。
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。
Dubbo是一个分布式服务框架,它提供了高性能和透明化的RPC远程服务调用方案以及SOA服务治理方案。Dubbo致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出、输入功能和Spring框架无缝集成。
RPC
RPC,即:Remote Procedure Call,是指远程过程调用,是一种进程间的通信方式; 他是一种技术思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不是程序员显示编码这个远程调用的细节。即: 开发者无论是调用本地的方法还是远程的方法,编写调用代码的方式基本相同。
SPI
SPI的核心:
SPI(Service Provider Interface)
SPI 是 Java 提供的一种服务发现机制。它允许在运行时动态地为接口查找服务实现。
例如,有一个定义了某种功能的接口,通过在特定的配置文件(通常位于
META-INF/services/
目录下)中指定该接口的具体实现类,运行时可以根据这个配置来加载并使用相应的实现类。
SPI 的主要步骤:
- 定义一个接口,规定服务的规范。
- 第三方实现这个接口。
- 在
META-INF/services/
目录下创建一个与接口全限定名相同的文件,文件内容为具体实现类的全限定名。 - 在运行时,通过
java.util.ServiceLoader
类来加载这些实现类。
双亲委派机制
双亲委派机制是 Java 类加载器的一种加载机制。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成。只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己去加载。
双亲委派机制的主要目的是保证** Java 核心类库的安全性和一致性,防止用户自定义的类替换核心类库中的类**。
SPI 与双亲委派机制的关系
SPI 在一定程度上打破了双亲委派机制。因为在通过
ServiceLoader
加载服务实现类时,是由应用程序类加载器(AppClassLoader)去加载配置文件中指定的实现类,而不是遵循双亲委派的顺序。
这是因为如果按照双亲委派机制,这些由应用程序提供的实现类可能无法被加载到。通过这种方式,SPI 能够在运行时灵活地扩展和使用自定义的服务实现。
例如,JDBC 驱动就是通过 SPI 机制来实现不同数据库驱动的动态加载和使用。
总之,SPI 为 Java 提供了一种动态扩展和发现服务实现的方式,而它与双亲委派机制相互补充,以满足不同的类加载需求。
IDL
(Interface Description Language)接口描述语言
IDL是用来描述软件组件接口的一种计算机 语言。IDL通过一种中立的方式(不偏向谁)来描述接口, 使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用C++写成,另一个组件用Java写成。
Java IDL 为分布式应用的开发提供了一种方式,使得不同语言编写的对象可以在网络上进行交互,但由于其开发和部署成本较高,目前已较少使用。如果你需要进行分布式应用的开发,可能需要考虑更现代和轻量级的技术。
特点:
- 规范语言,类似 C 语言。
- 分离接口和实现。
- 支持多种数据类型定义。
- 剥离了编程语言和硬件的依赖性。
应用:
- 实现跨语言的分布式系统通信。
- 集成不同语言编写的软件模块。
- 定义和规范服务接口,便于系统扩展和集成。
Dubbo工作原理
深入解析Dubbo架构层次_dubbo架构有哪些分层-CSDN博客
工作原理分 10 层:
- 第一层:service 层,接口层,给服务提供者和消费者来实现的(留给开发人员来实现);
- 第二层:config 层,配置层,主要是对 Dubbo 进行各种配置的,Dubbo 相关配置;
- 第三层:proxy 层,服务代理层,透明生成客户端的 stub 和服务端的 skeleton,调用的是接口,实现类没有,所以得生成代理,代理之间再进行网络通讯、负责均衡等;
- 第四层:registry 层,服务注册层,负责服务的注册与发现;
- 第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务;
- 第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控;
- 第七层:protocol 层,远程调用层,封装 rpc 调用;
- 第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步;
- 第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口;
- 第十层:serialize 层,数据序列化层。
Dubbo框架
Dubbo高级特性
序列化
地址缓存
超时与重试
超时时间建议配置在服务的提供方,因为提供方知道操作大概是什么和操作的耗时大概是多少
多版本
服务提供方的serviceImpl里的类,有两个版本
服务消费方的controller里的方法
负载均衡
集群容错
官网
**failover cluster ****模式 **
provider 宕机重试以后,请求会分到其他的 provider 上,默认两次,可以手动设置重试次数,建
议把写操作重试次数设置成 0。
**failback ****模式 **
失败自动恢复会在调用失败后,返回一个空结果给服务消费者。并通过定时任务对失败的调用进行
重试,适合执行消息通知等操作。
**failfast cluster ****模式 **
快速失败只会进行一次调用,失败后立即抛出异常。适用于幂等操作、写操作,类似于 failover
cluster 模式中重试次数设置为 0 的情况。
**failsafe cluster ****模式 **
失败安全是指,当调用过程中出现异常时,仅会打印异常,而不会抛出异常。适用于写入审计日志
等操作。
**forking cluster ****模式 **
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多
服务资源。可通过 forks="2" 来设置最大并行数。
**broadcacst cluster ****模式 **
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志
等本地资源信息。
服务降级
部分图片来自黑马教程 (为了更好的准备面试特此整理)
版权归原作者 边境矢梦° 所有, 如有侵权,请联系我们删除。