golang rpc介绍

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

       rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名。注册之后,对象的导出方法就可以被远程访问。服务端可以注册多个不同类型的对象(服务),但注册具有相同类型的多个对象是错误的。

服务端代码样例:

package rpc

import (
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
	"time"
	"AgentManage/config"
	"github.com/astaxie/beego/logs"
)

func Start() {
	addr := config.AppConfig.RpcAddr

	server := rpc.NewServer()
	server.Register(new(Hbs))

	l, e := net.Listen("tcp", addr)
	if e != nil {
		logs.Error("rpc listen error:", e)
	} else {
		logs.Info("rpc listening", addr)
	}
	defer l.Close()

	for {
		conn, err := l.Accept()
		if err != nil {
			logs.Error("rpc listener accept fail:", err)
			time.Sleep(time.Duration(100) * time.Millisecond)
			continue
		}
		go server.ServeCodec(jsonrpc.NewServerCodec(conn))
	}
}
package rpc

import (
	"github.com/astaxie/beego/logs"
	"AgentManage/models"
	"fmt"
	"time"
)

type HbsRequest struct {
	Hostname  string `json:"hostname"`
	Version   string `json:"version"`
	BuildTime string `json:"build_time"`
}

type HbsReply struct {
	Status  int         `json:"status"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

type Hbs struct{}

func (t *Hbs) HealthCheck(req HbsRequest, reply *HbsReply) error {
	err := models.HeartbeatCreateOrUpdate(req.Hostname, req.Version, req.BuildTime)
	if err != nil {
		logs.Error("rpc error:", req.Hostname, err)
		*reply = HbsReply{
			Status:  -1,
			Message: fmt.Sprint(err),
		}
	}
	*reply = HbsReply{
		Message: "success",
	}
	return nil
}

客户端代码

package main

import (
	"log"
	"net/rpc/jsonrpc"
	"fmt"
	"time"
	"net"
)

type HbsRequest struct {
	Hostname  string    `json:"hostname"`
	Version   string    `json:"version"`
	BuildTime string    `json:"build_time"`
}

type HbsReply struct {
	Status  int         `json:"status"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

func main() {

	// Synchronous call
	for {
		//client, err := jsonrpc.Dial("tcp", "192.168.1.93:36870")
		client, err :=  net.DialTimeout("tcp", "192.168.1.93:36870", 3 * time.Second)
		if err != nil {
			log.Fatal("net.DialTimeout error:", err)
		}
		clientRpc := jsonrpc.NewClient(client)

		args := &HbsRequest{"shhnwangjian1", "1.2", "2018-05-25 09:12:44"}
		reply := HbsReply{}
		err = clientRpc.Call("Hbs.HealthCheck", args, &reply)
		if err != nil {
			log.Fatal("clientRpc.Call error:", err)
		}
		fmt.Println(reply)
		client.Close()
		time.Sleep(10 * time.Second)
	}
}

 


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

本文来自:博客园

感谢作者:shhnwangjian

查看原文:golang rpc介绍

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

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