常见开源组件的详解
文章目录
- RPC
- RPC架构和工作流程
- 为什么有了HTTP还要用RPC
- 底层协议
- 数据格式
- 连接管理
- 错误处理
- 使用场景
- 常见的RPC框架
- Web应用框架
- 主要功能
- 常见的Web应用框架
- Spring Boot (Java)
- Django (Python)
- Express.js (Node.js)
- Redis
- 主要特点
- 应用场景
- 缓存问题
- Redis集群架构
- 主从复制
- Redis Cluster
RPC
RPC是一种通信协议 他可以让程序在不同的计算机上调用彼此的程序或者服务 就像本地调用函数一样调用远程服务器的服务
RPC框架负责底层的网络通信 序列化和反序列化数据 错误处理
这样我们在开发的过程中就不再需要重复造轮子了 这和reactor一样只是一种编程思想
各家公司一般都有自己的RPC框架
RPC架构和工作流程
RPC的工作流程很简单
-
客户端调用:客户端调用本地的一个代理函数(stub),负责将请求参数序列化,然后发送到服务器
代理函数(stub):是负责客户端和服务器之间的通信 主要是为远程服务调用提供的一个本地接口 把远程调用的过程隐藏起来 他的内部处理功能就是序列化与反序列化 错误处理 返回结果 这种代理函数也支持多种编程语言 让不同语言的服务也能够通信
-
网络传输
-
服务处理:服务端接收代理函数的请求 反序列化参数 调用相关服务
-
响应返回
-
客户端接收
我们可以在很多地方都看到这种思想 例如MySQL的客户端和服务端分离 RabbitMQ的客户端服务端分离
客户端负责的起始就只有把请求按要求进行序列化和传递请求给服务端 真正运行复杂服务的是服务端
这里就有了两种调用方式 同步调用和异步调用
大家基础好的话看到这两个词就能明白是什么意思 同步调用就是阻塞等待返回结果 而异步调用不等待结果直接继续执行
为什么有了HTTP还要用RPC
这两者的共同点都是完成了一个请求与响应的过程
HTTP的协议很简单易用 用途也很广泛 但是RPC更加适用于这种远程调用的过程
底层协议
RPC的底层协议是TCP/IP协议 而HTTP协议是TCP协议
RPC下面可以使用TCP和UDP 也可以使用其他的自定义协议
但是HTTP是只能使用TCP了 在一些高性能低延迟条件下还是RPC更胜一筹 不用每次都三次握手四次挥手
数据格式
RPC主要是用二进制格式数据(例如protobuf) 让数据的传输更加安全高效
特性 | Protobuf | JSON | XML |
---|---|---|---|
数据体积 | 小,二进制格式 | 大,文本格式 | 更大,带有大量标记 |
解析速度 | 快,二进制格式 | 较慢,基于字符串解析 | 更慢,带有复杂的结构 |
可读性 | 不可读 | 人类可读 | 人类可读 |
向后兼容性 | 支持,未识别字段被忽略 | 支持,但需要注意字段命名 | 支持,但 XML 复杂性较高 |
多语言支持 | 强,支持多种编程语言 | 较强,流行语言都有支持 | 较强,但通常处理较复杂 |
而HTTP主要是用文本格式的数据 JSON或者XML进行数据交换 虽然也支持二进制传输 但是会导致更大的数据体积
因为传统的HTTP通信时是要求以文本形式进行传输的 当传输二进制数据时就要求其转换为一种文本表示 常见的就是Base64编码
结构化的JSON和XML的文本格式开销也很大 对于大型的结构化数据也不是很友好
连接管理
当请求很多时 长连接的效率就很高 可以同时发送很多请求
而传统的HTTP则使用短连接 会频繁的建立和关闭连接
错误处理
学过HTTP协议的错误处理都知道 这个玩意的错误机制是不太好的 客户端要根据状态码的不同处理不同的错误情况
使用场景
- 微服务架构 在微服务架构中 各个服务之间需要频繁互动
- 高性能应用 快速响应和低延迟应用
- 分布式系统 多个不同地域的服务器进行数据交互与服务调用
常见的RPC框架
- gRPC:google开发的 支持多种语言 基于HTTP/2协议
- Apache Thrift 支持多种语言的RPC框架 灵活性高 适合构建跨语言的分布式服务
- Apache Dubbo 高性能的Java RPC框架 提供服务治理功能 适用于微服务架构
- Hessian 轻量级的二进制RPC框架 适用于Java和其他编程语言的通信
Web应用框架
Web应用框架是用于开发Web工具集 简化开发的流程 可以快速的构建起web应用
如果有学过Python的同学可以尝试上手一下flask或者django还挺好玩的
主要功能
-
请求路由:将用户请求的 URL 与相应的控制器或方法映射起来。
控制器指的是用于接收用户请求并对其进行处理的部分 控制用户的业务流程
-
中间件支持:在请求到达控制器之前和返回响应之前执行特定操作。
-
模板引擎:用于生成动态 HTML 页面或返回 JSON 数据。
-
数据库交互:提供与数据库的集成方式,简化数据的 CRUD(创建、读取、更新、删除)操作。
-
身份验证和授权:简化用户登录、会话管理和权限控制。
-
安全特性:帮助抵御常见的 Web 安全攻击,例如 SQL 注入和跨站脚本攻击(XSS)。
常见的Web应用框架
Spring Boot (Java)
Spring Boot 是 Java 生态中最流行的 Web 应用框架之一,它基于 Spring 框架,简化了 Spring 应用的配置和部署。Spring Boot 通过“开箱即用”的默认配置,使得开发者可以更快地搭建 Web 应用,而不必关心大量的 XML 或 Java 配置
主要特点:
- 自动配置:Spring Boot 可以根据项目的依赖自动配置常用的组件,如数据库、消息队列等。
- 嵌入式服务器:支持嵌入式的 Tomcat、Jetty 或 Undertow,简化应用的打包和部署。
- 广泛的生态支持:与 Spring 家族的其他组件(如 Spring Security、Spring Data)无缝集成。
适用场景:
- 适合需要构建复杂的企业级应用和微服务架构的项目。
Django (Python)
Django 是一个 Python 框架,以“快速开发”和“代码重用”而著称。它遵循“Django 管理后台”的理念,提供了一个完备的后台管理界面,开发者可以快速上手并生成高效的 Web 应用。
主要特点:
- 全栈框架:内置 ORM(对象关系映射)、身份认证、模板引擎等功能,几乎涵盖了 Web 开发的各个方面。
- 安全性:Django 内置了很多安全特性,帮助开发者防范常见的 Web 攻击。
- 高度抽象化:通过简化数据库操作和 URL 路由,使开发者能够以极少的代码实现复杂功能。
适用场景:
- 快速原型设计和中小型 Web 应用,特别是涉及数据库驱动的项目。
Express.js (Node.js)
Express.js 是一个极简的 Node.js Web 应用框架。它非常轻量,提供了路由和中间件支持,使得开发者可以根据需求灵活构建 Web 应用或 API 服务。
主要特点:
- 轻量化和灵活性:没有过多的封装,开发者可以自由选择各种库和中间件。
- 丰富的中间件生态:通过 Express 中间件,可以轻松扩展功能,如日志记录、身份验证、错误处理等。
- 异步编程模型:基于 Node.js 的非阻塞 I/O 模型,适合高并发场景。
适用场景:
- 单页应用(SPA)、RESTful API 和实时应用(如 WebSocket 应用)。
CppCMS
CppCMS 是一个开源的高性能 Web 框架,专为高负载的 Web 应用程序设计。它的特点是通过低级别的 C++ 优化,提供了类似于 Python 的 Django、Ruby on Rails 的框架特性,但性能更高。
主要特点:
- 高性能:专为处理高并发、高流量而设计,擅长于处理静态内容、动态页面生成和缓存管理。
- 模板引擎:提供了自己的模板引擎,支持动态 HTML 内容的生成。
- 会话管理和认证:内置会话管理机制,支持用户认证和授权。
- I18N 支持:支持国际化(I18N),方便多语言 Web 应用的开发。
适用场景:
- 高并发、大流量的 Web 服务。
- 需要细粒度性能优化的 Web 应用。
Redis
Redis是一个基于内存的NoSQL数据库 通常用于缓存和消息队列 在现代分布式系统和高并发应用中不可或缺 性能高 数据结构丰富 使用灵活
主要特点
-
键值对存储:Redis 以键值对的方式存储数据,所有的数据都存储在内存中。
-
高性能:由于在内存中进行数据存取,读写速度极快。
-
丰富的数据结构:Redis 支持多种复杂的数据结构,包括字符串、哈希、列表、集合和有序集合等。
-
持久化:Redis 支持通过快照(Snapshot)和 AOF(Append Only File)进行数据持久化。
快照:将内存中的数据定期保存到硬盘中 生成一个RDB文件
AOF:对Redis数据的写操作以日志的方式追加到文件中 当重启时可以通过操作日志来恢复数据 有点像MySQL的数据备份
-
分布式集群:Redis 支持分片和复制,提供高可用性和扩展性。
应用场景
- 缓存:这也是最常见的应用场景之一,显著加快数据的读取速度 减少数据库的负担
- 存储会话:分布式系统中存储多个服务器的会话 确保多个应用服务器能够访问同一份会话数据
- 队列存储:通过列表、发布订阅功能 做一个轻量级的消息队列系统 适用于任务分发和和异步处理
- 分布式锁:Redis的单线程特性和高性能 可以用于分布式系统的锁管理
缓存问题
-
缓存击穿
当高频访问的热点数据突然失效时 大量请求会涌入数据库 可以通过互斥锁或者请求合并的方式 确保只有一个请求访问数据库 其他请求等待缓存重新设置
-
内存穿透
当恶意请求频繁访问查询不存在的键时 会直接访问数据库 可以使用布隆过滤器来预先判断这个请求是否应该访问数据库 减少无效查询
-
缓存雪崩
大量数据同时失效时 会有大量请求涌入数据库 对系统造成巨大压力 主要有下面的方法
- 设置不同的过期时间 确保缓存不会同时失效
- 增加随机事件
- 双缓存 使用本地缓存和Redis缓存的双层架构 减少Redis失效的压力
Redis集群架构
这是一种将多个Redis组合在一起实现高可用性和高性能的分布式架构
将数据分片存储在多个主节点上 实现负载均衡 故障转移 自动扩展
这里有两种集群架构
主从复制
每个主节点可以有一个或者多个从节点,从节点用于备份主节点的数据,可以在主节点故障时自动升级为新的主节点
Redis Cluster
这个架构可以让数据通过哈希槽,分到不同的主节点上 保证集群的容错能力
可以进行自动分片 负载均衡 并且在主节点挂了的适合进行故障转移
哈希槽(Hash Slot)是一种机制 Redis将所有的键(用键来算编号)映射到固定数量的哈希槽上 每主节点负责一定数量的哈希槽 这样来实现负载均衡
相关文章:

常见开源组件的详解
文章目录 RPCRPC架构和工作流程为什么有了HTTP还要用RPC底层协议数据格式连接管理错误处理 使用场景常见的RPC框架 Web应用框架主要功能常见的Web应用框架Spring Boot (Java)Django (Python)Express.js (Node.js) Redis主要特点应用场景缓存问题Redis集群架构主从复制Redis Clu…...

rust使用教程详解
欢迎来到 Rustlings。该项目包含一些小练习,让您习惯阅读和编写 Rust 代码。这包括阅读和响应编译器消息! 建议在阅读Rust 官方书籍(学习 Rust 最全面的资源)的同时做 Rustlings 练习 📚️ Rust By Example是另一个推…...
并查集的实现(朴素版)
这是C算法基础-数据结构专栏的第二十九篇文章,专栏详情请见此处。 由于作者即将参加CSP,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集ÿ…...

WPF 为button动态设置不同的模板
有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容,比如Button未点击安装显示: 安装后显示: 可以通过设置button的content,通过content来设置不同的模板来实现功能,以下是代码: MainWi…...

【C++贪心 DFS】2673. 使二叉树所有路径值相等的最小代价|1917
本文涉及知识点 C贪心 反证法 决策包容性 CDFS LeetCode2673. 使二叉树所有路径值相等的最小代价 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子…...

虚幻引擎GAS入门学习笔记(一)
虚幻引擎GAS入门(一) Gameplay Ability System(GAS) 是一个模块化且强大的框架,用于管理虚幻引擎中的游戏玩法逻辑。它的核心组成部分包括 Gameplay Ability(定义和执行能力)、Gameplay Effect(应用和管理…...

Excel:vba实现合并工作表(表头相同)
这个代码应该也适用于一些表头相同的工作表的汇总,只需要修改想要遍历的表,适用于处理大量表头相同的表的合并 这里的汇总合并表 total 是我事先创建的,我觉得比用vba代码创建要容易一下,如果不事先创建汇总表就用下面的代码&…...

Redis:分布式 - 主从复制
Redis:分布式 - 主从复制 概念配置主从模式info replicationslave-read-onlytcp-nodelay 命令slaveof 主从结构一主一从一主多从 主从复制流程数据同步命令全量同步部分同步实时同步 节点晋升 概念 Redis的最佳应用,还是要在分布式系统中。对于非分布式…...

el-date-picker设置只有某些日期可选
示例图: <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…...

java数据库操作-cnblog
创建lib目录,填入jar包 选择 libraries添加lib目录 package nb;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class JDBCtest {private static final String url "jdbc:mysql://localhost:3306/test?c…...

HCIP-HarmonyOS Application Developer 习题(九)
(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式? A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案:BCD 分析:系统提供了悬浮窗、分屏、平行视界三种多窗口交互,为用户在大屏幕设备上的多任务并行、便捷的临时任务…...

redis集成到spring boot中使用
(一)添加依赖 redis服务器在官网中公开了自己使用的协议--RESP,所以我们可以使用这个协议来访问redis服务器,但是如果我们要自己实现库,那肯定是非常麻烦的,所以我们可以使用网上的库,我们直接调…...

Spring Boot、Spring MVC和Spring有什么区别
人要长大,就要学会不断接受事件的变化 —— 24.10.14 spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题、更方便将不同类不同方法中的共同处理…...

Flip动画
前言 最近在做复图标库功能时,感觉这个功能在使用上有些“生硬”。如随机删除一个图标,后面的元素在视觉上是“瞬间移动”过来补位的。想着做个小优化,简单加个动画效果吧。 看起来确实“花里胡哨”了,实现也很简单, …...

Java通过RAG构建专属知识问答机器人_超详细
RAG:融合检索与生成的文本精准生成技术 检索增强生成(RAG)是一种技术,它通过结合检索模型和生成模型来提高文本生成的准确性。具体来说,RAG首先利用检索模型从私有或专有的数据源中搜索相关信息,然后将这些…...

2.1 使用点对点信道的数据链路层
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 通信信道类型2 数据链路3 帧4 透明传输5 差错检测 前言 在计算机网络通信中,数据链路层起着关键作用。它为直接相连的网络设备之间提供可靠的数据传输服务。…...

台式机来电自启动设置
在前司时,由于有些工作需要用到台式机,且一到节假日或者突然停电等情况,电脑每次都需要自己手动开机,后来研究了一下,发现可以在BIOS里面更改设置,从而变成关机的情况下,只要来电就能自动开机&a…...

【最新华为OD机试E卷-支持在线评测】考勤信息(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

netdata保姆级面板介绍
netdata保姆级面板介绍 基本介绍部署流程下载安装指令选择设置KSM为什么要启用 KSM?如何启用 KSM?验证 KSM 是否启用注意事项 检查端口启动状态 netdata和grafana的区别NetdataGrafananetdata各指标介绍总览system overview栏仪表盘1. CPU2. Load3. Disk…...

苹果最新论文:LLM只是复杂的模式匹配 而不是真正的逻辑推理
大语言模型真的可以推理吗?LLM 都是“参数匹配大师”?苹果研究员质疑 LLM 推理能力,称其“不堪一击”!苹果的研究员 Mehrdad Farajtabar 等人最近发表了一篇论文,对大型语言模型 (LLM) 的推理能…...

Python知识点:基于Python工具,如何使用Scikit-Image进行图像处理与分析
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 基于Python的Scikit-Image图像处理与分析指南 在Python的科学计算生态系统中&am…...

MongoDB初学者入门教学:与MySQL的对比理解
🏝️ 博主介绍 大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~ 👨🎓 个人介绍:本人是一名后端Java开发工程师,坐标北京 ~ 🎉 感谢关注 📖 一起学习 &…...

Oracle AI Vector Search
Oracle AI Vector Search 是 Oracle Database 23ai 中引入的一项新技术,它允许用户在数据库中直接存储和高效查询向量数据。这项技术旨在简化应用程序的开发,并且支持不同维度和格式的向量。以下是 Oracle AI Vector Search 的一些关键特性和优势&#x…...

基于SpringBoot的健身会员管理系统实战分享
在这个充满活力的时代,我们自豪地呈现一款专为健身爱好者和专业人士设计的会员管理系统——一个集创新、效率与便捷于一体的解决方案。我们的系统基于强大的RuoYi-Vue框架构建,采用最新的Spring Boot和Vue3技术,确保了系统的高性能和用户友好…...

Elasticsearch高级搜索技术-结构化数据搜索
目录 结构化数据的存储 示例映射 使用range查询 查询示例 运算符 更多示例 日期查询 示例 结构化数据搜索是Elasticsearch另一个强大的功能,允许用户对具有明确类型的数据(如数字、日期和布尔值)进行精确的过滤和查询。这种类型的搜索通常涉及…...

ffmpeg面向对象——类所属的方法探索
ffmpeg是面向对象的思想写的代码,自然符合oopc的实现套路。这个也是oopc的通用法则。 1.类所属方法oopc的实现形式 ffmpeg抽象出某一类,然后某一类的方法如何调用?你说这还不简单: 对象.对象方法() 或者 对象指针-&g…...

TensorRT-LLM七日谈 Day3
今天主要是结合理论进一步熟悉TensorRT-LLM的内容 从下面的分享可以看出,TensorRT-LLM是在TensorRT的基础上进行了进一步封装,提供拼batch,量化等推理加速实现方式。 下面的图片更好的展示了TensorRT-LLM的流程,包含权重转换&…...

如何使用Pandas库处理大型数据集?
如何使用Pandas库处理大型数据集? 处理大型数据集是数据分析中的一个挑战,尤其是在资源有限的情况下。Pandas是Python中非常流行的数据处理库,但它在处理非常大的数据集时可能会遇到内存限制的问题。因此,我们需要一些策略来提高Pandas处理大型数据集的效率。以下是使用Pa…...

XHR 创建对象
XHR 创建对象 XMLHttpRequest(XHR)是现代Web开发中不可或缺的技术之一。它允许Web开发者通过JavaScript发送网络请求,以在不重新加载整个页面的情况下更新网页的某部分。XHR为开发者提供了一种在客户端和服务器之间传输数据的有效方式,是AJAX(Asynchronous JavaScript an…...

# 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析
在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析 一、问题描述: 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 如下图: 二、报错分析&…...