Go微服务:基于net/rpc模块实现微服务远程调用

Go中RPC远程过程调用的实现 在前面的课程《Go语言微服务理论与实践课程》课程中,我们已经学习了微服务的理论知识,了解了微服务实践中需要解决哪些问题。从本篇技术文档开始,我们进入新的微服务内容的学习。在本系列课程中,我们会着重讲框架的内容,主要包括两个:gRPC框架、go-micro框架。首先来学习gRPC框架相关的内容。在上述本地过程调用的例子中,我们是在一台计算机上执行了计算机上的程序,完成调用。随着计算机技术的发展和需求场景的变化,有时就需要从一台计算机上执行另外一台计算机上的程序的需求,因此后来又发展出来了RPC技术。 阅读详情

基于RPC协议实现微服务

  • 基于rpc实现跨语言调用,不限定服务提供方使用的语言
  • 在微服务架构中,每个微服务都被封装成了进程,相互独立
  • 在这里提供了客户端和服务端演示调用示例

1 )服务端

  • 新建 server/msg 目录,后执行 $ go mod init msg
  • 编辑 server/msg/main.go 文件
    package main
    
    // net 模块是go内置模块
    import (
    	"fmt"
    	"net"
    	"net/rpc"
    )
    
    // 定义一个可供远程调用的struct
    type Msg struct {}
    
    // 为Msg这个struct添加被调用函数 GetReplay
    func (this Msg) GetReplay(req string, res *string) error {
    	fmt.Println(req) // 服务端输出日志:请求参数
    	*res = "这是服务端返回的信息:已收到客户端的请求参数,参数为:" + req // 这是返回信息
    	return nil
    }
    
    func main() {
    	// 1. 注册RPC服务
    	err1 := rpc.RegisterName("msg", new(Msg))
    	// 错误处理
    	if err1 != nil {
    		fmt.Println(err1)
    	}
    	// 2、监听端口
    	listener, err2 := net.Listen("tcp", "127.0.0.1:3000")
    	if err2 != nil {
    		fmt.Println(err2)
    	}
    	// 3、应用退出的时候关闭监听端口
    	defer listener.Close()
    	for {
    		// 4、建立链接
    		conn, err3 := listener.Accept()
    		// 错误处理
    		if err3 != nil {
    			fmt.Println(err3)
    		}
    		fmt.Print("客户端参数为: ");
    		// 5. 绑定服务
    		rpc.ServeConn(conn)
    	}
    }
    
  • net包是一个 go 内置的一个模块
  • 准备调用函数 Msg.GetReplay
    • 此方法只能有两个可序列化的参数,注意第二个参数是指针类型
      • req 表示获取客户端传过来的数据
      • res 表示给客户端返回数据 (指针类型)
    • 方法要返回一个 error 类型,同时必须是公开的方法
    • req 和 res的类型不能是 channel(通道)、func(函数)
    • 因为它们均不能进行序列化
  • 整个流程如下:
    • 1 )通过 rpc.RegisterName 注册 rpc 服务,注意这里的 name 后期被客户端调用
    • 2 )通过 net.Listen 监听rpc服务,得到 listener 对象
    • 3 )通过 defer listener.Close() 应用退出时关闭监听端口
    • 4 )基于无限循环做响应处理,这里有两个环节
      • 4.1 )通过 listener.Accept() 接收连接信息,得到 conn 连接对象
      • 4.2 )通过 rpc.ServeConn(conn) 绑定服务

3 )客户端

  • 新建 client 目录,后执行 $ go mod init client

  • 这里在 client 项目目录中,新建一个 main.go 文件

  • 编辑 client/main.go 文件

    package main
    
    import (
    	"fmt"
    	"net/rpc"
    )
    
    func main() {
    	// 1. 用 rpc.Dial和rpc微服务端建立连接
    	conn, err1 := rpc.Dial("tcp", "127.0.0.1:3000")
    	// 错误处理
    	if err1 != nil {
    		fmt.Println(err1)
    	}
    	// 2、当客户端退出的时候关闭连接
    	defer conn.Close()
    	// 3. 调用远程函数
    	var reply string
    	err2 := conn.Call("msg.GetReplay", "滴滴滴", &reply)
    	// 错误处理
    	if err2 != nil {
    		fmt.Println(err2)
    	}
    	// 4、获取微服务返回的数据
    	fmt.Println(reply)
    }
    
  • 这里是客户端,需要经过以下几个步骤:

  • 1 )要连接的话,首先要建立连接 rpc.Dial 得到 conn 连接对象

  • 2 )添加客户端退出时的关闭连接处理 defer conn.Close()

  • 3 )基于 conn.Call 调用远程函数

    • 第一个参数,服务名.远程方法 的字符串形式
    • 第二个参数,给服务端的参数
    • 第三个参数,服务端返回的数据地址

3 )部署服务

  • 先启动服务端,再启动客户端
  • 当服务端启动的瞬间
    • 服务端接收到客户端的参数打印到服务端
    • 客户端接收到服务端的返回信息

注意

  • 在Golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持
  • Go RPC 可以利用tcp或http来传递数据,可以对要传递的数据使用多种类型的编解码方式
  • Golang 官方的 net/rpc 库使用 encoding/gob 进行编解码,支持tcp或http数据传输方式
  • 由于其他语言不支持 gob 编解码方式,所以使用 net/rpc 库实现的 RPC 方法没办法进行跨语言调用
  • 另外,Golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法,JSON RPC采用JSON进行数据编解码
  • 因而支持跨语言调用,但目前的 jsonrpc 库是基于tcp协议实现的,暂时不支持使用http进行数据传输
  • 除了Golang官方提供的rpc库,还有许多第三方库为在 Golang 中实现RPC提供支持
  • 大部分第三方 RPC 库的实现都是使用 protobuf 进行数据编解码
  • 根据 protobuf 声明文件自动生成 RPC 方法定义与服务注册代码
  • 在 Golang 中可以很方便的进行 RPC 服务调用
go实战微服务:微服务与RPC中间件 捕获系统信号以便在程序终止前进行清理工作。同时处理多个信号,并响应不同的逻辑。自定义信号处理器,增强对信号的控制。在接收关闭信号后,通过延迟一段时间来等待未完成的请求。使用中间件或其他方法记录活动连接,在关闭时检查并等待它们完成。在负载均衡环境中,将流量渐进减少到零。使用Go内置的HTTP包快速构建一个静态文件服务器。在请求图片时进行动态处理,如调整大小或格式转换。在多节点上存储和缓存图片,以提高可用性和性能。使用简单的正则表达式或内置包验证输入。使用开源库如validator进行复杂验证。 阅读详情

相关推荐

宇树智能人形机器人模块化腿部动力系统技术拆解

o电机防摔防护板(3.1.5.1)→端盖总成(3.1.5.2)→电机外壳(3.1.5.4)的冲击力传递路径;o散热风扇(3.1.3.1)推动冷风→大腿基座腔体→散热片组(3.1.5.7)→中空大腿杆排出;o防御专利:覆盖“关节热管理风道接口标准”、“抗冲击结构身份编码”;o大腿杆腔体(3.1.3.4)内置反平行四边形机构,避免连杆外露。:力传感器(3.1.8.4.2)仅部署于足端,缺失关节力矩反馈。:更换行星减速器(3.1.5.5)需拆解整个电机模块;o热量传导路径:电机定子→外壳→散热片组。

weixin_50955533的博客 1233

golang实现rpc方法一:使用net/rpc库【不能跨平台】

通过官方库net/rpc实现rpc远程进程调用非常方便,并且实现还是比较简单的,但是有一个缺点就是不能跨平台。

lianxuhanshu_的博客 1155

Virtualbox “Kernel driver not installed (rc=-1908)”问题全面解析与修复指南

本文全面解析了Virtualbox出现'Kernel driver not installed (rc=-1908)'错误的原因及修复方法。详细介绍了如何通过重新安装virtualbox-dkms、处理Secure Boot特殊情况等步骤解决该问题,并提供了预防措施与最佳实践,帮助用户避免类似错误再次发生。

weixin_30352645的博客 530

微服务:何为RPC框架

最近在看有关分布式和微服务的知识,首先第一个碰到的就是RPC框架,常见的RPC框架其实有很多,比较常见的比如:阿里的Dubbo、ApacheThrift、谷歌的gRPC、腾讯的tRPC等等。RPC作为远程调用协议在微服务架构中可以说是比较常见了,而在学习整个微服务组件生态之前,我们还是需要学习一些理论知识。下面的这篇文章荔枝主要梳理有关RPC的基础知识,希望这篇文章能对有需要的小伙伴有帮助~~~

荔枝当大佬的博客 1714

DeepBSA实战指南:从安装到基因组分析的全流程解析

本文详细解析了DeepBSA工具从安装到基因组分析的全流程,特别介绍了其简化生物信息学分析的'一键式'操作和独家深度学习算法。通过实战案例展示了DeepBSA在信噪比处理和QTL定位上的优势,并提供了Linux和Windows系统的安装避坑指南、数据预处理技巧以及算法选择建议,帮助用户高效完成基因组分析。

weixin_28732953的博客 443

算法之动态规划(DP)求解完全背包问题

算法之动态规划(DP)求解01背包问题 上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。 1、什么是完全背包问题? **01背包问题:**有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少? 完全背包: 有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和

PRML_MAN的博客 2万+

Go 云原生应用实战系列(二)

本章节我将专注于开发第一个微服务系统,我们将学会如何用go chassis开发微服务并完成微服务之间的调用 开发你的第一个微服务 启动注册中心 docker run -d -p 30100:30100 servicecomb/service-center 强烈推荐直接使用all in one的docker compose模板启动,因为可以使用可视化的UI界面。  https://github.com/go-chassis/go-chassis/blob/master/examp..

微服务技术与实践专栏 451

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1813

微服务之Go-Micro(六)GRPC调用

工具下载 protobuf https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protoc-3.13.0-win64.zip Window 下安装: Linux 安装 tar -xvf protobuf cd protobuf ./configure --prefix=/usr/local/protobuf make make check make install 如遇报错,则需升级gcc: e.

JaysenLeo 652

含分布式光伏的IEEE 33节点配电网电压越限仿真分析

摘要 本文针对分布式光伏接入配电网引发的电压越限问题,基于IEEE 33节点系统开展仿真研究。首先分析了光伏出力的随机性和波动性特性,采用Beta分布和马尔可夫链方法建立光伏出力模型;其次在MATLAB/Simulink平台搭建完整测试系统,包含光伏模型、配电网线路模型和控制模块;最后通过多场景仿真定量分析了不同光伏渗透率和接入位置对节点电压的影响。结果表明:光伏渗透率提高会显著增加电压越限风险,特别是线路末端节点;光伏接入位置对电压分布具有决定性影响,馈线末端接入更易引发电压越限。研究为含高比例光伏的配电

huanghm88的专栏 322

测绘程序设计——试题一:出租车轨迹数据计算

仅展示试题1的原文,如需了解其余内容,请自行购买图书李老师著作主页-http://ybli.users.sgg.whu.edu.cn/book/

chengzilhc的博客 892

GO-Grpc微服务开发六 网关和http调用

GO-Grpc微服务开发六 网关和http调用proto文件定义将定义的proto编译为go文件网关中注册服务http请求 proto文件定义 syntax = "proto3"; package kibana; //引入google api实现http转rpc import "google/api/annotations.proto"; //service name is kibana serv...

找不到我的路 3685

黑猫带你学eMMC协议第22篇:emmc可靠写详解(Write Reliability)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有部分错误请留言。 本文部分内容可能源自网络,侵删。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、什么是可靠性写属性(Write Reliability)? 2、可靠写和普通的写有什么区别? 3、设置可靠写的流程及流程框图。 4、可靠写需要遵循哪些规则? 1.3 参考链接 本文主要参考链接:http://www.up48.com/cn/support/8_37.html 2 什么

黑猫奥利奥的博客 3125

[golang 微服务] 2. RPC架构介绍以及通过RPC实现微服务

RPC架构介绍以及通过RPC实现微服务,net/rpc库实现远程调用,使用tcp作为RPC的载体实现远程调用具体案例,net/rpc/jsonrpc库以及RPC跨语言调用

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 3455

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Go微服务(一)——RPC详细入门

RPC是远程过程调⽤的简称,是分布式系统中不同节点间流⾏的通信⽅式。在互联⽹时代,RPC已经 和 IPC⼀样成为⼀个不可或缺的基础构件。因此Go语⾔的标准库也提供了⼀个简单的RPC实现,我们 将以此为⼊⼝学习RPC的各种⽤法。Go语⾔的RPC包的路径为net/rpc,也就是放在了net包⽬录下⾯。因此我们可以猜测该RPC包是建⽴ 在net包基础之上的。在第⼀章“Hello, World”⾰命⼀节最后,我们基于http实现了⼀个打印例⼦。下⾯ 我们尝试基于rpc实现⼀个类似的例⼦。 其中Hello⽅法必须满⾜

脑袋装水的博客 4757

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

golang的rpc使用/ go实现简单的基础的微服务

在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。 golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。 golang官方还提供了net/rpc/jsonrpc库实现RPC方法,JSON RPC采用JSON进行数据编...

u013862108的博客 1027

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用

Golang 提供库来实现rpc方法采用 json 方式进行数据编解码,支持跨语言调用这里演示了,基于go语言为服务端,nodejs 和 golang 为客户端的3种示范注意,上面 nodejs版本中的 params 的格式与 golang 中的区别标准库的RPC默认采用Go语言特有的gob编码,没法实现跨语言调用golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法JSON RPC采用JSON进行数据编解码,因而支持跨语言调用。

Wang的专栏 1682

golang入门学习--微服务2.0:认识微服务 RPC简介go实现RPC

认识微服务 RPC简介go实现RPC

weixin_43761212的博客 1133

Golang 使用RPC

RPC介绍 远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。 RPC是一种通讯网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 RPC是远程过程调用,其...

skh2015java的博客 582

Go七天实现RPC

比如我们想统计一下下游每个接口调用的耗时、超时、异常情况,这个时候就使用rpc框架非常方便了,因为大多数的rpc框架都会提供一个事件或者钩子给我们,我们就能很方便的做这些事情。而现在大部分的系统都是给浏览器使用的,因此HTTP协议必不可少,一些小公司用HTTP也容易搭建自己的架构,成本也低,也好维护。一般而言,RPC 是微服务框架的一个子集,微服务框架可以自己实现 RPC 部分,当然,也可以选择不同的 RPC 框架作为通信基座。一般来说,RPC的性能比HTTP会更强,大多数RPC框架也提供了很多功能,

m0_57408211的博客 1232

go微服务-go语言实现RPC编程

go语言实现RPC编程 文章目录go语言实现RPC编程RPC官方库net/rpc库实现RPC调用编程一、服务定义及暴露二、注册服务及监听请求三、客户端调用多参数的请求调用参数传递 RPC官方库 在Go语言官方网站的pkg说明中,提供了官方支持的rpc包,具体链接如下:https://golang.org/pkg/net/rpc/。官方提供的rpc包完整的包名是:net/rpc。 net/rpc库实现RPC调用编程 rpc调用有两个参与者,分别是:客户端(client)和服务器(server)。 首先是

qq_49723651的博客 689

Go语言微服务框架实战:2.Go语言实现RPC编程绍

Go语言实现RPC编程 @author:Davie版权所有:北京千锋互联科技有限公司 上节课我们对RPC知识做了介绍,讲解了RPC的原理,通过图示方式讲解了RPC的内部执行过程。本节课,我们继续来学习RPC相关的内容。 RPC官方库 在Go语言官方网站的pkg说明中,提供了官方支持的rpc包,具体链接如下:https://golang.org/pkg/net/rpc/。官方提供的rpc包...

qfliweimin的博客 710

【Go微服务二】go RPC使用教程

RPC RPC简介 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求 服务,而不需要了解底层网络技术的协议。 简单来说,就是跟远程访问或者web请求差不多,都是一个client向远端服务器请求服务返回结果,但是web请求使用的网络协议是http高层协议,而rpc所使用的协议多为TCP,是网络层协议,减少了信息的包装,加快了处理速度。 golang本身有rpc包,可以方便的使用,来构建自己的rpc服务,下边是一个简单是实例,可以

weixin_43173303的博客 1558

Go-Zero框架上手前奏3: 深入理解 RPC 通信与 Go net/rpc 实践

RPC(远程过程调用)是一种让跨机器服务调用像本地函数调用一样简单的通信机制,其核心在于屏蔽网络通信细节。本文首先阐述了RPC的基本概念,包括Stub在序列化/反序列化中的关键作用;接着分析了RPC通信需要解决的四个核心问题:服务寻址、方法标识、数据传输格式和协议选择;然后对比了RPC与RESTful的区别,指出RPC更适用于微服务内部的高效通信;最后以Go的net/rpc包为例,展示了服务端和客户端的实现要点,包括方法签名规范、请求/响应结构体设计等。通过这种机制,系统可以像调用本地函数一样调用远程服务,

Wang的专栏 337

RPC原理与Go RPC详解

RPC(Remote Procedure Call),即远程过程调用。它允许像调用本地服务一样调用远程服务。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。首先与RPC(远程过程调用)相对应的是本地调用。

m0_63230155的博客 2000
上一篇: 前端架构: 脚手架通用框架封装之添加测试框架(教程六)
下一篇: Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值