Implementé el servidor RPC usando Go. Ahora, quiero escribir el cliente usando Node.js, ¿cómo puedo hacer una llamada RPC desde el cliente Node.js a un servidor Go?
Aquí está el código del servidor escrito en 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) } }El paquete net/rpc usa encoding/gob como formato de conexión predeterminado. Es un formato de serialización binaria específico de Go que es eficiente, pero, en la práctica, solo es útil cuando se comunica entre aplicaciones de Go.
Sin embargo, net/rpc admite el uso de diferentes códecs para (des) serializar datos y el paquete net/rpc/jsonrpc proporciona una implementación de códec compatible con JSON-RPC 1.0.
Aquí hay un ejemplo de su uso, junto con un cliente Node.js que utiliza el paquete jayson (nada en particular, solo el primero con el que me topé que admite 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 Cliente $ node client.js response: Hello chuckx Tenga en cuenta que el paquete net/rpc ya no acepta nuevas funciones, por lo que es mejor que use algo como gRPC para obtener más funciones y una mejor compatibilidad entre idiomas.