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

[re_2] rpc|http|nginx|protobuf|

 

 

 

 

1.为什么做rpc这个项目

2.rpc和http应用场景有什么区别

RPC适合系统内部各模块间高效通信(如电商系统的订单和支付模块)

HTTP适合不同系统间跨网络交互(如调用第三方天气接口)

http

http1--1.1

HTTP 1.0是无状态、无连接的应用层协议,每次请求都要建立新TCP连接,用完就断

虽可通过cookie/session做身份和状态管理,但存在无法复用连接、队头阻塞等问题

不支持文件断点续传,缓存控制也较简单,带宽利用有浪费;

 

HTTP 1.1做了改进

支持长连接,能在一个TCP连接上传多个请求响应,引入更多缓存策略和range头域实现部分资源请求,

新增错误状态码,还要求请求带host头域,提升了性能与功能。

 

 

--http2

http2:http://www.http2demo.io/

HTTP/2 兼容 HTTP/1.1 靠 Upgrade 机制:

客户端先通过请求头里的 Connection 和 Upgrade 字段,询问服务器是否支持 HTTP/2(协议名 h2c)。

  • 服务器若不支持,就按 HTTP/1.1 通信;
  • 若支持,会返回 101 状态码,之后用 HTTP/2 通信。

像 OkHttp 这类工具也用类似协议协商升级的方式,先以 HTTP/1.1 发请求,再看服务器是否支持升级。

 

 

3.nginx的反向代理和正向代理 nginx的负载均衡策略

正向代理:客户端主动配置,代理客户端

反向代理:代多台服务器,做内部负载均衡

负载均衡策略

随记

 - 随机:随机选集群节点处理请求,请求多了各节点负载会趋于平衡,简单高效,适合对负载均衡要求不高的场景。

- 加权随机:按服务器权重复制后随机选,比如服务器  A权重1、B权重2,复制成[A,B,B]再随机选, 但依赖伪随机数,集群伸缩时精度有问题。

轮询

- 简单轮询:按顺序轮流把请求分给服务器,不考虑服务器性能差异,易造成资源浪费,应用少。
- 加权轮询:给服务器设置权重,根据性能分配请求。有经典(WRR)和交错(IWRR)两种实现,IWRR能避免节点负载尖刺,节点权重相近时效果好,权重差异大时和WRR效果趋同,实践中还会用节点权重最大公约数优化。
- 平滑加权轮询:解决加权轮询可能连续调用同一服务器的问题,让请求分配更均匀,避免服务器连续过载。

 

hash

 - Hash 类:
- 哈希取模:对请求相关内容哈希后取模,把请求分到对应服务器。


- 一致性 Hash:解决服务器增减时大量请求重新分配的问题,更稳定。


- 最少活跃数:把请求分给当前活跃调用数最少的服务器,因为活跃数少说明服务器效率高。


- 引申出的负载均衡方式有 DNS 负载均衡、Nginx 的四层和七层负载均衡,以及 CPU 多核间的负载均衡等。

 

负载均衡应用

- DNS负载均衡:靠DNS服务器返回不同IP分配请求,简单易扩展,但难实时感知服务器状态,调整生效有延迟。

- Nginx四层负载均衡:基于传输层IP和端口转发请求,性能高且能做健康检查,却无法深度处理应用层数据。

- Nginx七层负载均衡:解析应用层(如HTTP)内容来分发请求,灵活能实现复杂逻辑,但更耗CPU,性能有损耗。

- CPU多核间负载均衡:系统用调度算法把任务分到空闲CPU核心,提升CPU利用率和系统性能,不过调度算法复杂,还可能有额外开销。

 

 

DNS

 攻击者为放大DNS响应,常查ANY类型(请求所有记录)。常见DNS记录类型有A(解析域名到IP)、NS(指定域名服务器)、CNAME(别名解析)等。

防御可通过检测源IP的ANY查询次数,超阈值就拦截。针对伪造IP,可强制升级到TCP:按标准,DNS查询先试UDP,响应截断就用TCP重发,解析器和服务器需支持TCP作为备份。

 

4.为什么选择protobuf 为什么protobuf不需要带属性

 

代码

syntax="proto3"; package contacts; // 非嵌套 message Phone { string phone_num = 1; } message PeopleInfo { string name = 1; // 姓名 int32 age = 2; // 年龄 // 可嵌套 // message Phone // { // string PhoneNum = 1; // } repeated Phone phones = 3; // 电话 }

 

a

用Protobuf是因为它序列化高效、数据传输快,还能跨语言、版本兼容好。Protobuf里的int类型有int32、int64、uint32、uint64、sint32、sint64等,像int32、int64常用。比如通讯录项目,用int32存年龄,还能嵌套定义电话等消息结构,方便又灵活。

http://www.xdnf.cn/news/1434655.html

相关文章:

  • HBuilder X 4.76 开发微信小程序集成 uview-plus
  • 【Linux我做主】进程退出和终止详解
  • C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)
  • 拷打字节面试官之-吃透c语言-哈希算法 如何在3面拷打字节cto 3万行算法源码带你吃透算法面试所有考题
  • 【完整源码+数据集+部署教程】鸡粪病害检测系统源码和数据集:改进yolo11-bifpn-SDI
  • 前端开发中经常提到的iframe、DOM是什么?
  • WPF中的DataContext以及常见的绑定方式
  • windows下wsl2 ubuntu开发配置
  • 破解人事管理非标化困境:启效云低代码如何助力业务突围?
  • 为什么同步是无线通信的灵魂?WiFi 与 5G 帧结构中的关键技术
  • 创建一个只能直接构造和销毁,但不能被复制和移动的基类
  • burpsuite使用之CaA神器使用
  • 2025年企业级数据服务API平台大全和接入指南
  • Text2SQL与DataAgent技术深度对比与实践指南
  • Java集合源码解析之LinkedList
  • 串口服务器技术详解:2025年行业标准与应用指南
  • 今天我们继续学习shell编程语言的内容
  • Vscode + docker + qt 网络监听小工具
  • 方差分析(通俗易理解)
  • Java代码耗时统计的5种方法
  • docker redis容器命令行操作
  • # pdf.js完全指南:构建现代Web PDF查看与解析解决方案
  • flume扩展实战:自定义拦截器、Source 与 Sink 全指南
  • 基于SQLite索引的智能图片压缩存储系统设计与实现
  • 【Vue】前端 vue2项目搭建入门级(二)
  • Arduino Uno与4×4矩阵键盘联动完全指南
  • Day11--HOT100--25. K 个一组翻转链表,138. 随机链表的复制,148. 排序链表
  • 模拟在线测试中相关语句的应用
  • Python如何处理非标准JSON
  • 百度网盘基于Flink的实时计算实践