go语言之rpc支持json
2022/4/25 23:15:42
本文主要是介绍go语言之rpc支持json,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
标准库的RPC默认采用Go语言特有的gob编码,因此从其它语言调用Go语言实现的RPC服务将比较困难。在互联网的微服务时代,每个RPC以及服务的使用者都可能采用不同的编程语言,因此跨语言是互联网时代RPC的一个首要条件。得益于RPC的框架设计,Go语言的RPC其实也是很容易实现跨语言支持的。
Go语言的RPC框架有两个比较有特色的设计:一个是RPC数据打包时可以通过插件实现自定义的编码和解码;另一个是RPC建立在抽象的io.ReadWriteCloser接口之上的,我们可以将RPC架设在不同的通讯协议之上。这里我们将尝试通过官方自带的net/rpc/jsonrpc扩展实现一个跨语言的PPC。
1、服务端代码
package main import ( "net" "net/rpc" "net/rpc/jsonrpc" ) type HelloService struct {} func (s *HelloService) Hello(request string, reply *string) error { *reply = "hello "+ request return nil } func main(){ rpc.RegisterName("HelloService", new(HelloService)) listener, err := net.Listen("tcp", ":1234") if err != nil { panic("启动错误") } for { conn, err := listener.Accept() if err != nil { panic("接收") } go rpc.ServeCodec(jsonrpc.NewServerCodec(conn)) } }
代码中最大的变化是用rpc.ServeCodec函数替代了rpc.ServeConn函数,传入的参数是针对服务端的json编解码器。
2、客户端
package main import ( "fmt" "net" "net/rpc" "net/rpc/jsonrpc" ) func main(){ conn, err := net.Dial("tcp", "localhost:1234") if err != nil { panic("连接错误") } client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn)) var reply string err = client.Call("HelloService.Hello", "imooc", &reply) if err != nil { panic("调用错误") } fmt.Println(reply) }
3、python代码
import json import socket import itertools import time class JSONClient(object): def __init__(self, addr): self.socket = socket.create_connection(addr) self.id_counter = itertools.count() def __del__(self): self.socket.close() def call(self, name, *params): request = dict(id=next(self.id_counter), params=list(params), method=name) self.socket.sendall(json.dumps(request).encode()) # This must loop if resp is bigger than 4K response = self.socket.recv(4096) response = json.loads(response.decode()) if response.get('id') != request.get('id'): raise Exception("expected id=%s, received id=%s: %s" %(request.get('id'), response.get('id'), response.get('error'))) if response.get('error') is not None: raise Exception(response.get('error')) return response.get('result') def close(self): self._socket.close() if __name__ == '__main__': rpc = JSONClient(("localhost", 1234)) args = "hello" print(rpc.call("HelloService.Hello", args))
这篇关于go语言之rpc支持json的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16Vue3资料:新手入门必读教程
- 2024-11-16Vue3资料:新手入门全面指南
- 2024-11-16Vue资料:新手入门完全指南
- 2024-11-16Vue项目实战:新手入门指南
- 2024-11-16React Hooks之useEffect案例详解
- 2024-11-16useRef案例详解:React中的useRef使用教程
- 2024-11-16React Hooks之useState案例详解
- 2024-11-16Vue入门指南:从零开始搭建第一个Vue项目
- 2024-11-16Vue3学习:新手入门教程与实践指南
- 2024-11-16Vue3学习:从入门到初级实战教程