【开源服务框架】Dubbo

🎄欢迎来到@边境矢梦°的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 的主要步骤:

  1. 定义一个接口,规定服务的规范。
  2. 第三方实现这个接口。
  3. META-INF/services/目录下创建一个与接口全限定名相同的文件,文件内容为具体实现类的全限定名。
  4. 在运行时,通过java.util.ServiceLoader类来加载这些实现类。

双亲委派机制

双亲委派机制是 Java 类加载器的一种加载机制。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成。只有当父类加载器无法完成加载请求时,子类加载器才会尝试自己去加载。

双亲委派机制的主要目的是保证Java 核心类库的安全性和一致性防止用户自定义的类替换核心类库中的类

SPI 与双亲委派机制的关系

SPI 在一定程度上打破了双亲委派机制 。因为在通过ServiceLoader加载服务实现类时,是由应用程序类加载器(AppClassLoader)去加载配置文件中指定的实现类,而不是遵循双亲委派的顺序。

这是因为如果按照双亲委派机制,这些由应用程序提供的实现类可能无法被加载到。通过这种方式,SPI 能够在运行时灵活地扩展和使用自定义的服务实现

例如,JDBC 驱动就是通过 SPI 机制来实现不同数据库驱动的动态加载和使用。

总之,SPI 为 Java 提供了一种动态扩展和发现服务实现的方式,而它与双亲委派机制相互补充,以满足不同的类加载需求。


IDL

(Interface Description Language)接口描述语言

IDL是用来描述软件组件接口的一种计算机 语言。IDL通过一种中立的方式(不偏向谁)来描述接口, 使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信交流;比如,一个组件用C++写成,另一个组件用Java写成。

Java IDL 为分布式应用的开发提供了一种方式,使得不同语言编写的对象可以在网络上进行交互,但由于其开发和部署成本较高,目前已较少使用。如果你需要进行分布式应用的开发,可能需要考虑更现代和轻量级的技术。

特点

  1. 规范语言,类似 C 语言。
  2. 分离接口和实现。
  3. 支持多种数据类型定义。
  4. 剥离了编程语言和硬件的依赖性。

应用

  1. 实现跨语言的分布式系统通信
  2. 集成不同语言编写的软件模块。
  3. 定义和规范服务接口,便于系统扩展和集成。

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 模式

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志

等本地资源信息。

服务降级

部分图片来自黑马教程 (为了更好的准备面试特此整理)

相关推荐
好看资源平台2 分钟前
Spring 全家桶使用教程 —— 后端开发从入门到精通
java·数据库·spring
Satan7126 分钟前
【Spring】Spring Aop基础入门
java·开发语言·jvm
这河里吗l14 分钟前
Java每日面试题(JVM)(day15)
java·开发语言·jvm·笔记·后端
white__ice17 分钟前
2024.9.27
java
AskHarries21 分钟前
开发提效的工具tabby快速入门
spring boot·后端·openai
robot_大菜鸟31 分钟前
Powerbi -l9-异常数据的处理
android·java·powerbi
江南一点雨33 分钟前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员
Satan71244 分钟前
【Java】JVM基本组成
java·开发语言·jvm
apz_end1 小时前
Python Flask网页开发基本框架
开发语言·后端·python·学习·flask·编程学习
@月落1 小时前
获取douyin商品详情:API接口的力量
java·前端·数据库