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

Go微服务实践 - Rpc核心概念理解

概述

从0研究一下Golang已经Golang的微服务生态体系,Golang的微服务首先要从Rpc开始,在升级到Grpc,详细介绍这些技术点都在解决什么技术问题。

Rpc

  • Rpc (Remote Procedure Call) 远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。
  • 对应Rpc的是本地过程调用,函数调用时最常见的本地过程调用。
  • 将本地过程调用变成远程过程调用会面临各种问题。

远程调用过程面临的问题?

1.Call ID映射。

我们怎么告诉远程机器我们要调用的函数ID呢?再本地调用中,函数体是直接通过指针来指定的,我们调用function,编译器就自动帮我们调用它相应的函数指针。

但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,再RPC中,所有的函数都必须有自己的一个ID。这个ID在所有的进程中都是唯一确定的。客户端在做远程调用时,必须附上这个ID。然后还需要再客户端和服务端分别维护一个{函数 <–> Call ID}的对应表。两者的表不一定需要完全相同,但相同函数对应的Call ID必须相同。

当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应的函数的代码。

2.序列化和反序列化

客户端怎么把参数值传给远程函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的不是同一种编程语言,这时候就需要客户端和服务端把参数先转成一个字节流,传给服务端后再把字节流转成自己能读懂的格式,这个过程叫做序列化和反序列化。

3.网络传输

远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后在把序列化后的调用结果返回客户端,只要能完成这两者的,都可以作为传输层使用。

因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分Rpc框架都使用Tcp协议,但其实Udp也可以,gRPC干脆使用了Http2。

Rpc框架需要解决哪些问题

在这里插入图片描述

Client端要解决的问题:

1.将这个调用映射为Call ID,这里假设用最简单的字符串当Call ID的方法
2.将Call ID a和b序列化,可以直接将他们的值以二进制形式打包
3.把2中得到的数据包发送给ServerAddr,这需要网络传输层
4.等待服务器返回结果
5.如果服务器调用成功,那么被结果反序列化,并献给total

Server端解决的问题:

1.在本地维护一个Call ID到函数指针的映射call_id_map,可以用dict完成
2.等待请求,包括多线程的并发处理能力
3.得到一个请求后,将其数据包反序列化,得到Call ID
4.通过在call_id_map中查找,得到相应的函数指针
5.将aherb反序列化后,本地调用add函数,得到结果
6.将结果序列化后通过网络返回给Client

在上面的整个流程中,估计有部分同学看到了熟悉的计算机网络的流程和web服务器的定义,所以要实现一个Rpc框架,其实只需要按以上流程实现就基本完成了。

其中:

  • Call ID映射可以直接使用函数字符串,也可以使用整数ID,映射表一般就是一个哈希表。
  • 序列化和反序列化可以自己写,也可以使用Protobuf或者FlatBuffers之类的。
  • 网络传输库可以自己写socket,或者用asio,ZeroMQ,Netty之类。

相关文章:

Go微服务实践 - Rpc核心概念理解

概述 从0研究一下Golang已经Golang的微服务生态体系&#xff0c;Golang的微服务首先要从Rpc开始&#xff0c;在升级到Grpc&#xff0c;详细介绍这些技术点都在解决什么技术问题。 Rpc Rpc (Remote Procedure Call) 远程过程调用&#xff0c;简单的理解是一个节点请求另一个节…...

Effective Java笔记(27)消除非受检的警告

用泛型编程时会遇到讲多编译器警告 &#xff1a; 非受检转换警告&#xff08; unchecked cast warning &#xff09;、非受检方法调用警告、非受检参数化可变参数类型警告&#xff08; unchecked parameterized vararg type warning&#xff09;&#xff0c;以及非受检转换警告…...

Dapper

介绍 Dapper是一个轻量级的ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它可以方便地将数据库查询结果映射到.NET对象上&#xff0c;同时也支持执行原生SQL查询。下面我将详细介绍Dapper的使用方法。 安装Dapper 首先&#xff0c;你需要通过NuGet包管理器将Dap…...

Python基础知识(一)

数据类型 基本类型 数字&#xff0c;字符串&#xff0c;布尔 数字类型 int整型 整数 float浮点型 带小数的数 complex复数 abj 字符串类型 str字符串 视作文本 组成&#xff1a;由数字&#xff0c;字母&#xff0c;空格&#xff0c;其他字符等组合而成 表达&#xff…...

QTthreadPool 程序

//*******************主窗口****************************// ------------------------.H--------------------------------- ----------------------------------------------------------- #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #inclu…...

python注册机制Registry

Register用法 1. 为什么使用Register2. 先验知识-----装饰器2.1 代码视角的装饰器用法2.2 装饰器的使用场景2 3. Registry注册器参数parent介绍未完待续 1. 为什么使用Register 2. 先验知识-----装饰器 2.1 代码视角的装饰器用法 实例1 decorate def func():pass #! 等价于…...

【Megatron-DeepSpeed】张量并行工具代码mpu详解(三):张量并行层的实现及测试

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三)&#xff1a;张量并行层的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a;并行环境初始化 【Megatron-DeepSpeed】张量并行工具代码mpu详解(二)&#xff1a;Collective通信操作的封装ma…...

【SpringBoot学习笔记】02. yaml配置注入

yaml配置注入 yaml基础语法 说明&#xff1a;语法要求严格&#xff01; 1、空格不能省略 2、以缩进来控制层级关系&#xff0c;只要是左边对齐的一列数据都是同一个层级的。 3、属性和值的大小写都是十分敏感的。 yaml注入配置文件 1、在springboot项目中的resources目录…...

【初阶C语言】指针的妙用

前言&#xff1a;在C语言中&#xff0c;有一个非常重要的知识点&#xff0c;叫做指针&#xff0c;指针也是数据类型中的一种。在本节内容中&#xff0c;我们就一起来学习指针。 学习一个新知识的时候&#xff0c;我们需要从这几个方面&#xff1a;指针是什么&#xff0c;指针是…...

链表——LinkedList类的概述和实现

LinkedList类 1.1LinkedList类概述 LinkedList类底层是基于双向链表结构实现的&#xff0c;不同于ArrayList类和Vector类是基于数组实现的&#xff1b;LinkedList类是非线程安全的&#xff1b;LinkedList类元素允许为null&#xff0c;允许重复元素&#xff1b;LinkedList类插…...

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…...

VSCode CMake vcpkg 整合

VSCode 整合 CMake 调试 CMake 工程 // launch.json {"version": "0.2.0","configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch",// Resolved by …...

c++ | win vscode

vscode 适合新手做一些简单的单个的编译和调试 新手适合去配置c 环境&#xff0c;尤其是当涉及复杂一点的编程&#xff0c;如多文件、多线程&#xff0c;在调试的时候会头大&#xff0c;要求会高一点 但怎么说呢&#xff1f; c 编译和调试是最接近实际开发环境的&#xff0c;与…...

算法-快速排序

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 详细思路直接看我录制的视频吧 算法-快速排序_哔哩哔哩_bilibili class Soluti…...

SSM项目-博客系统

在线体验项目&#xff1a;登陆页面 项目连接&#xff1a;huhublog_ssm: 个人博客系统 技术栈&#xff1a;SpringBoot、SpringMVC、Mybatis、Redis、JQuery、Ajax、Json (gitee.com) 1.项目技术点分析 SpringBoot、SpringWeb(SpringMVC)、MyBatis、MySQL(8.x)、Redis(存储验…...

Android Gradle Plugin 编译

1. 源码下载&#xff1a; $ mkdir studio-main $ cd studio-main $ repo init -u https://android.googlesource.com/platform/manifest -b studio-main $ repo sync -c -j4 -q 这个官方网址让下载 studio-master-dev 分支&#xff0c;这个分支很老旧了&#xff0c;我这里直接…...

如何快速掌握水土保持方案编制

1、熟悉水土保持常用的主要法律法规、部委规章、规范性文件及技术规范与标准&#xff1b; 2、了解水土保持方案、监测及验收工作开展的流程&#xff1b; 3、熟悉水土保持方案、监测及验收工作需要收集的资料、现场踏勘注意事项&#xff1b; 4、熟悉常见水土保持工程施工工艺…...

前端笔试---acm模式

前言 之前一直刷力扣&#xff0c;昨天做了小红书笔试&#xff0c;发现是acm模式&#xff0c;不太熟悉&#xff0c;特此总结。其实如果是acm模式就需要自己写一下输入输出。前端一般有两个选择&#xff0c;一个是基于 V8 环境&#xff0c;另一个是基于 node。 V8 // 对于有多…...

国联易安网页防篡改保护系统“渠道招募”启动啦!

作为业内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全的领军企业&#xff0c;国联易安网页防篡改保护系统基于“高效同步”、“安全传输”两项技术&#xff0c;具备了独特的“五重防护”新特性&#xff0c;支持网页的全自动发布、网页监控、报警和自…...

JavaScript--WebStorage

目录 WebStorage概述 WebStorage分类 注意&#xff1a; localStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; sessionStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; WebStorage概述 WebStorage是HTML5中…...

Qwen3.5-9B在目标检测领域的应用:YOLOv5模型原理与调参详解

Qwen3.5-9B在目标检测领域的应用&#xff1a;YOLOv5模型原理与调参详解 1. 引言&#xff1a;当大模型遇见目标检测 在智能安防、自动驾驶和工业质检等领域&#xff0c;目标检测技术正发挥着越来越重要的作用。YOLOv5作为当前最流行的实时目标检测算法之一&#xff0c;以其出色…...

ShareList插件开发全攻略:从零开始打造专属网盘工具

ShareList插件开发全攻略&#xff1a;从零开始打造专属网盘工具 【免费下载链接】sharelist 快速分享 GoogleDrive OneDrive 项目地址: https://gitcode.com/gh_mirrors/sh/sharelist ShareList是一款强大的开源网盘工具&#xff0c;支持快速挂载Google Drive、OneDriv…...

双系统安装OpenClaw全攻略:Windows+Mac对接Qwen2.5-VL-7B图文模型

双系统安装OpenClaw全攻略&#xff1a;WindowsMac对接Qwen2.5-VL-7B图文模型 1. 为什么需要双系统部署OpenClaw 作为一个经常在Windows办公机和MacBook之间切换的技术博主&#xff0c;我一直在寻找能跨平台无缝衔接的AI助手方案。直到发现OpenClaw支持对接Qwen2.5-VL-7B这样的…...

电子设计竞赛:坡道行驶电动小车设计与实现

1. 四川省电子设计竞赛一等奖作品解析&#xff1a;坡道行驶电动小车去年参加四川省电子设计竞赛时&#xff0c;我们团队选择了C题"坡道行驶电动小车"这个看似简单实则暗藏玄机的题目。经过72小时的连续奋战&#xff0c;最终拿下一等奖。今天就把这个项目的完整实现方…...

二极管特性与19种经典应用电路详解

1. 二极管基础特性与工作原理二极管作为电子电路中最基础的半导体器件之一&#xff0c;其核心特性源于PN结的单向导电性。当P型半导体&#xff08;空穴多数载流子&#xff09;与N型半导体&#xff08;电子多数载流子&#xff09;结合时&#xff0c;在交界处形成耗尽层&#xff…...

蒙特卡洛方法与科学计算十大经典算法解析

1. 蒙特卡洛方法&#xff1a;从赌场到科学计算的跨界革命 1946年&#xff0c;三位天才科学家在洛斯阿拉莫斯实验室的咖啡时间里&#xff0c;可能不会想到他们正在创造一种将彻底改变科学计算的方法。蒙特卡洛方法的名字来源于摩纳哥著名的赌城&#xff0c;这暗示了其核心思想—…...

C语言三大控制结构:零基础学循环与选择

C语言编程里&#xff0c;控制结构用以构架程序逻辑&#xff0c;是新手入门的关键要点&#xff0c;掌握顺序、选择、循环这三大基本控制结构&#xff0c;可使你脱离单纯顺序代码编写&#xff0c;达成更复杂、更灵活的程序逻辑&#xff0c;本文会将C语言控制结构的核心知识点讲解…...

【LeetCode 刷题日】19.删除链表的倒数第n个节点

&#x1f525;个人主页&#xff1a;北极的代码&#xff08;欢迎来访&#xff09; &#x1f3ac;作者简介&#xff1a;java后端学习者评论和 ❄️个人专栏&#xff1a;苍穹外卖日记&#xff0c;SSM框架深入&#xff0c;JavaWeb ✨命运的结局尽可永在&#xff0c;不屈的挑战却不可…...

甲子光年:AI原生组织——OpenClaw推动组织形态重塑 2026

这份《AI 原生组织&#xff1a;OpenClaw 推动组织形态重塑》报告核心内容可概括为&#xff1a;一、OpenClaw&#xff1a;引爆 AI Agent 的现象级开源框架定位&#xff1a;开源 AI Agent 框架&#xff0c;从个人 AI 助手快速向 B 端延展&#xff0c;4 个月实现行业十年发展&…...

基于双向反激变换器的SOC估算与主动均衡策略仿真研究——复现硕士论文并拓展六节电池模型与均衡策略分析

基于双向反激变换器的SOC估算与主动均衡仿真 可以 [1]复现硕士论文&#xff1a;《锂离子电池SOC估算与主动均衡策略研究_王昊》 [2]六节电池模型&#xff1a;使用Simmulink搭建了六节电池主动均衡仿真 [3]均衡策略&#xff1a;选择了电压、SOC及其分阶段使用作为主动均衡变量&a…...