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采用客户机/服务器模式.请求程序就是一个客户机,而服务提供 ...
随机推荐
- Express学习(1) ------Express 入门
Express 是node 第三方框架,大家都知道,框架的意义就在于能大大简化程序地开发.那么我们就看一下Express是怎么简化node程序开发的. 1,用Express写一个hello world ...
- centos安装桌面,下面的几个包缺一不可
yum groupinstall “X window system” yum groupinstall “Desktop” yum groupinstall “Chinese Support” 不然的 ...
- 【XSY1580】Y队列 容斥
题目大意 给你\(n,r\),求第\(n\)个不能被表示为\(a^b(2\leq b\leq r)\)的数 \(n\leq 2\times {10}^{18},r\leq 62\) 题解 我们考虑二分 ...
- mysql中存储字段类型的查询效率
检索性能从快到慢的是(此处是听人说的): 第一:tinyint,smallint,mediumint,int,bigint第二:char,varchar第三:NULL 解释(转载): 整数类型1.TI ...
- opencv 图片剪切
import cv2 as cv import numpy as np # 图片剪切 img = cv.imread('../images/moon.jpg', flags=1) # flags=1读 ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
- js 时间类函数
js 时间类是 Date() var currtime = new Date();// 实例一个时间,是当前时间 接收一个时间戳为参数 var time2=new Date(currtime.get ...
- 【转】从Vue.js源码看异步更新DOM策略及nextTick
在使用vue.js的时候,有时候因为一些特定的业务场景,不得不去操作DOM,比如这样: <template> <div> <div ref="test" ...
- linux deb系 rpm系 配置永久IP
rpm: 1.IP a 查看网卡名 ens256 2.uuidgen ens256 生成UUID 3./etc/sysconfig/network-scripts add ifcfg-ens256 4 ...
- [BOI2007]Mokia 摩基亚(CDQ分治)
upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...