文档章节

Go 中使用 RPC

兔之
 兔之
发布于 2017/03/23 11:04
字数 276
阅读 8
收藏 0

做 MIT-6.824 的 Lab 1 MapReduce 任务,Master 和 Worker 之间通信使用 RPC 调用。写一个 Demo 熟悉一下。

示例

package main

import "net"
import "net/rpc"
import "net/http"
import "errors"
import "log"
import "fmt"

type Args struct {
	A, B int
}

type Qutient struct {
	Quo, Rem int
}

// 别名
type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

func (t* Arith) Divide(args *Args, quo *Qutient) error {
	if args.B == 0 {
		return errors.New("divide by zero")
	}
	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.B
	return nil
}


func main() {
	arith := new(Arith)
	rpc.Register(arith)
	rpc.HandleHTTP()
	l, e := net.Listen("tcp", ":1234")
	if e != nil {
		log.Fatal("listen error:", e)
	}
	go http.Serve(l, nil)

	// 调用
	client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}

	args := &Args{7,8}
	var reply int
	err2 := client.Call("Arith.Multiply", args, &reply)
	if err2 != nil {
		log.Fatal("Arith error:", err2)
	}

	fmt.Printf("Arith: %d*%d=%d \n", args.A, args.B, reply)
}

注意的地方

1、Go 语言里可以使用 type 关键字来把一个类型来转换成另外一个类型而保持数据的本质不变。代码中的 Arith 是另外一种类型,量纲上是数字。

2、Go 中的 methods 是一个包含了接受者的函数。

参考

http://nil.csail.mit.edu/6.824/2015/labs/lab-1.html

http://www.cnblogs.com/yjf512/archive/2013/02/28/2937261.html

https://golang.org/pkg/net/rpc/

© 著作权归作者所有

上一篇: Scala 解析 URL
兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
基于Netty的高性能JAVA的RPC框架

前言 今年7月份左右报名参加了阿里巴巴组织的高性能中间件挑战赛,这次比赛不像以往的比赛,是从一个工程的视角来比赛的。 这个比赛有两个赛题,第一题是实现一个RPC框架,第二道题是实现一个...

zhujunxxxxx
2015/09/26
0
0
RabbitMQ入门(6)--远程调用

远程过程调用(RPC) (使用Java客户端) 在指南的第二部分,我们学习了如何使用工作队列将耗时的任务分布到多个工作者中。 但是假如我们需要调用远端计算机的函数,等待结果呢?好吧,这又是另一...

-悟空-
2015/02/24
4.4K
0
Java for Web学习笔记(九四):消息和集群(9)RabbitMQ和消息模式(下)

例子:RPC的实现 这是一个通过AMQP使用RPC的例子,RPC是个同步的处理,需要等待响应。在实际应用需要特别消息,server可能性能很慢,server可能关闭。我们是否一定要使用RPC,是否可以用异步...

flowingflying
2017/11/12
0
0
如何为分布式系统优雅的更换RPC

为啥需要更换RPC? 很多小伙伴都遇到过需要为分布式系统调用更换RPC的问题,为什么会遇到这种事呢?其实,在系统搭建初期,需求简单,架构简单,最重要的是请求量也少,所以很多系统都采用快速...

Java团长17
2018/07/11
0
0
RabbitMQ学习系列(五): RPC 远程过程调用

前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用。不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/category/855479.html 不过,最近有朋...

andrewniu
2018/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【2019年8月版本】OCP 071认证考试最新版本的考试原题-第9题

Choose three Which three statements are true about views in an Orade batabase? A) A SELECT statement cannot contain a where clause when querying a view contaning a WHERE clause ......

oschina_5359
20分钟前
4
0
[JSON].connectionValue()

本文转载于:专业的前端网站➭[JSON].connectionValue() 语法: [JSON].connectionValue() 说明: 将对象的所有键值接连成新的字符串值 返回: [String] 示例: Set a = toJson()c = Array(1,2,...

前端老手
21分钟前
4
0
云计算给大数据分析工具带来了什么

如果大数据是一块蛋糕,那么大数据分析工具就是切蛋糕的刀叉。人们都期待着能用“刀叉”从大数据中挖出自己想要的“价值”,因此大数据分析工具被人们寄予厚望。而云计算技术的兴起似乎又给大...

青果云小潘
23分钟前
4
0
centOS7下es的使用

安装启动es7.4.0 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.4.0docker run -d -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elast......

无畏的老巨人
31分钟前
4
0
iptables删除命令中的相关问题

最近在做一个中间件的配置工作,在配置iptables的时候,当用户想删除EIP(即释放当前连接),发现使用iptables的相关命令会提示错误。iptables: Bad rule (does a matching rule exist in t...

xiangyunyan
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部