[英]Implement RPC client Node.js with server written
I implement RPC server using Go.我使用 Go 实现 RPC 服务器。 Now, I want to write the client using Node.js, how can I make RPC call from Node.js client to a Go server.
现在,我想使用 Node.js 编写客户端,如何从 Node.js 客户端向 Go 服务器进行 RPC 调用。
Here is the code of the server written in Go.这是用Go编写的服务器代码。
server.go
package main
type HelloService struct{}
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "Hello " + request
return nil
}
func main() {
rpc.RegisterName("HelloService", new(HelloService))
// run rpc on port 1234
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error: ", err)
}
// use for-while for serve client
for {
conn, err := listener.Accept()
log.Println("New connection: ", conn)
if err != nil {
log.Fatal("Accept error: ", err)
}
go rpc.ServeConn(conn)
}
}
The net/rpc
package uses encoding/gob
as the default wire format. net/rpc
package 使用encoding/gob
作为默认的有线格式。 It's a Go specific binary serialization format which is efficient, but, in practice, only useful when communicating between Go applications.这是一种 Go 特定的二进制序列化格式,它是有效的,但在实践中,仅在 Go 应用程序之间通信时有用。
However, net/rpc
supports utilizing different codecs for (de)serializing data and the net/rpc/jsonrpc
package provides a JSON-RPC 1.0 complaint codec implementation.但是,
net/rpc
支持使用不同的编解码器来(反)序列化数据,并且net/rpc/jsonrpc
package 提供了 JSON-RPC 1.0 投诉编解码器实现。
Here's an example of using it, along with a Node.js client which utilizes the jayson package (nothing particular about it, just the first one I stumbled across that supports JSON-RPC 1.0):这是一个使用它的示例,以及使用jayson package 的 Node.js 客户端(没什么特别的,只是我偶然发现的第一个支持 JSON-RPC 1.0 的客户端):
server.go
package main
import (
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
)
type HelloService struct{}
func (p *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 {
log.Fatal("ListenTCP error: ", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal("Accept error: ", err)
}
log.Printf("New connection: %+v\n", conn.RemoteAddr())
go jsonrpc.ServeConn(conn)
}
}
client.js
const jayson = require("jayson");
const client = jayson.client.tcp({
host: "172.17.0.2",
port: "1234",
version: 1,
});
client.request("HelloService.Hello", ["chuckx"], (err, response) => {
if (err) throw err;
if (response.error) throw response.error;
console.log("response:", response.result);
});
$ go run server.go 2021/03/12 06:46:21 New connection: 172.17.0.3:51016
Client
$ node client.js response: Hello chuckx
Note that the net/rpc
package is no longer accepting new features, so you may be better off using something like gRPC for more features and better cross-language compatibility.请注意,
net/rpc
package 不再接受新功能,因此您最好使用 gRPC 之类的东西来获得更多功能和更好的跨语言兼容性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.