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采用客户机/服务器模式.请求程序就是一个客户机,而服务提供 ...
随机推荐
- 英特尔DRM内核驱动程序默认启用PSR2省电功能
导读 英特尔DRM/KMS内核驱动程序很快就会启用PSR2面板自刷新功能,以便在英特尔支持的超极本/笔记本电脑上实现更多节能. 一段时间以来,英特尔的Direct Rendering Manager驱 ...
- python命令里运行正确但是pycharm里面运行就是报错的问题
这两天在学习爬虫,第一步就是 import scrapy class StackOverflowSpider(scrapy.Spider): 结果一直报错,说是scrapy没有spider这个方法,各 ...
- MySQL官方教程及各平台的安装教程和配置详解入口
官方文档入口: https://dev.mysql.com/doc/ 一般选择MySQL服务器版本入口: https://dev.mysql.com/doc/refman/en/ 在右侧有版本选择: ...
- .net core 2.0 Redis的基本使用
存Session 先配置`appsetting.json`文件 "ConnectionStrings": { "Redis": "ip:6379,ab ...
- [51Nod 1584] 加权约数和
Description 在整理以前的试题时,他发现了这样一道题目:"求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和.&quo ...
- 【QML与C++混合编程】用QVariantList传递数组类型成员
2017.5.8 更新:Record类要用指针,QObject 不能有拷贝函数. 我有一个C++中自定义的ReaderModel,继承自QAbstractListModel类,传递给了QML. 它的m ...
- python学习日记(数据结构习题)
元素分类 有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.即: {'k1' ...
- Linux iptables设置
先举例子说明,若服务器网卡: eth0 10.10.0.100 eth0:0 10.10.0.200 eth0:1 10.10.0.201 eth0:2 10.10.0.202 只允许10.10.0. ...
- python3 集合set
set是一种集合的数据类型,使用{}表示 集合中元素是无序的,并且不可重复,集合最重要的作用就是可以去重 set是不可哈希的,set中的元素必须是可哈希的 可以切片,可以迭代 交集.并集.差集.对称差 ...
- ftp:linux下利用shell脚本添加虚拟用户并赋予权限
首先ftp配置应为虚拟用户登录模式 用户密码文本目录为/etc/vsftpd/vftpuser,代码如下: #!/bin/bash # ];then username=$ password=$ hom ...