当前位置: 首页 > news >正文

常见开源组件的详解

文章目录

    • 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的工作流程很简单

  1. 客户端调用:客户端调用本地的一个代理函数(stub),负责将请求参数序列化,然后发送到服务器

    代理函数(stub):是负责客户端和服务器之间的通信 主要是为远程服务调用提供的一个本地接口 把远程调用的过程隐藏起来 他的内部处理功能就是序列化与反序列化 错误处理 返回结果 这种代理函数也支持多种编程语言 让不同语言的服务也能够通信

  2. 网络传输

  3. 服务处理:服务端接收代理函数的请求 反序列化参数 调用相关服务

  4. 响应返回

  5. 客户端接收

请添加图片描述

我们可以在很多地方都看到这种思想 例如MySQL的客户端和服务端分离 RabbitMQ的客户端服务端分离

客户端负责的起始就只有把请求按要求进行序列化和传递请求给服务端 真正运行复杂服务的是服务端

这里就有了两种调用方式 同步调用和异步调用

大家基础好的话看到这两个词就能明白是什么意思 同步调用就是阻塞等待返回结果 而异步调用不等待结果直接继续执行

为什么有了HTTP还要用RPC

这两者的共同点都是完成了一个请求与响应的过程

HTTP的协议很简单易用 用途也很广泛 但是RPC更加适用于这种远程调用的过程

底层协议

RPC的底层协议是TCP/IP协议 而HTTP协议是TCP协议

RPC下面可以使用TCP和UDP 也可以使用其他的自定义协议

但是HTTP是只能使用TCP了 在一些高性能低延迟条件下还是RPC更胜一筹 不用每次都三次握手四次挥手

数据格式

RPC主要是用二进制格式数据(例如protobuf) 让数据的传输更加安全高效

特性ProtobufJSONXML
数据体积小,二进制格式大,文本格式更大,带有大量标记
解析速度快,二进制格式较慢,基于字符串解析更慢,带有复杂的结构
可读性不可读人类可读人类可读
向后兼容性支持,未识别字段被忽略支持,但需要注意字段命名支持,但 XML 复杂性较高
多语言支持强,支持多种编程语言较强,流行语言都有支持较强,但通常处理较复杂

而HTTP主要是用文本格式的数据 JSON或者XML进行数据交换 虽然也支持二进制传输 但是会导致更大的数据体积

因为传统的HTTP通信时是要求以文本形式进行传输的 当传输二进制数据时就要求其转换为一种文本表示 常见的就是Base64编码
结构化的JSON和XML的文本格式开销也很大 对于大型的结构化数据也不是很友好

连接管理

当请求很多时 长连接的效率就很高 可以同时发送很多请求

而传统的HTTP则使用短连接 会频繁的建立和关闭连接

错误处理

学过HTTP协议的错误处理都知道 这个玩意的错误机制是不太好的 客户端要根据状态码的不同处理不同的错误情况

使用场景

  1. 微服务架构 在微服务架构中 各个服务之间需要频繁互动
  2. 高性能应用 快速响应和低延迟应用
  3. 分布式系统 多个不同地域的服务器进行数据交互与服务调用

常见的RPC框架

  1. gRPC:google开发的 支持多种语言 基于HTTP/2协议
  2. Apache Thrift 支持多种语言的RPC框架 灵活性高 适合构建跨语言的分布式服务
  3. Apache Dubbo 高性能的Java RPC框架 提供服务治理功能 适用于微服务架构
  4. 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的单线程特性和高性能 可以用于分布式系统的锁管理

缓存问题

  1. 缓存击穿

    当高频访问的热点数据突然失效时 大量请求会涌入数据库 可以通过互斥锁或者请求合并的方式 确保只有一个请求访问数据库 其他请求等待缓存重新设置

  2. 内存穿透

    当恶意请求频繁访问查询不存在的键时 会直接访问数据库 可以使用布隆过滤器来预先判断这个请求是否应该访问数据库 减少无效查询

  3. 缓存雪崩

    大量数据同时失效时 会有大量请求涌入数据库 对系统造成巨大压力 主要有下面的方法

    1. 设置不同的过期时间 确保缓存不会同时失效
    2. 增加随机事件
    3. 双缓存 使用本地缓存和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,所以到比赛结束前将不再发表文章! 引入 并查集是一种可以快速合并查找集合的一种数据结构,这次我们将通过三道题来详细讲解并查集&#xff…...

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设置只有某些日期可选

示例图&#xff1a; <el-date-pickerv-model"topFormObj.upTime"type"date"value-format"timestamp"format"dd/MM/yyyy":picker-options"pickerOptions" /> 固定限制每周的周末周三不可选 data() {return {pickerOp…...

java数据库操作-cnblog

创建lib目录&#xff0c;填入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多窗口交互能力提供了以下哪几种交互方式&#xff1f; A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案&#xff1a;BCD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷的临时任务…...

redis集成到spring boot中使用

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

Spring Boot、Spring MVC和Spring有什么区别

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

Flip动画

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

Java通过RAG构建专属知识问答机器人_超详细

RAG&#xff1a;融合检索与生成的文本精准生成技术 检索增强生成&#xff08;RAG&#xff09;是一种技术&#xff0c;它通过结合检索模型和生成模型来提高文本生成的准确性。具体来说&#xff0c;RAG首先利用检索模型从私有或专有的数据源中搜索相关信息&#xff0c;然后将这些…...

2.1 使用点对点信道的数据链路层

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

台式机来电自启动设置

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

【最新华为OD机试E卷-支持在线评测】考勤信息(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

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

netdata保姆级面板介绍

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

苹果最新论文:LLM只是复杂的模式匹配 而不是真正的逻辑推理

大语言模型真的可以推理吗&#xff1f;LLM 都是“参数匹配大师”&#xff1f;苹果研究员质疑 LLM 推理能力&#xff0c;称其“不堪一击”&#xff01;苹果的研究员 Mehrdad Farajtabar 等人最近发表了一篇论文&#xff0c;对大型语言模型 &#xff08;LLM&#xff09; 的推理能…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...