Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用

概述

  • Golang 提供 net/rpc/jsonrpc 库来实现rpc方法
  • 采用 json 方式进行数据编解码,支持跨语言调用

这里实现跨语言示例

1 )go 服务端

go 复制代码
package main  
  
import ( 
	"log"  
	"net"  
	"net/rpc"  
	"net/rpc/jsonrpc"
)  
  
// 定义服务接口  
type Arith int  
  
// 定义接口方法,参数和返回值都应该是指针类型  
func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	log.Print("参数", args)
	return nil  
}  
  
// Args 是传递给服务的参数结构  
type Args struct {  
	A, B int  
}  
  
func main() {  
	arith := new(Arith)  
	rpc.Register(arith)  
  
	l, err := net.Listen("tcp", ":1234")  
	if err != nil {  
		log.Fatal("listen error:", err)  
	}  
	defer l.Close()  
  
	for {  
		conn, err := l.Accept()  
		if err != nil {  
			log.Print("accept error:", err)  
			continue  
		}  
  
		// 使用 jsonrpc 包处理连接  
		go func() {  
			jsonrpc.ServeConn(conn)  
			conn.Close()  
		}()  
	}  
}

2 )nodejs 客户端1

js 复制代码
const net = require('net');  
const readline = require('readline');  
  
// 创建一个 TCP 客户端  
const client = new net.Socket();  
  
// 连接到服务器  
client.connect(1234, 'localhost', () => {  
  console.log('Connected to server!');  
  
  // 发送请求到服务器  
  const request = JSON.stringify({  
    jsonrpc: "2.0",  
    method: "Arith.Multiply",  
    params: [{ A: 7, B: 8 }],  
    id: 1  
  });  
  
  client.write(request + '\n');  
});  
  
// 处理从服务器返回的数据  
const rl = readline.createInterface({  
  input: client,  
  output: process.stdout,  
  terminal: false  
});  
  
rl.on('line', (line) => {  
  const response = JSON.parse(line);  
  console.log('Server response:', response.result);  
  client.end();  
});  
  
client.on('error', (err) => {  
  console.error('Socket error:', err);  
});  
  
client.on('close', () => {  
  console.log('Connection closed');  
});

3 )nodejs 客户端2

js 复制代码
const jayson = require('jayson');  
const client = jayson.client.tcp({  
  port: 1234,  
  host: 'localhost'  
});  
  
// 定义要调用的方法以及参数  
const request = {  
  jsonrpc: "2.0",  
  method: "Arith.Multiply",  
  params: [{ A: 7, B: 8 }],  
  id: 1  
};  
  
// 发送请求并处理响应  
client.request(request, function(err, response) {  
  if (err) {  
    console.error('请求出错:', err);  
    return;  
  }  
    
  console.log('服务器响应:', response.result); // 输出乘法的结果  
});

4 )go 客户端3

js 复制代码
package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)

type Args struct {  
	A int `json:"A"`  
	B int `json:"B"`  
}  

func main() {
	// 1. 用 net.Dial和rpc微服务端建立连接
	conn, err1 := net.Dial("tcp", "127.0.0.1:1234")
	if err1 != nil {
		fmt.Println(err1)
	}
	// 2. 当客户端退出的时候关闭连接
	defer conn.Close()

	// 3、建立基于json编解码的rpc服务
	client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))

	// 4. 调用远程函数
	var reply int
	err2 := client.Call("Arith.Multiply", Args{A: 7, B: 8}, &reply)
	if err2 != nil {
		fmt.Println(err2)
	}
	// 5. 获取微服务返回的数据
	fmt.Println(reply)
}

总结

  • 这里演示了,基于go语言为服务端,nodejs 和 golang 为客户端的3种示范
  • 注意,上面 nodejs版本中的 params 的格式与 golang 中的区别
  • 标准库的RPC默认采用Go语言特有的gob编码,没法实现跨语言调用
  • golang官方还提供了 net/rpc/jsonrpc 库实现RPC方法
  • JSON RPC采用JSON进行数据编解码,因而支持跨语言调用
  • 但目前的jsonrpc库是基于tcp协议实现的,暂时不支持使用http进行数据传输
  • 另外,Mac环境,在没有服务端服务时,可用 nc 工具调试客户端
    • $ nc -l 127.0.0.1 1234
  • linux下需要安装, $ yum install -y nc
  • nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉
  • nc命令的主要作用如下:
    • 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
    • 端口的扫描,nc可以作为client发起TCP或UDP连接
    • 机器之间传输文件
    • 机器之间网络测速
相关推荐
福大大架构师每日一题8 小时前
go-zero v1.10.0发布!全面支持Go 1.23、MCP SDK迁移、性能与稳定性双提升
开发语言·后端·golang
努力搬砖的咸鱼8 小时前
一个域名搞定前后端:用 Ingress 配置 / 和 /api 路由
微服务·云原生·容器·架构·kubernetes
Coder_Boy_8 小时前
Java(Spring AI)传统项目智能化改造——商业化真实案例(含完整核心代码+落地指南)
java·人工智能·spring boot·spring·微服务
2301_8169978820 小时前
Go语言简介
golang·go
一只理智恩20 小时前
基于 CesiumJS + React + Go 实现三维无人机编队实时巡航可视化系统
前端·人工智能·算法·golang·无人机
礼拜天没时间.21 小时前
Linux运维实战:巧用mv命令管理多版本Go环境,避免采坑
linux·运维·golang·centos
笨蛋不要掉眼泪21 小时前
从零构建微服务网关:Spring Cloud Gateway 核心原理与实战配置详解
java·微服务·云原生·架构
悠闲蜗牛�21 小时前
下一代API网关深度实践:基于Spring Cloud Gateway的云原生网关架构与治理平台
微服务·云原生·架构
笨蛋不要掉眼泪21 小时前
Spring Cloud Gateway 核心实战:断言(Predicate)的长短写法与自定义工厂详解
java·前端·微服务·架构
悠闲蜗牛�21 小时前
Kubernetes从零到集群:本地Minikube环境搭建与Spring Cloud微服务运维实战
spring cloud·微服务·kubernetes