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

golang学习笔记27——golang 实现 RPC 模块 首先,我们定义一个简单的服务,用于执行数学运算。import ("errors""net/http""net/rpc"// Args 用于传递请求参数A, B int// MathService 数学运算服务// Add 加法运算return nil// 注册服务// 开启 HTTP 服务if err!= nil {panic(err)在上述代码中,我们定义了一个MathService结构体,其中Add方法用于执行加法运算。 阅读详情

概述

  • Golang 提供 net/rpc/jsonrpc 库来实现rpc方法
  • 采用 json 方式进行数据编解码,支持跨语言调用

这里实现跨语言示例


1 )go 服务端

package main  
  
import ( 
	"log"  
	"net"  
	"net/rpc"  
	"net/rpc/jsonrpc"
)  
  
// 定义服务接口  
type Arith int  
  
// 定义接口方法,参数和返回值都应该是指针类型  
func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	log.Print("参数", args)
	return nil  
}  
  
// Args 是传递给服务的参数结构  
type Args struct {  
	A, B int  
}  
  
func main() {  
	arith := new(Arith)  
	rpc.Register(arith)  
  
	l, err := net.Listen("tcp", ":1234")  
	if err != nil {  
		log.Fatal("listen error:", err)  
	}  
	defer l.Close()  
  
	for {  
		conn, err := l.Accept()  
		if err != nil {  
			log.Print("accept error:", err)  
			continue  
		}  
  
		// 使用 jsonrpc 包处理连接  
		go func() {  
			jsonrpc.ServeConn(conn)  
			conn.Close()  
		}()  
	}  
}

2 )nodejs 客户端1

const net = require('net');  
const readline = require('readline');  
  
// 创建一个 TCP 客户端  
const client = new net.Socket();  
  
// 连接到服务器  
client.connect(1234, 'localhost', () => {  
  console.log('Connected to server!');  
  
  // 发送请求到服务器  
  const request = JSON.stringify({  
    jsonrpc: "2.0",  
    method: "Arith.Multiply",  
    params: [{ A: 7, B: 8 }],  
    id: 1  
  });  
  
  client.write(request + '\n');  
});  
  
// 处理从服务器返回的数据  
const rl = readline.createInterface({  
  input: client,  
  output: process.stdout,  
  terminal: false  
});  
  
rl.on('line', (line) => {  
  const response = JSON.parse(line);  
  console.log('Server response:', response.result);  
  client.end();  
});  
  
client.on('error', (err) => {  
  console.error('Socket error:', err);  
});  
  
client.on('close', () => {  
  console.log('Connection closed');  
});

3 )nodejs 客户端2

const jayson = require('jayson');  
const client = jayson.client.tcp({  
  port: 1234,  
  host: 'localhost'  
});  
  
// 定义要调用的方法以及参数  
const request = {  
  jsonrpc: "2.0",  
  method: "Arith.Multiply",  
  params: [{ A: 7, B: 8 }],  
  id: 1  
};  
  
// 发送请求并处理响应  
client.request(request, function(err, response) {  
  if (err) {  
    console.error('请求出错:', err);  
    return;  
  }  
    
  console.log('服务器响应:', response.result); // 输出乘法的结果  
});

4 )go 客户端3

package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)

type Args struct {  
	A int `json:"A"`  
	B int `json:"B"`  
}  

func main() {
	// 1. 用 net.Dial和rpc微服务端建立连接
	conn, err1 := net.Dial("tcp", "127.0.0.1:1234")
	if err1 != nil {
		fmt.Println(err1)
	}
	// 2. 当客户端退出的时候关闭连接
	defer conn.Close()

	// 3、建立基于json编解码的rpc服务
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))

	// 4. 调用远程函数
	var reply int
	err2 := client.Call("Arith.Multiply", Args{A: 7, B: 8}, &reply)
	if err2 != nil {
		fmt.Println(err2)
	}
	// 5. 获取微服务返回的数据
	fmt.Println(reply)
}

总结

  • 这里演示了,基于go语言为服务端,nodejs 和 golang 为客户端的3种示范
  • 注意,上面 nodejs版本中的 params 的格式与 golang 中的区别
  • 标准库的RPC默认采用Go语言特有的gob编码,没法实现跨语言调用
  • golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法
  • JSON RPC采用JSON进行数据编解码,因而支持跨语言调用
  • 但目前的jsonrpc库是基于tcp协议实现的,暂时不支持使用http进行数据传输
  • 另外,Mac环境,在没有服务端服务时,可用 nc 工具调试客户端
    • $ nc -l 127.0.0.1 1234
  • linux下需要安装, $ yum install -y nc
  • nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉
  • nc命令的主要作用如下:
    • 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
    • 端口的扫描,nc可以作为client发起TCP或UDP连接
    • 机器之间传输文件
    • 机器之间网络测速
人类高质量代码—Golang标准库net/rpc 以上,我们分别从服务端和客户端角度分别对net/rpc库的源码进行了详细的解析,个人认为比较好的设计在于request和response结构体的复用,避免了每次请求都需要创建结构体。 阅读详情

相关推荐

gRPC简介

gRPC 可以使用protobuf作为它的接口定义语言 ( **IDL** ) 和它的底层消息交换格式。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使你更容易创建分布式应用程序和服务。

qq_39280718的博客 943

Go语言JSON-RPC 实战: `net/rpc/jsonrpc` 包的高效使用指南

在现代软件开发中,服务间的通信是一个常见且重要的议题。为了实现服务间的有效通信,多种协议和技术被广泛使用,其中 JSON-RPC 作为一种轻量级的远程过程调用(RPC)协议,因其简单和易于使用而受到许多开发者的青睐。包是 Go 语言标准库中的一部分,提供了使用 JSON-RPC 2.0 协议的客户端和服务器实现。本教程旨在全面介绍如何在 Go 语言中使用包来构建和维护 RPC 服务。本文将详细介绍如何使用。

walkskyer的博客 2134

jsonrpc:通过HTTP的JSON RPC 2.0客户端的简单go实现

用于golang的JSON-RPC 2.0客户端 使用json作为HTTP上的数据格式的rpc客户端的go实现。 该实现基于JSON-RPC 2.0规范: : 支持: 具有任意参数的请求 方便的响应检索 批处理请求 自定义http客户端(例如代理,tls配置) 自定义标题(例如基本身份验证) 安装 go get -u github.com/ybbus/jsonrpc/v2 入门 假设我们要通过http上的rpc-json检索具有特定ID的人员结构。 然后,我们想在更改属性后保存此人。 (这里省略了错误处理) package main import "github.com/ybbus/jsonrpc/v2" type Person struct { ID int `json:"id"` Name string `json:"name"` Age

Go jsonrpc

JSON-RPC是一个无状态且轻量级的远程过程调用传送协议,传输内容使用JSON编解码。 JSON-RPC Golang官方提供了net/rpc/jsonrpc库实现了JSON-RPC,net/rpc/jsonrpc包实现了JSON-RPC协议,实现了net/rpc包的ClientCodec和ServerCodec接口,增加了对JSON数据的序列化和反序列化。 jsonrpc采用JS...

JunChow 835

从ISCXTor2016到CICIDS2017:手把手教你下载和使用UNB的网络安全数据集

本文详细介绍了UNB大学发布的ISCXTor2016和CICIDS2017等网络安全数据集的下载与使用方法,特别适合加密流量识别和网络行为分析研究。文章提供了多种高效获取路径、文件结构解析及实战分析示例,帮助研究者快速上手这些真实场景捕获的精细标注数据集。

weixin_42524945的博客 638

模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

整理的算法模板合集: ACM模板 目录一、树的直径树形DP两次DFS / BFS(找到直径的两个端点)二、动态修改树的边权并求每个时刻的直径(线段树)三、树的重心 一、树的直径 树的直径满足如下性质: 若有多条直径,则所有的直径之间皆有公共点。 直径的两端一定是叶子。 树中距离某一直径端点最远的点,至少有一个是该直径的另一个端点。 对于树上任意一个点,与之距离最远的一个点,至少有一个直径的端点。 给你一个无权无向的树。编写程序以输出该树中最长路径(从一个节点到另一个节点)的长度。在这

繁凡さん的博客 1678

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

这里在 client 项目目录中,新建一个 main.go 文件。编辑 client/main.go 文件。新建 client 目录,后执行 $2 )添加客户端退出时的关闭连接处理。1 )要连接的话,首先要建立连接。

Wang的专栏 1160

电机控制-PMSM无感FOC控制(四)SVPWM——过调制

上一章我们提到了SVPWM矢量合成的范围在一个平面的矢量圆内,那么当电压矢量超出调制范围时,该怎么做呢?这就是过调制要解决的问题。电机控制-PMSM无感foc控制(三)SVPWM据之前讲解的内容我们可以知道,SVPWM技术在电压空间上模拟了一个近似于圆的电压轨迹,减小了相电流的谐波,降低了电机的谐波损耗,抑制了转矩脉动。然而,SVPWM技术也存在一些问题,合成电压矢量有极限便是其中之一。这个半径为√3/3Vdc的区域也被称作SVPWM的线性区域。

zhuxinmingde的博客 1318

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

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

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

计算机组成原理实验二 运算器组成实验

事实上,ALU的设计是在全加器的基础上,对全加器功能的扩展来实现符合要求的多种算术/逻辑运算的功能。为了实现多种功能的运算,An、Bn数据是不能直接与全加器相连接的,它们受到功能变量F3—F1的制约,因此,可由An、Bn数据和功能变量F3-F1组合成新的函数Xn 、Yn,然后,再将Xn 、Yn和下一位进位Cn-1通过全加器进行全加运算以实现所需的运算功能。AC寄存器可用来存储ALU的输入以实现两个操作数的运算操作,也可以用来存储来自ALU的结果,以将这些结果反馈给ALU以进行更多的处理。

qq_63574533的博客 1451

海康威视工业相机SDK二次开发实战:多相机同步采集与图像存储

本文详细介绍了海康威视工业相机SDK二次开发实战,包括多相机同步采集与图像存储的优化方案。通过MVS软件搭建开发环境,实现硬件与软件触发同步采集,并提供高效的图像存储管理技巧,帮助开发者提升工业视觉项目的效率与稳定性。

weixin_29168813的博客 666

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

领域驱动新实践:COLA框架全解析——架构设计与实战案例解析

定义订单支付事件java代码解读复制代码} }Order定义Order类,继承并实现支付逻辑:java代码解读复制代码} }定义接口:java代码解读复制代码定义类,处理订单支付逻辑并持久化:java代码解读复制代码} }定义和处理订单支付事件:java代码解读复制代码} }java代码解读复制代码} }定义和接口及其实现:java代码解读复制代码java代码解读复制代码。

2401_89221445的博客 2665

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

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

weixin_43761212的博客 1133

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1861

小程序设计中的区块链应用:数字藏品实现

本文旨在为开发者提供在小程序中实现区块链数字藏品功能的完整技术方案。区块链与数字藏品的基础概念智能合约的设计与实现小程序与区块链的交互方式数字藏品的完整实现流程文章将从基础概念入手,逐步深入到技术实现层面,最后通过完整项目案例展示数字藏品在小程序中的实现方式。每个技术点都会配合代码示例和架构图进行说明。区块链:一种分布式数据库技术,通过加密算法保证数据不可篡改数字藏品:基于区块链技术的数字资产,具有唯一性和可验证性NFT。

小程序开发 1351

Golang 使用RPC

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

skh2015java的博客 582

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Go网络编程:Go如何通过RPC实现跨平台服务】

Go如何玩转RPC服务

zhw21w的博客 565

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

golang微服务学习(grpc)

golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp和http数据传输方式,由于其他语言不支持gob编解码方式,所以golang的RPC只支持golang开发的服务器与客户端之间的交互。官方还提供了net/rpc/jsonrpc库实现RPC方法,jsonrpc采用JSON进行数据编解码,因而支持跨语言调用,目前jsonrpc库是基于tcp协议实现的,暂不支持http传输方式。函数第一参数是接收参数,第二个参数是返回给客户端的参数,必须是指针类型。函数名必须首字母大写。

weixin_73388622的博客 609

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RPC介绍以及通过RPC实现微服务

在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。Go RPC可以利用tcp或 http 来传递数据,可以对要传递的数据使用多种类型的编解码方式。golang官方的net/rpc库使用 encoding/gob 进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。

分享AI、区块链技术及应用,未来已来 58

Go grpc框架

gRPC(gRPC Remote Procedure Call):gRPC 是一个开源的 RPC 框架,它构建在HTTP/2之上,服务间使用高效的protobuf协议进行RPC调用,使用 Protocol Buffers(ProtoBuf)进行消息序列化。gRPC 提供了一种强类型、高效和多语言支持的远程通信机制。它不仅支持基本的 RPC 调用,还支持流式传输和双向流式传输等高级通信模式。gRPC的优势。

w1834938347的博客 316

03.RPC支持Json

标准库的RPC默认采用Go语言特有的gob编码,因此从其它语言调用Go语言实现的RPC服务将比较困难。 在互联网的微服务时代,每个RPC以及服务的使用者都可能采用不同的编程语言,因此跨语言是互联网时代RPC的一个首要条件。 得益于RPC的框架设计,Go语言的RPC其实也是很容易实现跨语言支持的。 Go语言的RPC框架有两个比较有特色的设计:一个是RPC数据打包时可以通过插件实现自定义的编码和解码;另一个是RPC建立在抽象的io.ReadWriteCloser接口之上的,我们可以将RPC架设在不同的通讯协议.

apple_56973763的博客 289

Golang学习 Day_20 微服务架构

Golang学习 Day_20 微服务架构

qq_52423136的博客 127

GRPC初识

部分参考:gRPC快速入门 | 李文周的博客 (liwenzhou.com) gRPC · Go语言中文文档 (topgoer.com) RPC RPC算是近些年比较火热的概念了,随着微服务架构的兴起,RPC的应用越来越广泛。本文介绍了RPC和gRPC的相关概念,并且通过详细的代码示例介绍了gRPC的基本使用。 在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一

qq_46954819的博客 556

GitHub Copilot SDK:多语言Agent协议栈与跨运行时协同实践

Agent开发已从单语言提示工程迈入多语言运行时协同新阶段。其核心是将AI能力解耦为可编排、可观测、可测试的工具契约,依赖JSON-RPC 2.0等标准化协议实现跨语言序列化与上下文传播。技术价值在于突破语言生态边界,构建韧性会话生命周期与分布式工具治理能力;典型应用场景涵盖金融风控、前端智能助手、CLI工程化平台等需强类型校验、全链路Trace和权限分级的生产系统。本文聚焦GitHub Copilot SDK作为协议栈而非SDK的本质,深入解析Transport层抽象、Session远程状态管理及Tool

dieqiao8331的博客 366

golang实现rpc方法二:使用jsonrpc库【跨平台】

jsonrpc库和net/rpc都实现了rpc方法,实现了远程进程调用,区别在于net/rpc是不跨平台的,别的语言没法调用,而jsonrpc是跨平台的,别的语言也可以调用rpc方法。

lianxuhanshu_的博客 1191
上一篇: Go微服务:基于net/rpc模块实现微服务远程调用
下一篇: Go微服务: 基于ProtoBuf实现序列化和反序列化
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、付费专栏及课程。

余额充值