Go/Python RPC使用
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使用的更多相关文章
- Python RPC 之 gRPC
gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...
- [Python] RPC实现
单线程同步 使用socket传输数据 使用json序列化消息体 struct将消息编码为二进制字节串,进行网络传输 消息协议 1 // 输入 2 { 3 in: "ping", 4 ...
- Python RPC 不会?不妨看看这篇文章
1. 前言 大家好,我是安果! RPC,全程为 Remote Procedure Call,是一种进程间的通信方式,它采用「 服务端 / 客户机 」模式,是一种请求响应模型 其中,服务端负责提供服务程 ...
- python rpc 的实现
所谓RPC,是远程过程调用(Remote Procedure Call)的简写,网上解释很多,简单来说,就是在当前进程调用其他进程的函数时,体验就像是调用本地写的函数一般.本文实现的是在本地调用远端的 ...
- python使用grpc调用rpc接口
proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...
- python thrift使用实例
前言 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Python开发人员角度简单介绍 Apache Thrift 的架构.开发和使 ...
- RPC简介及框架选择
简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点.常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式 ...
- 服务治理与RPC · 跬步
以前写过Django中使用zerorpc的方法,但是由于我们的Django是运行在gevent下,而zeromq需要启动一个后台进程处理消息,与gevent使用的greenlet携程是冲突的. 在Ja ...
- Odoo14 rpc
odoo14中rpc调用分为两种. 一种是外部调用rpc来访问odoo数据,这个时候你需要登录授权. 另一种是我们自己编写的widget小部件或者自定义视图时候通过js通过rpc去获取数据. 这里说的 ...
- [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关
[源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关 0x00 摘要 我们已经知道 dist.autograd 如何发送和接受消息,本文再来看看如何其他支撑部分,就是如 ...
随机推荐
- scroll-view 横向滚动无效
scroll-view的内层view元素需要: display: inline-block scroll-view的外层元素需要: white-space: nowrap 使得内部组件不换行.
- C++常见报错信息和原因的对应关系
1. 无法找到 xxx.dll 没有把动态链接库和exe放在一个文件夹下 2. 不允许使用不完整的类型 指的是忘了加头文件 3. link err .无法解析的外部符号 指的是 lib 库没有配置对 ...
- List转Map处理
List对象装一个Map<String,String> 在Java8中新增了stream流的操作,对于代码书写更为简便,而且更容易看的懂 List<Unit> unitList ...
- Think Python 学习笔记
#!/usr/bin/env python# coding: utf-8# # Think Python 学习笔记# 1.关于异或计算符# In[2]:6^2# 2.关于函数# 注意:变量名称不能用数 ...
- How to Install VMware Tools on CentOS 6.5
yum install perl gcc make kernel-headers kernel-devel -y [root@centos6 vmware-tools-distrib]# ./vmwa ...
- iview 中Modal组件点击确定后验证信息不通过则不关闭弹窗方法
<Modal v-model="isTemManageShow" title="管理模板" @on-ok="ok" :loading= ...
- 实验二:Open vSwitch虚拟交换机实践
基础要求提交 a) /home/用户名/学号/lab2/目录下执行ovs-vsctl show命令.以及p0和p1连通性测试的执行结果截图: b) /home/用户名/学号/lab2/目录下开启Min ...
- 实验九 团队作业6:团队项目编码与Alpha冲刺
项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验九-团队作业6 团队名称 零基础619 团队成员分工描述 任务1:荣娟,鑫任务2:亚楠,桂婷任务3:亚楠,桂婷任务4:荣娟,鑫任务 ...
- KVM虚拟机根分区磁盘扩容
CentOS7.6, libvirt 4.5.0 , KVM虚拟机根分区扩容. 在宿主机执行0, 对LVM磁盘进行扩容 0. qemu-img resize 10.0.0.1_node1.qcow2 ...
- Windows7卡在正在关机
据我的分析,Windows系统卡在正在关机的原因很大可能性是破解过系统主题.解决方法就是还原成主题未被破解时候的状态.但是这种情况是随机性的,但是可以确定的是,只要是破解过系统主题,都有一定概率关不了 ...