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

这篇具有很好参考价值的文章主要介绍了Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

  • 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.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

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文章来源地址https://www.toymoban.com/news/detail-840830.html

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连接
    • 机器之间传输文件
    • 机器之间网络测速

到了这里,关于Go微服务: 基于net/rpc/jsonrpc模块实现微服务跨语言调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用

    🏷️ 个人主页 :鼠鼠我捏,要死了捏的主页  🏷️ 系列专栏 :Golang全栈-专栏 🏷️ 个人学习笔记,若有缺误,欢迎评论区指正   前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 快速上手

    2024年02月19日
    浏览(41)
  • php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

    golang代码: package main import (     \\\"context\\\"     \\\"net\\\"     \\\"net/rpc\\\"     \\\"github.com/powerman/rpc-codec/jsonrpc2\\\" ) type App struct{} type Res struct {     Code int    `json:\\\"code\\\"`     Msg  string `json:\\\"msg\\\"`     Data any    `json:\\\"data\\\"` } func (*App) Hi(mp map[string]any, res *Res) error {     res.Code = 200     res.Msg = \\\"成

    2024年02月15日
    浏览(49)
  • JAVA RPC Thrift基操实现与微服务间调用

    生成代码HelloWorldService接口如下 先启动服务端 在启动客户端 往前调转 1.2 执行命令生成Java文件 调用成功 !

    2024年01月22日
    浏览(44)
  • 实现跨语言通信的便捷之道:RPC在Java和Go中的使用案例

    导语: 在现代软件开发中,构建分布式系统和跨语言通信变得越来越常见。RPC(远程过程调用)作为一种通信协议,提供了一种简单而高效的方式来实现不同语言之间的通信。本文将探讨RPC的使用案例,并展示如何在Java和Go之间实现跨语言通信。 什么是RPC? RPC是一种允许不

    2024年01月19日
    浏览(44)
  • catface,使用Interface定义Controller,实现基于Http协议的RPC调用

    : Interface定义Controller;feign服务端;feign interface;Http RPC;cat-client;cat-server;catface; 概   要: catface ,使用类似 FeignClient 的Interface作为客户端发起Http请求,然后在服务端使用实现了这些Interface的类作为 Controller 角色,将客户端、服务端通过Interface耦合在一起,实

    2024年02月09日
    浏览(49)
  • 【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

    在日益增长的业务需求中,一开始使用的是每个项目独立开发,虽然都是前后端分离的项目,但是每一个项目之间互不干扰。后来,因为某种需求,需要几个项目的数据相互交错获取。 最开始的想法就是集成多个数据源。 举例 有A、B、C三个项目,对应着数据库DBa、DBb、DBc、

    2024年02月04日
    浏览(58)
  • php-golang-rpc jsonrpc和php客户端tivoka/tivoka包实践

    golang 代码: package main import (     \\\"fmt\\\"     \\\"net\\\"     \\\"net/rpc\\\"     \\\"net/rpc/jsonrpc\\\" ) type App struct{} type Res struct {     Code int    `json:\\\"code\\\"`     Msg  string `json:\\\"msg\\\"`     Data any    `json:\\\"data\\\"` } func (*App) Hi(mp map[string]any, res *Res) error {     res.Code = 200     res.Msg = \\\"成功\\\"     var rmp = mak

    2024年02月15日
    浏览(58)
  • 【go-zero】docker镜像直接部署go-zero的API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

    使用docker直接部署go-zero微服务会发现API无法找到RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 RPC服务运行正常 API服务启动,通过docker logs 查看日志还是未发现RPC API的yaml配置 RPC服务的IP是 127.0.0.1 与对应的端口 下图为改成了定

    2024年02月13日
    浏览(46)
  • Springboot3.X整合Dubbo3.XSpringCloudAlibaba微服务 2022.0 + Springboot3.X 集成 Dubbo实现对外调用http内部调用RPC

    近期自己新开了一套SpringCloud Alibaba微服务项目,接口使用了对外HTTP,内部RPC的设计,具体点说就是外部用户或客户端通过Nginx访问到Gateway网关再分发到各个服务,内部各个服务之间统一使用Dubbo RPC进行通信。下面是Springboot3.x集成Dubbo的分享: 1. 需要的关键依赖 2. 启动程序入

    2024年02月15日
    浏览(38)
  • 基于RPC协议的接口自动化测试可以用Python语言实现

    基于RPC协议的接口自动化测试可以用Python语言实现。下面是实现步骤: 1、安装依赖库,如protobuf、grpc。 2、编写.proto文件定义接口参数和返回值。 3、使用protoc编译.proto文件生成Python代码。 4、编写客户端代码调用远程接口进行测试。 具体实现步骤如下: 1、安装依赖库 在终

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包