Use RPC to make a kv storage server

Go example: kv.go on schedule page
A toy key/value storage server – Put(key,value), Get(key)->value
Uses Go’s RPC library
Common:
Declare Args and Reply struct for each server handler.
Client:
connect()'s Dial() creates a TCP connection to the server
get() and put() are client “stubs”
Call() asks the RPC library to perform the call
you specify server function name, arguments, place to put reply
library marshalls args, sends request, waits, unmarshalls reply
return value from Call() indicates whether it got a reply
usually you’ll also have a reply.Err indicating service-level failure
Server:
Go requires server to declare an object with methods as RPC handlers
Server then registers that object with the RPC library
Server accepts TCP connections, gives them to RPC library
The RPC library
reads each request
creates a new goroutine for this request
unmarshalls request
looks up the named object (in table create by Register())
calls the object’s named method (dispatch)
marshalls reply
writes reply on TCP connection
The server’s Get() and Put() handlers
Must lock, since RPC library creates a new goroutine for each request
read args; modify reply

server

//
// Server
//package mainimport ("log""net""net/rpc""sync"
)const (OK       = "OK"ErrNoKey = "ErrNoKey"
)type Err stringtype PutArgs struct {Key   stringValue string}type PutReply struct {Err Err
}type GetArgs struct {Key string
}type GetReply struct {Err   ErrValue string
}type KV struct {mu   sync.Mutexdata map[string]string
}func server() {kv := new(KV)kv.data = map[string]string{}rpcs := rpc.NewServer()rpcs.Register(kv)l, e := net.Listen("tcp", ":3306")if e != nil {log.Fatal("listen error:", e)}go func() {for {conn, err := l.Accept()if err == nil {go rpcs.ServeConn(conn)} else {break}}l.Close()}()
}func (kv *KV) Get(args *GetArgs, reply *GetReply) error {kv.mu.Lock()defer kv.mu.Unlock()val, ok := kv.data[args.Key]if ok {reply.Err = OKreply.Value = val} else {reply.Err = ErrNoKeyreply.Value = ""}return nil
}func (kv *KV) Put(args *PutArgs, reply *PutReply) error {kv.mu.Lock()defer kv.mu.Unlock()kv.data[args.Key] = args.Valuereply.Err = OKreturn nil
}//
// main
//func main() {server()time.Sleep(time.Second * 10)
}

client

package mainimport ("fmt""log""net/rpc"
)//
// Common RPC request/reply definitions
//const (OK       = "OK"ErrNoKey = "ErrNoKey"
)type Err stringtype PutArgs struct {Key   stringValue string
}type PutReply struct {Err Err
}type GetArgs struct {Key string
}type GetReply struct {Err   ErrValue string
}//
// Client
//func connect() *rpc.Client {client, err := rpc.Dial("tcp", ":3306")if err != nil {log.Fatal("dialing:", err)}return client
}func get(key string) string {client := connect()args := GetArgs{"subject"}reply := GetReply{}err := client.Call("KV.Get", &args, &reply)if err != nil {log.Fatal("error:", err)}client.Close()return reply.Value
}func put(key string, val string) {client := connect()args := PutArgs{"subject", "6.824"}reply := PutReply{}err := client.Call("KV.Put", &args, &reply)if err != nil {log.Fatal("error:", err)}client.Close()
}func main() {put("subject", "6.824")fmt.Printf("Put(subject, 6.824) done\n")fmt.Printf("get(subject) -> %s\n", get("subject"))
}

Result

Put(subject, 6.824) done
get(subject) -> 6.824

6.824 RPC lesson2 2020(二)相关推荐

  1. 6.824 RPC lesson2 2020(一)

    resources https://pdos.csail.mit.edu/6.824/notes/crawler.go https://pdos.csail.mit.edu/6.824/notes/l ...

  2. RPC Demo(二) 基于 Zookeeper 的服务发现

    RPC Demo(二) 基于 Zookeeper 的服务发现 简介     基于上篇的:RPC Demo(一) Netty RPC Demo 实现     第二部分来实现使用Zookeeper作为服务 ...

  3. 二战计算机技术,2020二本二战西南交大电子信息(计算机技术)上岸

    2020二本二战西南交大电子信息(计算机技术)上岸 西南交通大学 发布于2021年4月28日 00:49 阅读数 619 一:个人情况: 本科巢湖学院软件工程专业,无项目和竞赛,大学四年比较水,去年6 ...

  4. 2020二维码经济相关报告

    中关村工信二维码技术研究院院长张超表示,中国已成为二维码应用最广泛的国家,中国二维码应用占全球九成以上. 从扫码购物到"码"上创业.从城市"码"上出行到农村&q ...

  5. 甘肃、黑龙江、江西、湖南、湖北、蒙东、宁夏、青海、陕西、重庆2020二批次录取分析

    之前两期关于二批次的数据分析介绍了大部分省份二批次的录用情况,今天我们继续把剩下的省份统计分析一下(不包括新疆和西藏),想考以下这些地区的同学一定要收藏哦! 甘肃电网 甘肃省2020二批次计划招聘13 ...

  6. 6.824 Raft lesson4 2020(一)

    raft实现 距离上一篇文章一个月,因为6.824的课程看不懂,基础知识薄弱.现在了解一点Raft算法(自己动手实现一遍)还需要其他分布式相关的基础知识(实现一个分布式对象存储系统),然后再去继续学习 ...

  7. 吃鸡ios和android灵敏度,和平精英灵敏度怎么调最稳2020二指攻略:安卓苹果灵敏度调节方法大全[多图]...

    最新和平精英灵敏度怎么调最稳2020?和平精英经过几个版本的更新改动后,之前的方法已经不是很好用了,下面就来为大家带来2020年和平精英最新的二指灵敏度条件玩法.让你的打的准扫的稳,轻松吃鸡不是梦.快 ...

  8. RPC实践(二)JsonRPC实践

    一.JsonRPC介绍 json-rpc是基于json的跨语言远程调用协议,比xml-rpc.webservice等基于文本的协议传输数据格小:相对hessian.Java-rpc等二进制协议便于调试 ...

  9. 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

最新文章

  1. python四十二:类和对象
  2. applicationcontext理解使用
  3. 泰山服务器 oracle数据库,泰山之巅对话•Oracle数据库掌门人:领先对手10年?凭什么口气这么大?...
  4. js html 拼接,JavaScript concat() 方法
  5. 【渝粤教育】国家开放大学2018年春季 3819-21T燃气安全管理 参考试题
  6. sqlmap使用教程大全命令大全(图文)
  7. idea中从外部复制内容到里面不成功
  8. macbook使用共享屏幕实现VNC远程控制
  9. Halcon仿射变换图片(旋转、缩放、平移)
  10. php 解析array,深度解析PHP数组函数array_slice
  11. 北京二手房价预测(数据分析)
  12. leetcode 1276. 不浪费原料的汉堡制作方案(C++)
  13. 计算机的色彩在哪调整w10,win10电脑色彩太冷怎么调节屏幕色彩
  14. 俗语“手握金鱼骨,富贵不用愁”,是啥意思?金鱼骨怎么形成的?
  15. MinGW MinGW-W64介绍
  16. Deep Clustering via Joint Convolutional Autoencoder Embedding and RelativeEntropy Minimization论文笔记
  17. i春秋 upload
  18. Java Web应用开发——作业五
  19. 各种进制转换常用方法
  20. rtx4000显卡什么级别 rtx4000显卡属于哪个级别

热门文章

  1. MyEclipse - 查询使用的JDK版本
  2. 【BZOJ2073】[POI2004]PRZ 状压DP
  3. Proximal Algorithms--Accelerated proximal gradient method
  4. UITableView知识梳理须知—(一)
  5. 关于 SENDKEYS 的代码
  6. android根据拍摄url获取格式,Android如何通过URI获取文件路径示例代码
  7. 2012服务器系统关闭网络共享,提供网络服务的前提,Windows Server 2012如何更改高级共享设置...
  8. 空军军医大学计算机复试线,空军军医大学2019年考研复试分数线
  9. 计算机无法打开策略,Win10提示“无法打开此计算机上的组策略对象”如何解决...
  10. 计算机专业多元协同,项目主导多元协同资源开放—软件技术专业人才培养体系的创新实践.pdf...