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

news/2024/4/24 14:58:28/文章来源:https://blog.csdn.net/Tyro_java/article/details/136567317

概述

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

这里实现跨语言示例


1 )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.Blog.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

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

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

package mainimport ("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 interr2 := 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连接
    • 机器之间传输文件
    • 机器之间网络测速

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_998972.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE_nuxt启动只能通过localhost访问,ip访问不到:问题解决

修改项目根目录下的 package.json "config": {"nuxt": {"host": "0.0.0.0","port": "3000"} } 这样项目启动后就可以通过ip进行访问了

AutoDev 自定义 Agent:快速接入内部 AI Agent,构建 IDE 即 AI 辅助研发中心

在开源 AI IDE 插件 AutoDev 的 #51 issue 中,我们设计了 AutoDev 的 AI Agent 能力,半年后我们终于交付了这个功能。 在 AutoDev 1.7.0 中,你将可以接入内部的 AI Agent,并将其无缝与现有的 AI 辅助能力结合在一起。 本文将使用 …

使用awk和正则表达式过滤文本或字符串 - 详细指南和示例

当我们在 Linux 中运行某些命令来读取或编辑字符串或文件中的文本时,我们经常尝试将输出过滤到感兴趣的特定部分。这就是使用正则表达式派上用场的地方。 什么是正则表达式? 正则表达式可以定义为表示多个字符序列的字符串。关于正则表达式最重要的事情之…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】(底层operator【】函数) ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

Python编程实验六:面向对象应用

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 (1)通过本次实验,学生应掌握类的定义与对象的创建、类的继承与方法的覆盖; (2…

接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天&#xff01;&#xff01; ———————————————————————————— 学习笔记 接收端 recvfrom #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, si…

一文学会搭建 cli 脚手架工具

文章目录 设置工具命令package.json bin 字段注释&#xff1a;#!/usr/bin/env node设置环境变量 接收命令选项参数process 实现commander 命令行交互&#xff1a;inquirer下载项目模板&#xff1a;download-git-repo执行额外命令&#xff1a;自动安装依赖child_processexeca 体…

Mybatis-Plus——05,乐观锁(新注解)

乐观锁&#xff08;新注解&#xff09; 一、数据库添加一个字段二、实体类添加version注解三、注册乐观锁插件四、测试一下4.1成功的乐观锁4.2失败的乐观锁————————创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 乐观锁实现方…

Flask python开发篇: 写一个简单的接口

第一步&#xff1a;新建flask项目 参考使用pycharm新建一个项目 打开pycharm&#xff0c;根据下面图中箭头顺序&#xff0c;新建一个flask的项目&#xff1b; 第二步&#xff1a;运行项目&#xff0c; 安装成功以后&#xff0c;会有个app.py文件&#xff0c;打开以后&#…

Kali Linux 2024.1

Kali Linux 2024.1刚刚发布&#xff0c;标志着这个备受欢迎的安全重点Linux发行版在今年的首次重大更新。以其先进的渗透测试和安全审计功能而闻名&#xff0c;它是安全专业人员和爱好者的首选工具。 Kali 2024.1 亮点 本次发布由 Linux 内核 6.6 提供支持&#xff0c;突出了…

借着ChatGPT的人机交互聊聊长连接

ChatGPT这两年可谓风靡全球&#xff0c;尤其是最近Sora视频模型的横空出世以及claude 3模型所具备的浅意识&#xff0c;更是像打开了新世界的大门。本文就从ChatGPT的网页聊天开始聊起&#xff08;有蹭热度之嫌&#xff0c;哈哈&#xff09;&#xff0c;聊聊长连接的发展历程和…

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

来说说看到的求职路上可以提高的地方——简历

要进行求职的时候应该遇到的第一件事情就是简历。 随着看到的简历越来越多&#xff0c;也发现了一些问题&#xff0c;来开个帖子来说说这些问题。 格式 让参加面试的人最头疼的地方就是简历格式没有空格。 最近发现好多人的简历格式上都不空格&#xff0c;很多内容完全都在…

IntelliJ IDEA自定义关闭当前文件的快捷方式

前言 idea中关闭当前标签页的默认快捷键是CtrlF4,这个组合键在键盘上操作起来很是不方便&#xff0c;我们可以在设置中自定义自己习惯的快捷方式。 自定义步骤 要在 IntelliJ IDEA 中将关闭当前文件的快捷方式设置为 Alt Q&#xff0c;请按照以下步骤操作&#xff1a;打开 …

Android应用界面

概述&#xff1a;由于学校原因&#xff0c;估计会考&#xff0c;曹某人就浅学一下。 目录 View概念 创建和使用布局文件 相对布局 线性布局 水平线性布局 垂直线性布局 表格布局 帧布局 扁平化布局 Android控件详解 AdapterView及其子类 View概念 安卓中的View是所…

Qt初识 - 编写Hello World的两种方式 | 对象树

目录 一、通过图形化方式&#xff0c;在界面上创建出一个控件 二、通过代码方式&#xff0c;创建Hello World 三、Qt 内存泄漏问题 (一) 对象树 一、通过图形化方式&#xff0c;在界面上创建出一个控件 创建项目后&#xff0c;打开双击forms文件夹中的ui文件&#xff0c;可…

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数&#xff08;命令行、配件文件&#xff09;1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动&#xff0c;以及配置密码文件 1.2 查询表的相关参数&#xff0c;以及表空间管理 2、Mysql高级优化&#xff08;SQL&…

CNC机加工引入复合机器人可以提高生产效率,降低成本

CNC加工企业在过去依赖大量的人工来完成生产线上的各项任务&#xff0c;包括CNC机床的上下料、物料搬运以及部分装配工作。然而&#xff0c;随着产能需求的不断增长和人工成本的持续上升&#xff0c;企业逐渐意识到自动化升级的重要性与迫切性。 面临的挑战与需求&#xff1a; …

【DUSt3R】2张图2秒钟3D重建

【DUSt3R】2张图2秒钟3D重建 1. DUSt3R是一种用于稠密和无约束立体三维重建的方法,其实现步骤如下:2. 实际运行效果3. 运行结果4. 自问自答4.1 为社么这里要是使用transform模型呢?4.2 CroCo(通过跨视图完成3D视觉任务的自我监督预训练的一个研究)在DUSt3R的作用是什么,为…

云计算项目十:ES集群安装|部署kibana

ES集群安装 部署ES集群&#xff0c;用于ELK日志分析平台的构建 es-0001 主机更改 /etc/hosts [rootes-0001 ~]# vim /etc/hosts 192.168.1.71 es-0001 192.168.1.72 es-0002 192.168.1.73 es-0003 192.168.1.74 kibana 192.168.1.75 logstash # 将最新的/etc/hosts配置文件更…