GO学习之 远程过程调用(RPC)
GO系列
1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
文章目录
- GO系列
- 前言
- 一、什么是RPC?
- 二、调用示例
- 2.1 服务端
- 2.2 客户端
- 三、RPC 实际应用中的优缺点
前言
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
RPC 在许多应用程序中有着广泛应用,尤其是分布式系统和微服务中,一些场景的应用场景包括:
- 微服务通信: 在微服务框架中,实现各个服务之间的通信使用 RPC 进行通信,以实现服务间的协作和数据传递。
- 分布式系统: 在分布式系统中,不同节点之间需要进行远程调用。
- 高性能计算: 在高性能计算环境中,可以使用 RPC 在不同计算机节点上执行计算任务,以加速并行计算。
- 数据同步: 在不同数据源之间进行数据同步,例如:将数据从一个数据库复制到另一个数据库。
一、什么是RPC?
- RPC 是远程过程调用(Remote Procedure Call, RPC)是一个计算机通信协议。
- RPC 协议允许一台计算机的程序调用另一台计算机的子程序,我程序员无需要额外地为这个交互编程。
- RPC 允许应用程序调用另一个地址空间(通常是远程服务器)上的函数和方法,就像本地调用一样。
- RPC 的核心思想就是使远程调用过程对开发者透明,就像本地调用一样。
二、调用示例
在Go 标准库中包含了net/rpc包,用于实现 RPC 远程调用,所以不用在引入第三方包了。
2.1 服务端
下面代码中,实现了一个 RPC 的服务端,用来提供 RPC 服务,通过
rpc.Register(productService)来注册一个服务,并且通过net.Listen("tcp", ":8899")监听。
package mainimport ("fmt""log""net""net/rpc"
)// 定义一个返回体结构
type Product struct {Id int32Name stringDesc stringPrice float32
}// 定义了一个 RPC 服务,用于返回产品信息
type ProductService struct{}// 定义服务的方法, 参数定义需要定义为传递对象的指针
func (ps *ProductService) FetchProduct(Id *int32, reply *Product) error {p := Product{Id: *Id,Name: "钻石王老五",Desc: "一部手机,能打电话",Price: 5000.00,}// 将产品信息写入 reply 指针*reply = preturn nil
}func main() {// 实例化产品服务productService := new(ProductService)// 注册ProductService 为 RPC 服务rpc.Register(productService)// 启动监听 8899listener, err := net.Listen("tcp", ":8899")if err != nil {log.Fatal("RPC service start fial: ", err)return}defer listener.Close()fmt.Println("RPC service is listening on part 8899...")for {// 接受客户端连接conn, err := listener.Accept()if err != nil {fmt.Println("Error accepting connection: ", err)continue}// 启动一个新的 goroutine 处理连接go rpc.ServeConn(conn)}
}
运行结果:
PS D:\workspaceGo\src\rpc> go run .\rpcServer.go
RPC service is listening on part 8899...
2.2 客户端
以下是 RPC 客户端代码,实现调用服务端代码,并且获得返回信息。代码中通过
rpc.Dial("tcp", "127.0.0.1:8899")调用本地端口 8899,通过client.Call("ProductService.FetchProduct", 1, &result)实现调用,第一个参数为 远程方法名,第二个是方法参数,第三个参数用于接收返回结果。
package mainimport ("fmt""log""net/rpc"
)// 定义一个结构体用户接受数据
type Product struct {Id int32Name stringDesc stringPrice float32
}func main() {// 连接到远程 RPC 服务client, err := rpc.Dial("tcp", "127.0.0.1:8899")if err != nil {log.Fatal("Connect to server fail: ", err)}defer client.Close()var result Product// 调用远程函数 fetchProduct,result 用来获取返回值err = client.Call("ProductService.FetchProduct", 1, &result)if err != nil {log.Fatal("Call remote function fail: ", err)return}fmt.Printf("Result: %v \n", result)
}
运行结果:
PS D:\workspaceGo\src\rpc> go run .\rpcClient.go
Result: {1 钻石王老五 一部手机,能打电话 5000}
PS D:\workspaceGo\src\rpc>
三、RPC 实际应用中的优缺点
优点(不限于):
- 简化分布式系统开发: RPC 隐藏了底层通信细节,使分布式系统开发更加容易。
- 强类型: RPC 使用强类型语言定义接口,可以提前发现类型错误。
- 跨语言: 许多 RPC 框架支持多种编程语言,可以使不同语言开发的应用系统之间通信。
缺点(不限于):
- 增加复杂性: 在分布式系统的开发中,RPC 可能会增加系统的复杂性,例如:调用失败、超时和并发问题等。
- 性能开销: RPC 引入了额外的开销,比如:序列化、反序列化、网络开销等。
现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!
相关文章:
GO学习之 远程过程调用(RPC)
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...
八大排序(四)--------直接插入排序
本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…...
MYSQL--存储引擎和日志管理
存储引擎: 一、存储引擎概念: MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是My…...
VUE之更换背景颜色
1. 确定需求 在实现之前,首先需要明确需求,即用户可以通过某种方式更改页面背景颜色,所以我们需要提供一个可操作的控件来实现此功能。 2. 创建Vue组件 为了实现页面背景颜色更换功能,我们可以创建一个Vue组件。下面是一个简单…...
大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统
国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。 面对大型集团全球化的管理诉求,数字化办公系统作为集…...
Quartz 建表语句SQL文件
SQL文件在jar里面,github下载 https://github.com/quartz-scheduler/quartz/releases/tag/v2.3.2 解压,sql文件路径:quartz-core\src\main\resources\org\quartz\impl\jdbcjobstore tables_mysql_innodb.sql # # In your Quartz propertie…...
nginx SseEmitter 长连接
1、问题还原: 在做openai机器人时,后台使用 SseEmitterEventSource 实现流式获取数据,前端通过 EventSourcePolyfill 函数接收后端的数据,在页面流式输出到页面,做成逐字打稿的效果。本地测试后,可以正常获…...
若依cloud -【 100 ~ 】
100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…...
VPN协议是如何工作的
VPN,全名 Virtual Private Network,虚拟专用网,就是利用开放的公众网络,建立专用数据传输通道,将远程的分支机构、移动办公人员等连接起来。 VPN 通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用…...
c++::作用域符解析
1)当存在具有相同名称的局部变量时,要访问全局变量 2)在类之外定义函数。 class A { } void A::func(){ }A a;a.func();3)访问一个类的静态变量 class A { static int b; } A::b; 4) 如果两个命名空间中都存在一个具有相同名称的类…...
【电源专题】什么是充电芯片的Shipping Mode(船运模式)
现在越来越多电子产品小型化,手持化,这样就需要电池来为产品供电。但电池供电造成的另一个难题就是产品的续航能力的强与弱。 如果想提升续航能力,有一种方法是提高电池容量。如果电池体积没有变化的情况下,可能使用了新型材料、高级技术来增加电池容量,但这势必会增加电池…...
WebGL笔记: 2D和WebGL坐标系对比和不同的画图方式, 程序对象通信,顶点着色器,片元着色器
WebGL 坐标系 canvas2d画布和webgl画布使用的坐标系都是二维直角坐标系,但它们坐标原点、y 轴的坐标方向,坐标基底都不一样canvas2d 坐标系的原点在左上角, x轴朝右,y轴朝下1个单位的宽就是一个像素的宽,1个单位的高就是一个像素…...
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
冒泡排序原理 每次比较两个相邻的元素,将较大的元素交换至右端 冒泡排序执行过程输出效果 冒泡排序实现思路 每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序&…...
多模块和分布式项目
一、什么是多模块项目 多模块项目是一种软件项目组织结构,其中一个大型项目被分成多个独立的子模块或子项目。每个子模块通常具有自己的功能、目录结构和开发周期,但它们可以协同工作以构建一个完整的应用程序。这种项目结构有助于提高代码的可维护性、…...
AI视频剪辑:批量智剪技巧大揭秘
对于许多内容创作者来说,视频剪辑是一项必不可少的技能。然而,传统的视频剪辑方法需要耗费大量的时间和精力。如今,有一种全新的剪辑方式正在改变这一现状,那就是批量AI智剪。这种智能化的剪辑方式能够让你在短时间内轻松剪辑大量…...
vue项目实现地址自动识别功能
1、安装第三方依赖 npm install address-parse 2、在需要使用的页面引入 import AddressParse from address-parse; 3、在页面上写入静态的html代码,可以输入地址,加上识别的输入框; <div class"auto_address"><van-…...
基于springboot财务管理系统springboot006
大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…...
C语言-扫雷游戏的实现
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
七天学会C语言-第七天(结构体)
1.定义结构体 例 1:把一个学生的信息(包括学号、姓名、性别、住址等 4 项信息) 放在一个结构体变量中,然后输出这个学生的信息。 #include <stdio.h>struct Student {int student_id;char name[30];char gender;char address[60]; };int main() …...
《深度学习工业缺陷检测》专栏介绍 CSDN独家改进实战
💡💡💡深度学习工业缺陷检测 1)提供工业小缺陷检测性能提升方案,满足部署条件; 2)针对缺陷样品少等难点,引入无监督检测; 3)深度学习 C、C#部署方案&#…...
历史周期律的动力学本质:集体意识场视角下的文明演进规律
引言 历史周期律——王朝兴替、文明盛衰、社会变革的波浪式重复——是人类文明最令人困惑又最无法回避的现象。从司马迁的“天下大势,分久必合,合久必分”,到汤因比的文明挑战-回应理论,无数先贤试图揭示这一规律的底层逻辑。然而…...
快图设计:5个理由告诉你为什么这款Vue图片编辑器值得尝试
快图设计:5个理由告诉你为什么这款Vue图片编辑器值得尝试 【免费下载链接】vue-fabric-editor 快图设计-基于fabric.js和Vue的开源图片编辑器,可自定义字体、素材、设计模板。fabric.js and Vue based image editor, can customize fonts, materials, de…...
JAVA学习之JAVASE基础
集合列表ListArrayList利用空参创建的集合,在底层创建一个默认长度为0的数组添加第一个元素时,底层会创建一个新的长度为10的数组存满时,会扩容1.5倍一次存多个元素,1.5倍还不够,则新创建的数组长度以实际为准LinkedLi…...
AI助力船舶稳性计算:Gemini3.1Pro设计辅助新思路
在船舶设计工作中,稳性计算一直是非常核心、也非常严谨的环节。无论是新船方案设计、改装评估,还是载况校核,都需要围绕重心、浮心、横稳心、复原力臂、装载状态、自由液面影响等内容进行系统分析。过去这些资料往往分散在规范条文、设计手册…...
双模型工作流架构解析:从原理到实践,构建高效AI应用
1. 项目概述:双模型工作流的魅力与挑战最近在GitHub上看到一个挺有意思的项目,叫cait52099/openclaw-dual-model-workflow。光看名字,openclaw(开放之爪)和dual-model-workflow(双模型工作流)这…...
双模型协同工作流架构解析:从感知到决策的AI工程实践
1. 项目概述:双模型协同工作流的深度解构最近在GitHub上看到一个挺有意思的项目,叫“openclaw-dual-model-workflow”。光看这个名字,就能嗅到一股浓浓的工程实践和架构设计的味道。这不像是一个简单的应用Demo,更像是一个为解决特…...
基于Dify工作流构建游戏客服多智能体协作系统实践
1. 项目概述与核心思路最近在琢磨怎么把大语言模型(LLM)玩出点新花样,特别是结合具体的业务场景。相信不少朋友都体验过游戏里的客服,很多时候要么是预设好的关键词回复,要么就是转人工等半天。我就想,能不…...
高精度电压基准技术:LT6657的创新与应用
1. 高精度电压基准的技术演进与系统需求在精密数据采集系统的设计中,电压基准如同整个系统的"心脏",其稳定性直接决定了测量结果的可靠性。过去二十年里,我参与过数十个工业测量项目,深刻体会到基准源选择对系统性能的致…...
DLSS Swapper:3个技巧彻底改变你的游戏性能优化体验
DLSS Swapper:3个技巧彻底改变你的游戏性能优化体验 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款革命性的游戏性能优化工具,它让你能够轻松管理NVIDIA DLSS、AMD FSR和Int…...
高速接口EMI抑制:共模扼流圈选型与设计实战
1. 高速数据接口中的EMI挑战与共模扼流圈原理在USB3.1 Gen2、HDMI2.1等高速数据接口设计中,信号完整性工程师最头疼的问题莫过于电磁干扰(EMI)。当数据传输速率突破10Gbps时,电缆会变成高效的天线,将共模噪声辐射到周围…...
