golang rpc介绍
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)
}
}
golang rpc介绍的更多相关文章
- golang RPC通信读写超时设置
golang RPC通信中,有时候就怕读写hang住. 那是否可以设置读写超时呢? 1.方案一: 设置连接的读写超时 1.1 client RPC通信基于底层网络通信,可以通过设置connection ...
- RPC介绍以及编程
1 RPC介绍 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协 议. RPC采用客 ...
- Golang RPC 性能测试
Golang RPC 性能测试 | KDF5000 http://kdf5000.com/2017/03/28/Golang-RPC-性能测试/
- RPC介绍
转载http://blog.csdn.net/mindfloating/article/details/39474123/ 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...
- golang rpc 简单范例
RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 它的工作流程如下图: go ...
- golang rpc demo
RPC工作流程图 1.调用客户端句柄:执行传送参数 2.调用本地系统内核发送网络消息 3.消息传送到远程主机 4.服务器句柄得到消息并取得参数 5.执行远程过程 6.执行的过程将结果返回服务器句柄 7 ...
- 【转】RPC介绍
转自:http://www.cnblogs.com/Vincentlu/p/4185299.html 摘要: RPC——Remote Procedure Call Protocol,这是广义上的解释, ...
- golang goroutine 介绍
Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的. 反正现在不是抢占式的.) 不能设置 ...
- Thrift & RPC介绍
在学习thrift之前,先来看一下什么是rpc rpc远程过程调用,通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供 ...
随机推荐
- codeforces569B
Inventory CodeForces - 569B Companies always have a lot of equipment, furniture and other things. Al ...
- MySQL官方教程及各平台的安装教程和配置详解入口
官方文档入口: https://dev.mysql.com/doc/ 一般选择MySQL服务器版本入口: https://dev.mysql.com/doc/refman/en/ 在右侧有版本选择: ...
- Linux 部署KVM虚拟化平台
简单介绍 KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案.KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Lin ...
- codechef EBAIT Election Bait【欧几里得算法】
题目分析: 欧几里得算法来处理一类分数问题,分数问题的形式如下 $\frac{a}{b} < \frac{p}{q} < \frac{c}{d}$ 当a=0时,答案等于$\frac{1}{ ...
- 【XSY1545】直径 虚树 DP
题目大意 给你一棵\(n\)个点的树,另外还有\(m\)棵树,第\(i\)棵树与原树的以\(r_i\)为根的子树形态相同.这\(m\)棵树之间也有连边,组成一颗大树.求这棵大树的直径长度. \(n ...
- 【CF1009F】Dominant Indices(长链剖分)
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...
- 【Luogu3602】Koishi Loves Segments(贪心)
[Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...
- 【BZOJ5197】Gambling Guide (最短路,期望)
[BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...
- Nginx简易编译安装
1.下载Nginx: http://nginx.org/download/nginx-1.6.3.tar.gz 2.安装Pcre.Zlib.Openssl等相关组件: [root@track ngin ...
- QML-开发中遇到的错误收集
作者:狐狸家的鱼 关于一个前端来做qml界面开发,不会写cpp又只能大概看懂意思,遇到的很多问题都不知道怎么解决而急得拔头发. 遇到的问题都是我这种菜鸟渣渣才会导致的问题,写下解决过程方便以后查看. ...