Go RPC 库

这篇具有很好参考价值的文章主要介绍了Go RPC 库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RPC(Remote Poresedure Call)是远程方法调用的缩写。Go的RPC库可以实现通过网络或者其他I/O方式远程调用对象的方法。

服务器注册一个对象,让它作为一个以对象类型命名的服务,让这个对象导出的方法可以被远程调用。一个服务器可以注册多个不同类型的对象,但是不能注册同一类型的多个对象。

一个能够被远程调用的方法应该像下面这样:

func (t *T) MethodName(argType T1, replyType *T2) error

一个简单的例子:实现简单的kv存储,并(在同一台机器上)通过RPC调用Put和Get方法。文章来源地址https://www.toymoban.com/news/detail-825035.html

package main

import (
	"fmt"
	"log"
	"net"
	"net/http"
	"net/rpc"
	"sync"
	"time"
)

// RPC struct definition

type PutArgs struct {
	Key string
	Val string
}

type PutReply struct {
	Ok bool
}

type GetArgs struct {
	Key string
}

type GetReply struct {
	Val string
}

type Kv struct {
	data map[string]string
	mu   sync.Mutex
}

// server

func (kv *Kv) Get(args *GetArgs, reply *GetReply) error {
	kv.mu.Lock()
	defer kv.mu.Unlock()
	reply.Val = kv.data[args.Key]
	return nil
}

func (kv *Kv) Put(args *PutArgs, reply *PutReply) error {
	kv.mu.Lock()
	defer kv.mu.Unlock()
	kv.data[args.Key] = args.Val
	reply.Ok = true
	return nil
}

func KvServer() {
	kv := new(Kv)
	kv.data = make(map[string]string)
	rpc.Register(kv)
	rpc.HandleHTTP()
	l, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("listen error: ", err)
	}
	http.Serve(l, nil)
}

// client interface

func get(key string) string {
	client, err := rpc.DialHTTP("tcp", "127.0.0.1"+":1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}
	args := GetArgs{key}
	reply := GetReply{}
	e := client.Call("Kv.Get", args, &reply)
	if e != nil {
		log.Fatal("get error", e)
	}
	client.Close()
	return reply.Val
}

func put(key string, val string) bool {
	client, err := rpc.DialHTTP("tcp", "127.0.0.1"+":1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}
	args := PutArgs{key, val}
	reply := PutReply{}
	e := client.Call("Kv.Put", args, &reply)
	if e != nil {
		log.Fatal("put error", e)
	}
	client.Close()
	return reply.Ok
}

// test

func main() {
	go KvServer()
	time.Sleep(time.Second) // wait for server to start
	fmt.Println(put("key1", "value1"))
	fmt.Println(put("key2", "value2"))
	fmt.Println(put("key3", "value3"))
	fmt.Println(get("key1"))
	fmt.Println(get("key2"))
	fmt.Println(get("key3"))
	fmt.Println(get("value1"))
}

到了这里,关于Go RPC 库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Microsoft Remote Desktop中文汉化远程连接其他计算机方法

    Microsoft Remote Desktop是一款由微软公司推出的远程桌面连接工具,它可以让用户通过互联网远程连接到其他计算机,并在远程计算机上访问本地文件、应用程序和网络资源。 要使用Microsoft Remote Desktop远程连接其他计算机,请按照以下步骤操作: 在Windows 10中,打开“开始”菜单

    2024年02月15日
    浏览(52)
  • 文件上传gitee中出现问题fatal: remote origin already exists.(远程来源已存在) 解决方法

    当我们在上传文件到gitee中的时候,输入git remote add origin git@toscode.gitee.com:jiemengjie(码云账号)/vue3-project(自己创建的仓库名).git后,会出现一句话 fatal: remote origin already exists.远程来源已存在。 如下图所示: 这时候我们可以输入命令  git remote -v ,意思是列出所有的远程仓

    2024年02月04日
    浏览(63)
  • vivo S12 PRO怎么解锁vivoS12解锁平台刷机教程屏幕锁激活手机锁不记得了可以用这个方法教程刷机解锁用的

    vivo S12 5G手机vivo S12 PRO怎么解锁修改密码清除锁定升级更新降版本固件系统资料原方包刷机教程太卡怎么降级到原来版本退回之前版本想解锁刷机降级方法降级系统资料平台驱动怎么下载使用强制刷机解锁降回之前版本直接解锁手机忘掉密码屏幕锁开机锁账户锁定直接清除刷

    2024年02月13日
    浏览(46)
  • 手机上可以python编程的软件,手机上可以用的python

    大家好,小编来为大家解答以下问题,手机上可以python编程的软件,手机上可以用的python,现在让我们一起来看看吧! 推荐一款手机Python编程软件 最近网友问我有没有手机上运行Python代码的编程软件,所以根据网友们的需求,我介绍一款手机Python编程软件。 具体步骤如下

    2024年02月02日
    浏览(50)
  • RPC原理与Go RPC详解

    RPC(Remote Procedure Call),即远程过程调用。它允许像调用本地服务一样调用远程服务。 RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。 首先与RPC(远程过程调用)相对应的是本地调用。 本地调用 将上述程序编译成二

    2024年02月14日
    浏览(34)
  • Go RPC 库

    RPC(Remote Poresedure Call)是远程方法调用的缩写。Go的RPC库可以实现通过网络或者其他I/O方式远程调用对象的方法。 服务器注册一个对象,让它作为一个以对象类型命名的服务,让这个对象导出的方法可以被远程调用。一个服务器可以注册多个不同类型的对象,但是不能注册同一

    2024年02月19日
    浏览(61)
  • go rpc

    运用go标准库写一个rpc例子 服务端 注意绑定的对象方法,必须有两个参数,第二个参数必须是“指针类型”为传出参数。方法只有一个error类型的返回值。 客户端 注意:上面代码中rpc的远程函数调用采用的是golang中特有的序列化包gob,其他语音不能解析。所以,要进行不同

    2024年02月12日
    浏览(31)
  • Go七天实现RPC

    本文是学习自7天用Go从零实现RPC框架GeeRPC | 极客兔兔 在此基础上,加入自己的学习过程与理解。 自己实现过程的完整代码:https://github.com/liwook/Go-projects/tree/main/geerpc RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,允许调用不同进程空间的程序。RPC 的客户端和服

    2024年01月19日
    浏览(40)
  • 手机上有python编译器吗,手机上可以用的python

    本篇文章给大家谈谈手机上有python编译器吗,以及手机上可以用的python,希望对各位有所帮助,不要忘了收藏本站喔。 Source code download: 本文相关源码 这篇文章主要介绍了python软件可以在手机上运行吗怎么操作,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这

    2024年02月20日
    浏览(62)
  • 【Go】四、rpc跨语言编程基础与rpc的调用基础原理

    早期 Go 语言不使用 go module 进行包管理,而是使用 go path 进行包管理,这种管理方式十分老旧,两者最显著的区别就是:Go Path 创建之后没有 go.mod 文件被创建出来,而 go module 模式会创建出一个 go.mod 文件用于管理包信息 现在就是:尽量使用 Go Modules 模式 另外,我们在引入包

    2024年02月19日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包