IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> golang下的rpc框架jsonrpc理解和使用示例 -> 正文阅读

[网络协议]golang下的rpc框架jsonrpc理解和使用示例

说明

本文的目的

  • 理解一下rpc协议使用上的区别
  • golang下jsonrpc框架的使用

示例

定义RPC协议

import "github.com/pkg/errors"

//定义一个叫做Demo的Rpc服务协议
//包含参数结构和2个不同的参数处理协议
// 返回值通过result指针获取,这点是由RPC服务来定义的
type DemoService struct {
}

//包含1: 参数的个数和类型
type Args struct {
	A, B int
}

//包含2: 参数的处理协议 除法协议
func (DemoService) Div(args Args, result *float64) error {
	if args.B == 0 {
		return errors.New("divide by zero")
	}

	*result = float64(args.A) / float64(args.B)

	return nil
}

//包含2: 参数的处理协议 乘法协议
func (DemoService) Muti(args Args, result *int) error {

	*result = args.A * args.B

	return nil
}

注册为服务端

package main

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

func main() {

	//注册demoService到rpc框架中,成为当前server的rpc协议之一
	rpc.Register(demorpc.DemoService{})

	listen, err := net.Listen("tcp", ":9999")
	if err!=nil{
		panic(err)
	}

	for  {

		conn, err := listen.Accept()

		if err!=nil{
			fmt.Println("Server listens error")
			continue
		}

		go jsonrpc.ServeConn(conn)

	}
}



客户端测试

通过telnet测试

telent localhost 9999 链接上后如初参数


"method":"DemoService.Div","params":[{"A":3,"B":4}],"id":1}
=》{"id":1,"result":0.75,"error":null}
{"method":"DemoService.Muti","params":[{"A":3,"B":4}],"id":1}
=>{"id":1,"result":12,"error":null}

说明不同的参数可以调用不同的协议

注意:虽然服务器启动了端口,但是不能通过接口调用,因为接口使用的http协议,会包含http的头部和body,数据格式不符合我们定义的rpc协议

通过客户端测试

package main

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

func main() {
	conn, err := net.Dial("tcp",":9999")

	if err!=nil{
		panic(err)
	}

	var result1 float64
	var result2 int
	client := jsonrpc.NewClient(conn)


	//调用除法
	err = client.Call("DemoService.Div",
		demorpc.Args{
			A: 3,
			B: 4,
		}, &result1)

	fmt.Println(result1,err)


	//调用乘法
	err = client.Call("DemoService.Muti",
		demorpc.Args{
			A: 3,
			B: 4,
		}, &result2)

	fmt.Println(result2,err)
}

结论

  1. 可以自定义server的协议参数和协议动作
  2. 注册到jsonrpc框架后,可以借助框架实现服务间的rpc调用
  3. rpc基于自定义协议,而http基于http协议,两者主要在于协议不同
  4. 协议的本质就是数据交换格式
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:04:59  更:2022-04-07 23:05:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:51:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码