resources

https://pdos.csail.mit.edu/6.824/notes/crawler.go
https://pdos.csail.mit.edu/6.824/notes/l-rpc.txt
https://pdos.csail.mit.edu/6.824/notes/kv.go

RPC_concept

19 | 分布式通信之远程调用:我是你的千里眼(https://time.geekbang.org)

RPC_simple_example

http_RPC

package mainimport ("errors""fmt""net/http""net/rpc"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}func main() {arith := new(Arith)rpc.Register(arith)rpc.HandleHTTP()err := http.ListenAndServe(":1234", nil)if err != nil {fmt.Println(err.Error())}
}

client

package mainimport ("fmt""log""net/rpc"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}func main() {serverAddress := "127.0.0.1"client, err := rpc.DialHTTP("tcp", serverAddress+":1234")if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, &quot)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)
}

http_TCP

server

这个客户端代码和http的客户端代码对比,唯一的区别一个是DialHTTP,一个是Dial(tcp),其他处理一模一样。

package mainimport ("errors""fmt""net""net/rpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}func main() {arith := new(Arith)rpc.Register(arith)tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)for {conn, err := listener.Accept()if err != nil {continue}rpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)}
}

client

package mainimport ("fmt""log""net/rpc"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}func main() {service := "127.0.0.1:1234"client, err := rpc.Dial("tcp", service)if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, &quot)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)
}

crawler.go

crawler.go

感觉这个例子太晦涩。有点强行把几个原理在一个例子讲明

6.824 RPC lesson2 2020(一)相关推荐

  1. 6.824 RPC lesson2 2020(二)

    Use RPC to make a kv storage server Go example: kv.go on schedule page A toy key/value storage serve ...

  2. 6.824 Raft lesson4 2020(一)

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

  3. 6.824 MapReduce lab1 2020(一)

    文章目录 MIT 6.824 分布式系统 lab1:MapReduce Notes wordcount's MapReduce Model look like a simple sequential ...

  4. 6.824-Distributed Transactions

    Principles of Computer System Design An Introduction Chapter 9 Atomicity: All-or-Nothing and Before- ...

  5. session.merge 缓存不更新_这几个缓存更新的设计你都知道吗?

    前言 Hello,everybody,我是asong,上一篇文章我们一起聊一聊了面试中几个常见的缓存问题,今天我依然聊一聊缓存,不过今天我们聊的不是面试了,我们一起来看一看我们在系统中缓存更新的设计, ...

  6. Windows 7 x64 SP1 安装 Windows Edge 浏览器

    我需要在电脑上安装一个能录音录像的软件,找到了一个安装包但需要使用微软的 OneDrive 转存过来才能下载,我想直接使用浏览器同步 OneDrive ,因此需要安装 Microsoft Edge 浏 ...

  7. go-elasticSearch实战篇,带你学会elasticSearch的增删改查

    前言 哈喽,everybody,这是go-elastic学习系列教程第二篇文章.上一篇我们学习了ElasticSearch基础,如果还不懂基础的,可以先看一看上一篇文章,传送门.这一篇我们开始实战,写 ...

  8. go-ElasticSearch实战篇(二)

    前言 哈喽,everybody,这是go-elastic学习系列教程第二篇文章.????上一篇我们学习了ElasticSearch基础,如果还不懂基础的,可以先看一看上一篇文章,????传送门.这一篇 ...

  9. 咖说 | 富达:企业财资为何该考虑数字货币

    " 收集一众行业大咖观点,探索区块链商业及应用.百家争鸣.百花齐放,说理.解密.预测和八卦,了解行业内幕,看咖说就够了! 投稿请联系 :tougao@conflux-chain.org 本文 ...

最新文章

  1. 如果C++程序要调用已经被编译后的C函数,该怎么办?
  2. 蓝牙连接不上车要hfp_科普|蓝牙耳机小知识,这些都不知道难怪你选不到好的蓝牙耳机...
  3. c语言程序设计华北电力大学,华北电力大学-《C语言程序设计》复习资料.pdf
  4. python冒泡排序时间复杂度_Python算法中的时间复杂度问题
  5. 简单的php文件上传实例
  6. 数据统一管理--企业决策分析之刚需
  7. markdown快速创建表格及内容工具
  8. android中的适配器模式
  9. vs2012安装出错解决方案
  10. python移动平均算法_移动平均算法
  11. PIL图像处理-二值化
  12. 你的微信聊天记录!终于能云端备份了
  13. python抽奖小程序_python实现简单的抽奖小程序,抽奖的内容从文件里面读取
  14. PROXMOX VE备份还原
  15. 山下英子(日)《断舍离》读书笔记
  16. 情人节表白专用代码,希望你成功
  17. 泛融等多家业界权威通力合作,联合信通院发布《区块链供应链金融白皮书》
  18. Redis 缓存穿透、击穿、雪崩现象及解决方案
  19. 高龄白菜java学习第101天(java数据结构和算法(19))
  20. 如何把数据分析做“精准”?

热门文章

  1. 6.11python 作业
  2. jQuery(一)初识
  3. Navicat Premium创建MySQL存储过程
  4. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
  5. PL/SQL详细介绍
  6. qt 试用 (3)配置编译源代码及调试
  7. 【转贴备忘】[教程]iPhone 實機開發 Part 1 - HelloWorld
  8. java项目中外接扫描仪无法使用_java – 扫描仪行不可用错误
  9. php中trim的用法和例子,PHP ltrim()用法及代码示例
  10. amoeba mysql读写分离_Mysql 实现读写分离的详细教程(amoeba)