RPC与服务的注册发现
文章目录
- 1. 什么是远程过程调用(RPC)?
- 2. RPC的流程
- 3. RPC实践
- 4. RPC与REST的区别
- 4.1 RPC与REST的相似之处
- 4.2 RPC与REST的架构原则
- 4.3 RPC与REST的主要区别
- 5. RPC与服务发现
- 5.1 以zookeeper为服务注册中心
- 5.2 以etcd为服务注册中心
- 6. 小结
- 参考
1. 什么是远程过程调用(RPC)?
在分布式计算中,远程过程调用(RPC)是指计算机程序导致过程(子程序)在不同的地址空间(通常为一个开放网络中的另一台计算机)执行,其编写方式就像是普通(本地)过程调用一样,程序员无需明确编写远程交互的细节。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受响应进行信息交互的系统。
RPC是一种进程间通信的模式,程序分布在不同的地址空间中。如果在同一主机里,RPC可以通过不同的虚拟地址空间(即使使用相同的物理地址)进行通讯,而在不同主机间,则通过不同的物理地址进行交互。许多技术(通常是不兼容)都是基于这种概念而实现的。
RPC调用本质上是一种协议,允许一台计算机上的程序在另一天计算机上执行代码,而无需程序员明确编写此交互的代码。RPC类似于调用不同系统中可用的函数或方法,因此叫做远程过程调用。
RPC的一个显著特点是它能够掩盖网络接口的复杂性,使得开发人员可以专注于应用程序的功能,而无需深入研究网络协议的复杂性。
2. RPC的流程
- 客户端调用客户端stub(client stub),这个调用是在本地,并交调用参数push到栈(stack)中
- 客户端stub(client stub)将这些参数包装,并通过系统调用发送到服务端机器。打包的过程叫做marshalling。
- 客户端本地操作系统发送信息到服务器(可通过自定义TCP协议或者HTTP传输)
- 服务器将信息传送至服务端stub(server stub)
- 服务端stub(server stub)解析信息。该过程叫做unmarshalling
- 服务端stub(server stub)调用程序,并通过类似的方式返回给客户端

3. RPC实践
RPC实践,主要是以gRPC为例进行实践,因为我用的是go语言,所以选择的是grpc-go来进行实践。
gRPC的原理图如下,具体可参考:Introduction to gRPC

具体可以参考:gRPC for Go Quick Start
可以直接按照官方文档提供的步骤来,先完成前置条件,安装好protoc-gen-go和progoc-gen-go-grpc即可。
然后编写proto文件
syntax = "proto3";
option go_package="go-study/blogs/grpc_study/helloworld/hello";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";package helloworld;// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}
使用protoc直接生成对应的pb文件即可,具体的命令:
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative hello.proto
生成的文件如下:

最后我们主要使用hello_grpc.pb.go文件里面对应的Client和Server的方法即可。
关于client和server的代码,可以参考:grpc-go examples helloworld
分别运行client和server,当client运行时会发送消息给server,收到消息后,server会处理消息并返回响应。
$ go run .\server.go
2024/07/14 15:42:30 server listening at [::]:50051
2024/07/14 15:42:42 Received: testing$ go run .\client.go --name=testing
2024/07/14 15:42:42 Greeting: Hello testing
4. RPC与REST的区别
RPC与REST是API设计中的两种不同的架构风格。API则是允许两个软件组件使用一组定义和协议相互通信的机制。软件开发人员使用之前开发的组件或者第三方的组件来执行功能,因此不必从头开始编写所有内容。RPC API允许开发人员在外部服务器中调用远程函数,就好像它们在本地环境一样。
4.1 RPC与REST的相似之处
- 抽象
- 虽然网络通信是API的主要目标,但较低级别的通信本身是从API开发人员那里抽象出来的,这使得开发人员可以专注与功能而不是技术实施。
- 交流
- REST与RPC均可使用HTTP作为底层数据传输协议,RPC和REST中最常见的消息格式是JSON和XML。
- 跨语言兼容性
- 开发人员可以使用任何语言实现RESTful或者RPC API,只要API的网络通信元素符合RESTful或者RPC接口标准,就可以使用任何编程语言编写逻辑代码。
4.2 RPC与REST的架构原则
在RPC中,客户端在服务器上进行远程函数(也称为方法或过程)调用,通常在调用期间会向服务器传递一个或者多个数据值。
而REST客户端则是请求服务器针对服务器特定资源执行操作,操作仅限于创建、读取、更新和删除,并以HTTP动词或者HTTP方法的形式传达。
RPC侧重函数或操作,而REST侧重于资源或对象。
RPC原则:
- 远程调用
- RPC调用是由客户端对远程服务器上的函数进行的,就像该函数是在本地调用到客户端一样
- 传递参数
- 客户端通常向服务器函数发送参数,与本地函数大致相同
- 存根(stub)
- 函数存根同时存在于客户端和服务器上,在客户端上,它进行函数调用,在服务器上,它调用实际函数。(这个在hello world的实践处也可以看到,对于Client发送请求,进行的是定义好的pb函数的调用,而服务端启动的时候,是注册了服务的方法,而这个方法就是实际函数。)
REST原则
- 客户端-服务器
- REST的客户端与服务器架构将两者分离开来,即将客户端和服务器视为独立系统
- 无状态
- 服务器不会保留两次客户端请求之间的客户端记录
- 可缓存
- 客户端或者中间件系统可能会根据客户端是否指定了可以缓存的响应来缓存服务器响应
- 分层系统
- 中间系统可以存在于客户端与服务器之间,而客户端与服务器对中间系统无感知,像是它们之间连在一起一样
- 统一接口
- 客户端和服务器通过一组标准化指令和消息收发格式与REST API通信
4.3 RPC与REST的主要区别
- 开发时间
- RPC与REST诞生时间不同
- 操作格式
- REST拥有一套标准化服务器操作,但RPC API没有,某些RPC实施为标准化操作提供了框架
- 数据传递格式
- REST可在统一API内传递任何数据格式和多种格式的数据,RPC API的数据格式则由服务器选择,在实施过程中是固定的。
- 状态
- REST系统始终是无状态的,但RPC系统可以有状态,也可以无状态,具体取决于设计
当下REST API已经成为了主流,因为它更易于开发人员理解和实施,但RPC并没有消失,依然会在适合的应用场景中使用(如gRPC,允许客户端与服务器之间流式通信,而非请求和相应数据交换模式)。
5. RPC与服务发现
为了高可用,在生产环境中服务提供方都是以集群的方式对外提供服务,集群里面的这些IP随时会发生变化,此时我们需要能够实时获取对应服务节点,而这个获取的过程我们称作“服务发现”。
5.1 以zookeeper为服务注册中心
类似于Dubbo,采用的是以Zookeeper作为服务注册中心,注册中心在RPC场景下负责保存服务端应用的信息,服务端注册接口信息和自身地址到注册中心,客户端从注册中心读取和订阅需要调用的地址列表,框架如图所示:

5.2 以etcd为服务注册中心
在etcd中,etcd提供了一个gRPC解析器来支持备用名称系统,该系统从etcd获取端点以发现gRPC服务,底层基于监听以服务名称为前缀的秘钥更新机制实现。
具体实现则是通过etcd提供的etcdnaming的能力实现获取对应的grpc resolver,从而获取到对应的存储在etcd的服务器信息,从而获取到服务器的请求地址。
import ("go.etcd.io/etcd/client/v3"etcdnaming "go.etcd.io/etcd/client/v3/naming/resolver""google.golang.org/grpc"
)func main() {cli, err := clientv3.NewFromURL("http://localhost:2379")if err != nil {// ...}builder, err := etcdnaming.NewBuilder(cli)if err != nil {// ...}conn, gerr := grpc.Dial("my-service", grpc.WithResolvers(builder), grpc.WithBlock(), ...)
}
而对应的管理服务端点以及添加/删除服务端点则是通过操作etcd来实现。
添加端点
ETCDCTL_API=3 etcdctl put my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'
删除端点
ETCDCTL_API=3 etcdctl del my-service/1.2.3.4
使用租约注册端点
使用租约注册端点可以确保如果主机无法保持活动心跳(例如,机器发生故障),它将从服务中删除。
lease=`ETCDCTL_API=3 etcdctl lease grant 5 | cut -f2 -d' '`
ETCDCTL_API=3 etcdctl put --lease=$lease my-service/1.2.3.4 '{"Addr":"1.2.3.4","Metadata":"..."}'
ETCDCTL_API=3 etcdctl lease keep-alive $lease
通过etcd加持gRPC可以实现RPC服务的注册发现,从而使得服务在保证高可用的情况下,RPC服务请求调用也能顺利完成。
6. 小结
很早之前就接触过RPC,也接触过服务的注册与发现,最早是学习Java的时候接触的Dubbo,工作后转到了Go,最近是看到了有etcd+gRPC的使用,带着看一看的想法就把RPC顺带着给一起复习下了。
在当下的分布式系统的情况下,RPC服务基本都需要考虑高可用,所以注册中心就成为了必须要解决的一个问题。
参考
- Remote procedure call
- 服务注册发现
- RPC与REST的区别
- gRPC命名和发现 - etcd
相关文章:
RPC与服务的注册发现
文章目录 1. 什么是远程过程调用(RPC)?2. RPC的流程3. RPC实践4. RPC与REST的区别4.1 RPC与REST的相似之处4.2 RPC与REST的架构原则4.3 RPC与REST的主要区别 5. RPC与服务发现5.1 以zookeeper为服务注册中心5.2 以etcd为服务注册中心 6. 小结参考 1. 什么是远程过程调用(RPC)?…...
3112. 访问消失节点的最少时间 Medium
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点࿰…...
FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息
前面我们发送的大多数都是text类型的消息,对于text消息来说,后端处理出来要麻烦的多,那么我们可以不可以传递json格式的数据,对于前后端来说都比较友好,答案是肯定的,我们需要做下处理。 首先,…...
Go语言并发编程-案例_3
案例 并发目录大小统计 业务逻辑 统计目录的文件数量和大小(或其他信息)。示例输出: // 某个目录:2637 files 1149.87 MB 实现思路 给定一个或多个目录,并发的统计每个目录的size,最后累加到一起。 当…...
pikachu之跨站脚本攻击(x‘s‘s)
1get型 输入a看一下 接着输入<a> 发现<>没有被过滤当做标签处理了 尝试在表单提交的框里面,输入xss语句 尝试输入<script>alert(1)</script> 发现有长度限制 因为这里是get请求 get请求的特点是:传参是在url中的 所以我们可以在…...
Qt模型/视图架构——委托(delegate)
一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…...
python3.11SSL: SSLV3_ALERT_HANDSHAKE_FAILURE
参考:python request包 版本不兼容 报错sslv3 alert handshake failure 解决方法-CSDN博客 修改:Python311\Lib\site-packages\urllib3\util\ssl_.py 新版本3.11里默认没有DEFAULT_CIPHERS 补回来: #__imported from 3.6.8 # A secure default. # So…...
[深度学习]基于yolov10+streamlit目标检测演示系统设计
YOLOv10结合Streamlit构建的目标检测系统,不仅极大地增强了实时目标识别的能力,还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法,能够快速准确地识别图像中的多个对象,并标注…...
开源模型应用落地-FastAPI-助力模型交互-进阶篇(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
机器人及其相关工科专业课程体系
机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科,涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…...
C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定
数字医学影像系统(RIS/PACS)源码,三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术:C/S架构,C#开发语言,数据库服务器采用Oracle数据库。 医学影像存储与传输系统,融合了医学信息化…...
Spring-Boot基础--yaml
目录 Spring-Boot配置文件 注意: YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件,但是spring-Boot中还是存在.prope…...
C/C++蓝屏整人代码
文章目录 📒程序效果 📒具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 📒代码详解 🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主&a…...
【Android安全】Ubuntu 下载、编译 、刷入Android-8.1.0_r1
0. 环境准备 Ubuntu 16.04 LTS(预留至少95GB磁盘空间,实测占94.2GB) Pixel 2 XL 要买欧版的,不要美版的。 欧版能解锁BootLoader、能刷机。 美版IMEI里一般带“v”或者"version",这样不能解锁BootLoader、…...
HBuilder X3.4版本中使用uni-app自定义组件
HBuilder X3.4版本中使用uni-app自定义组件 这是我的小程序页面结构 方式一:导入components 1.创建componets文件,并编写你的组件页面 <template><view class"my-search-container"><!-- 使用 view 组件模拟 input 输入框的样…...
PHP基础语法(一)
一、初步语法 1、PHP代码标记:以 <?php 开始,以 ?> 结束; 2、PHP注释:行注释://(双斜杠)或# 块注释:/* */ 3、PHP语句分隔符: 1)在PHP中&#…...
Python项目打包与依赖管理指南
在Python开发中,python文件需要在安装有python解释器的计算机的电脑上才能运行,但是在工作时,我们需要给客户介绍演示项目功能时并不一定可以条件安装解释器,而且这样做非常不方便。这时候我们可以打包项目,用于给客户…...
矿产资源潜力预测不确定性评价
研究目的: 不确定性评估: 到底什么叫不确定性,简单来说就是某区域内的矿产资源量,并不确定到底有多少,你需要给出一个评估或者分布。 研究方法: 1.以模糊集来表示某些量: 关于什么是模糊集&am…...
食堂采购系统开发:从需求分析到上线实施的完整指南
本篇文章,笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程,旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括: -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…...
C++ 数据结构
C 数据结构 引言 数据结构是计算机科学中的一个核心概念,它涉及到如何在计算机中组织和存储数据,以便高效地进行数据访问和修改。C作为一种高效的编程语言,提供了丰富的内置数据类型和库,支持各种复杂的数据结构实现。本文将探讨…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
