go rpc

mb5fdb0a4002420 · · 409 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1. code

1.1 data.go

data.go 定义了rpc函数set、get的输入和输出的数据类型

package data


const (

      OK       "OK"

      ErrNoKey = "ErrNoKey"

)


type Err string


type PutArgs struct {

      Key   string

      Value string

}


type PutReply struct {

      Err Err

}


type GetArgs struct {

      Key string

}


type GetReply struct {

      Err   Err

      Value string

}

1.2 server.go

定义了kv结构,并注册到rpc端口

package main


import (

      "fmt"

      "log"

      "net"

      "net/rpc"

      "sync"

      "./data"

)




type KV struct {

      mu   sync.Mutex

      data map[string]string

}


func (kv *KVGet(args *data.GetArgsreply *data.GetReplyerror {


      kv.mu.Lock()

      defer kv.mu.Unlock()


      valok := kv.data[args.Key]

      if ok {

            reply.Err = data.OK

            reply.Value = val

      else {

            reply.Err = data.ErrNoKey

            reply.Value = ""

      }

      fmt.Printf("get(%s)=%s\n",args.Key,val)

      return nil

}


func (kv *KVPut(args *data.PutArgsreply *data.PutReplyerror {

      kv.mu.Lock()

      defer kv.mu.Unlock()


      kv.data[args.Key] = args.Value

      reply.Err = data.OK

      fmt.Printf("put(%s,%s)\n",args.Key,args.Value)

      return nil

}


func main() {

      var kv KV

      kv.data = map[string]string{}

      rpcs := rpc.NewServer()

      rpcs.Register(&kv)

      le := net.Listen("tcp"":1234")

      if e != nil {

            log.Fatal("listen error:"e)

      }


      for {

            connerr := l.Accept()

            if err == nil {

                  go rpcs.ServeConn(conn)

            else {

                  break

            }

      }

}


1.3 client.go

client端远程可以调用server端的函数

package main


import (

      "fmt"

      "log"

      "net/rpc"

      "./data"

)




func connect() *rpc.Client {

      clienterr := rpc.Dial("tcp"":1234")

      if err != nil {

            log.Fatal("dialing:"err)

      }

      return client

}


func get(key stringstring {

      client := connect()

      args := data.GetArgs{"subject"}

      reply := data.GetReply{}

      err := client.Call("KV.Get"&args,&reply)

      if err != nil {

            log.Fatal("error:"err)

      }

      client.Close()

      return reply.Value

}


func put(key stringval string) {

      client := connect()

      args := data.PutArgs{"subject""6.824"}

      reply := data.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"))

}



2 run

liliang@liliang-win:~/rpc$ tree

.

├── client

├── client.go

├── data

   └── data.go

├── server

└── server.go

go build server.go

go build client.go

图片 图片




有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb5fdb0a4002420

查看原文:go rpc

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

409 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传