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之类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【果树农药喷洒机器人】Part4:果树冠层图像实例分割模型优化

文章目录 一、引言二、数据集制作2.1图像采集2.2图像标注与增强 三、构建柑橘树冠实例分割模型结构3.1优化特征提取网络3.2U-Net替换FCN 一、引言 为准确获取柑橘树冠的生长信息&#xff0c;实现果树喷药机器人的精准喷施&#xff0c;对处于多种生长阶段的柑橘树冠进行图像分割…

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT&#xff1a;人工智能的奇迹 引言什么是人工智能&#xff1f;ChatGPT&#xff1a;AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一项令人兴奋的…

IAR开发环境的安装、配置和新建STM32工程模板

IAR到环境配置到新建工程模板-以STM32为例 一、 简单介绍一下IAR软件1. IAR的安装&#xff08;1&#xff09; 下载IAR集成开发环境安装文件&#xff08;2&#xff09; 安装 2. 软件注册授权 二、IAR上手使用(基于STM32标准库新建工程)1、下载标准库文件2、在IAR新建工程&#x…

ImageNet Classification with Deep Convolutional Neural Networks

&#xff08;一&#xff09;Some Words: 这里主要是通过记录一些笔记来阅读这篇 Paper&#xff0c;它的产生跟 ImageNet LSVRC-2010 竞赛有关&#xff0c;通过训练一个大的、深的卷积网络来将 1.2 million 的 HR 图像分成 1000 类 &#xff0c;这个网络实现了 top-1 37.5% 和 …

GPU显存泄露/显存溢出/显存爆炸 解决方案

问题描述 最近在跑一个基于pytorch的强化学习代码&#xff0c;在训练过程中显存增大非常明显&#xff0c;迭代不到200个iteration就可以占据70G的显存。由于博主是第一次在pytorch实现的强化学习算法上加入自己的实现&#xff0c;很没有应对经验&#xff0c;现将调试过程记录下…

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…

使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph

本文由社区用户 Albert 贡献&#xff0c;首发于 NebulaGraph 论坛&#xff0c;旨在提供多一种的部署方式使用 NebulaGraph。 在本文&#xff0c;我将会详细地记录下我用 K8s 部署分布式图数据库 NebulaGraph 的过程。下面是本次实践的内容规划&#xff1a; 一到十章节为 K8s 集…

用html+javascript打造公文一键排版系统16:更新单个附件说明排版,实现多个附件说明排版

利用公休的时间继续完善。 一、更新单个附件说明排版 之前实现单个附件说明排版时&#xff0c;我们只考虑了“附件&#xff1a;”中冒号为半角的情况&#xff0c;而没有考虑存在多任余空格的情况&#xff0c;我们今天先针对存在多任余空格的情况进行完善&#xff0c;增加了温…

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Po模型介绍 1、简…

Redis 报错 RedisConnectionException: Unable to connect to x.x.x.x:6379

文章目录 Redis报错类型可能解决方案 Redis报错类型 org.springframework.data.redis.connection. spingboot调用redis出错 PoolException: Could not get a resource from the pool; 连接池异常:无法从池中获取资源; nested exception is io.lettuce.core. 嵌套异常 RedisConn…

聊聊JDK动态代理原理

1. 示例 首先&#xff0c;定义一个接口&#xff1a; public interface Staff {void work(); }然后&#xff0c;新增一个类并实现上面的接口&#xff1a; public class Coder implements Staff {Overridepublic void work() {System.out.println("认真写bug……");…

一起学数据结构(3)——万字解析:链表的概念及单链表的实现

上篇文章介绍了数据结构的一些基本概念&#xff0c;以及顺序表的概念和实现&#xff0c;本文来介绍链表的概念和单链表的实现&#xff0c;在此之前&#xff0c;首先来回顾以下顺序表的特点&#xff1a; 1.顺序表特点回顾&#xff1a; 1. 顺序表是一组地址连续的存储单元依次存…

图像提示词攻略--基于 stable diffusion v2

Stable Diffusion 是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入&#xff08;称为提示&#xff09;的情况下生成逼真的图像。 在本文中&#xff0c;我将讨论和探索一些提高提示有效性的方法。从在提示中添加某些关键字和组合词、从更改单词顺序及其标点符…

24v转3.3v输出3A用什么芯片

问&#xff1a;客户需要一个能够将24V输入电压转换为3.3V输出电压&#xff0c;并且能够提供1-3A的电流输出的芯片。还希望它能够内置MOS管。有什么推荐的型号吗&#xff1f;&#xff08;vin24v、5v&#xff0c;vout3.3v&#xff0c;Io1-3A&#xff09; 答&#xff1a;推荐使用…

【福建事业单位-推理判断】08逻辑论证-加强-原因解释-日常总结

福建事业单位-推理判断】08逻辑论证-加强 一、加强题1.1 建立联系——搭桥1.2 补充论据必要条件&#xff08;没它不行&#xff09;补充论据&#xff08;解释原因和举例论证&#xff09; 总结 二、原因解释题三、日常结论复习建议 一、加强题 加强的题型&#xff0c;一般只加强…

替换开源LDAP,某科技企业用宁盾目录统一身份,为业务敏捷提供支撑

客户介绍 某高科技企业成立于2015年&#xff0c;是一家深耕于大物流领域的人工智能公司&#xff0c;迄今为止已为全球16个国家和地区&#xff0c;120余家客户打造智能化升级体验&#xff0c;场景覆盖海陆空铁、工厂等货运物流领域。 该公司使用开源LDAP面临的挑战 挑战1 开源…

详解Kafka分区机制原理|Kafka 系列 二

Kafka 系列第二篇&#xff0c;详解分区机制原理。为了不错过更新&#xff0c;请大家将本号“设为星标”。 点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达 上一篇文章介绍了 Kafka 的基本概念和术语&#xff0c;里面有个概念是 分区(Part…

高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM

目录 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 // src/ch6/test_2dlidar_io.cc // Created by xiang on 2022/3/15. // #include <gflags/gflags.h> #include <glog/logging.h> #include <opencv2/highgui.hpp>…