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

基于HTTP协议传输

改写server:

func main() {
_ = rpc.RegisterName("HelloService", &HelloService{})
http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
var conn io.ReadWriteCloser = struct {
io.Writer
io.ReadCloser
}{
ReadCloser: r.Body,
Writer: w,
}
_ = rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
})
_ = http.ListenAndServe(":9090", nil)
}

这时在客户端使用HTTP POST请求发送JSON数据即可:

import requests

request = {
"id": 0,
"params": ["David"],
"method": "HelloService.HelloFunc"
} resp = requests.post("http://localhost:9090/jsonrpc", json=request)
print(resp.text)

Go/Python RPC使用的更多相关文章

  1. Python RPC 之 gRPC

    gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...

  2. [Python] RPC实现

    单线程同步 使用socket传输数据 使用json序列化消息体 struct将消息编码为二进制字节串,进行网络传输 消息协议 1 // 输入 2 { 3 in: "ping", 4 ...

  3. Python RPC 不会?不妨看看这篇文章

    1. 前言 大家好,我是安果! RPC,全程为 Remote Procedure Call,是一种进程间的通信方式,它采用「 服务端 / 客户机 」模式,是一种请求响应模型 其中,服务端负责提供服务程 ...

  4. python rpc 的实现

    所谓RPC,是远程过程调用(Remote Procedure Call)的简写,网上解释很多,简单来说,就是在当前进程调用其他进程的函数时,体验就像是调用本地写的函数一般.本文实现的是在本地调用远端的 ...

  5. python使用grpc调用rpc接口

    proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...

  6. python thrift使用实例

    前言 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Python开发人员角度简单介绍 Apache Thrift 的架构.开发和使 ...

  7. RPC简介及框架选择

    简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点.常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式 ...

  8. 服务治理与RPC · 跬步

    以前写过Django中使用zerorpc的方法,但是由于我们的Django是运行在gevent下,而zeromq需要启动一个后台进程处理消息,与gevent使用的greenlet携程是冲突的. 在Ja ...

  9. Odoo14 rpc

    odoo14中rpc调用分为两种. 一种是外部调用rpc来访问odoo数据,这个时候你需要登录授权. 另一种是我们自己编写的widget小部件或者自定义视图时候通过js通过rpc去获取数据. 这里说的 ...

  10. [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关

    [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关 0x00 摘要 我们已经知道 dist.autograd 如何发送和接受消息,本文再来看看如何其他支撑部分,就是如 ...

随机推荐

  1. 基于airtest验证Android端app是否安装及自动化安装

    ​ 1.检测app是否安装: 使用check_app方法检测是否安装:为什么需要在封装一层做断言呢?主要check_app方法安装成功会返回True,但是未检测到安装时直接报异常了,停止执行.无法直接 ...

  2. 第一章 对程序员来说CPU是什么

    章节标题下方有几个问题,看完后便对第一章的内容有了大概的了解. 第一章观后感想: 第一章解释了CPU是什么,CPU相当于计算机的大脑,它的内部由数百万至数亿个晶体管构成. CPU所负责的就是解释和运行 ...

  3. 关于VScode里TS文件内引入插件没有提示内置属性和方法这件事

    前几天使用VScode + Vue + Vite + Ts开发项目 由于自己手残 把VScode设置文件的代码做了一些修改 导致TS文件引入的插件没有提示了!! 几经折腾下 终于靠自己解决了! 不多说 ...

  4. ES5及ES6的新增特性

    介绍 es表示ECMASCript ,他是从es3,es5,es6,es5是2009.12月发布的,es6是2015.6月发布的.vue2完全支持es5的(vue3完全支持es6的),react完全支 ...

  5. AD使用积累 - 相同网络的覆铜和走线无法自动连接问题

    像下图中这样,铜皮和走线是同一个网络,却没有连在一起. 解决方法: 选中目标铜皮,在在Properties中的Fill Mode中找到这个部分,先择Pour Over All Same Net Obj ...

  6. 树莓派 IIC功能安装及测试

    参考连接: https://blog.csdn.net/panwen1111/article/details/81044428 https://blog.csdn.net/xukai871105/ar ...

  7. Mybatis二级缓存问题

    一.缓存介绍. Mybatis提供了缓存服务,以减缓数据库压力: Mybatis的查询缓存总共有两级,我们称之为一级缓存和二级缓存,如图:   1.一级缓存是SqlSession级别的缓存.在操作数据 ...

  8. 记录Nginx配置

    1 # Proxy to the Airsonic server location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_hea ...

  9. 2---JVM启动参数有哪些?

    也要以说JVM启动的时候可以调整哪些参数,来进行调优.JVM 为垃圾收集器.堆大小和运行时编译器提供与平台相关的默认选择. 性能取决于堆的大小.应用程序维护的实时数据量以及可用处理器的数量和速度.. ...

  10. c# 递归应用 完成js文件自动引用

    背景: 两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息):sys_fld 是记录第张表中的字 ...