首页 > 其他分享 >GO RPC

GO RPC

时间:2022-11-29 23:35:28浏览次数:32  
标签:err rpc RPC client HelloService GO reply conn

Remote Procedure Call

简单RPC调用

server实现

// 注册接口

type HelloService struct{}

func (s *HelloService) HelloFunc(request string, reply *string) error {
	// 返回值是通过修改Reply的值
	*reply = "Hello, " + request
	return nil
}

func main() {
	// 实例化一个Server对象
	listener, _ := net.Listen("tcp", ":9091")

	// 注册处理逻辑
	_ = rpc.RegisterName("HelloService", &HelloService{})

	// 启动服务 处理请求
	conn, _ := listener.Accept()
	rpc.ServeConn(conn)
}

client实现

func main() {
	// 建立连接
	client, _ := rpc.Dial("tcp", "localhost:9091")

	var reply string
	_ = client.Call("HelloService.HelloFunc", "David", &reply)
	fmt.Println(reply)
}

采用JSON序列化

Go语言RPC序列化协议为Gob,将Gob替换为常见序列化协议JSON,使得能够跨语言调用

修改Server:

func main() {
	// 实例化一个Server对象
	listener, err := net.Listen("tcp", ":9091")
	if err != nil {
		panic(err)
	}

	// 注册处理逻辑
	err = rpc.RegisterName("HelloService", &HelloService{})
	if err != nil {
		panic(err)
	}
	// 启动服务 处理请求
	for {
		conn, _ := listener.Accept()
		go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
	}
}

修改Client:

func main() {
	// 建立连接
	conn, err := net.Dial("tcp", "localhost:9091")
	if err != nil {
		panic("connect failed")
	}

	var reply string
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
	err = client.Call("HelloService.HelloFunc", "David", &reply)
	if err != nil {
		panic("call failed")
	}

	fmt.Println(reply)
}

这样底层就会使用json格式传输数据

基于JSON,可以使用Python进行跨语言调用:

import json
import socket

request = {
    "id": 0,
    "params": ["David"],
    "method": "HelloService.HelloFunc"
}

client = socket.create_connection(("localhost", 9091))
client.sendall(json.dumps(request).encode())

resp = client.recv(1024)
resp = json.loads(resp.decode())
print(resp["result"])

结果:

Hello, David

标签:err,rpc,RPC,client,HelloService,GO,reply,conn
From: https://www.cnblogs.com/N3ptune/p/16937100.html

相关文章

  • 一文了解 Go 标准库 strings 常用函数和方法
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,今天分享的知识是Go标准库——​​strings​​常用函数和方法。如果本文对你有帮助,不妨点个赞,如果你是Go语言初学者......
  • Python 中的 gRPC 文件上传和下载
    通过阅读本文,您将学习如何设置自己的gRPC客户端和服务器以使用Python上传/下载文件。供您参考,gRPC被称为远程过程调用,这是一种现代开放源代码,用于将设备、移动应......
  • 「Goravel 上新」用户授权模块,让你简单的对非法用户 Say No!
    首先,让我们定义一个规则:用户只能访问自己创建的文章。facades.Gate.Define("update-post",func(ctxcontext.Context,argumentsmap[string]any)*access.Response{u......
  • win10 git报错:Unable to negotiate with port: no matching host key type found. The
    现象已经生成id_rsa的密钥,并且在git上进行了配置。但是用gitclone失败。报错:Unabletonegotiatewithport:nomatchinghostkeytypefound.Theiroffer:ssh-rsa。......
  • 【转载】Django models常用字段类型
    models常用字段类型原文模型中的每一个字段都应该是某个Field类的实例,字段类型具有下面的作用:决定数据表中对应列的数据类型(例如:INTEGER,VARCHAR,TEXT)HTML中对......
  • [django]sqlserver配置
    python3.8.8安装mssql-djangopipinstallmssql-djangopiplistPackageVersion-------------------asgiref3.5.2Django3.2.16mssql-django1......
  • go环境搭建及tjfoc-gm安装
    go包安装下载go安装包我预安装的为64位linux安装包随后进入/usr/local文件夹cd/usr/local使用以下指令进行下载go安装包wgethttps://dl.google.com/go/go1.19.3.li......
  • DRF-Django Rest frameWork脉络笔记
    1.Web应用模式在开发Web应用中,有两种应用模式:前后端不分离前后端分离2.api接口为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接......
  • Python后端开发(主Django)面试题
    最近两个后端同事离职了,帮忙面试了些后端开发的实习生,虽然有过一些后端经验,但我不是主要写后端的,复习了下Django也稍微准备了一些主要是Django相关的面试题,数据库相关部分额......
  • Node.js操作MongoDB根据日期Date查询数据
    背景MongoDB里,日期Date类型数据使用的是ISODate,是GMT(格林尼治标准时)时间,而我们处在东八区(比标准时间多8个小时),所以实际转换的时候程序里的时间应该是GMT+8,转换到MongoDB......