go语言net包rpc远程调用的使用
一、基于http的RPC
服务端:
package main; import (
"net/rpc"
"net/http"
"log"
) //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC
//go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码 //注意字段必须是导出
type Params struct {
Width, Height int;
} type Rect struct{} //函数必须是导出的
//必须有两个导出类型参数
//第一个参数是接收参数
//第二个参数是返回给客户端参数,必须是指针类型
//函数还要有一个返回值error
func (r *Rect) Area(p Params, ret *int) error {
*ret = p.Width * p.Height;
return nil;
} func (r *Rect) Perimeter(p Params, ret *int) error {
*ret = (p.Width + p.Height) * 2;
return nil;
} func main() {
rect := new(Rect);
//注册一个rect服务
rpc.Register(rect);
//把服务处理绑定到http协议上
rpc.HandleHTTP();
err := http.ListenAndServe(":8080", nil);
if err != nil {
log.Fatal(err);
}
}
客户端:
package main; import (
"net/rpc"
"log"
"fmt"
) type Params struct {
Width, Height int;
} func main() {
//连接远程rpc服务
rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080");
if err != nil {
log.Fatal(err);
}
ret := 0;
//调用远程方法
//注意第三个参数是指针类型
err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret);
if err2 != nil {
log.Fatal(err2);
}
fmt.Println(ret);
err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret);
if err3 != nil {
log.Fatal(err3);
}
fmt.Println(ret);
}
二、基于tcp的RPC
服务端:
package main; import (
"net"
"log"
"net/rpc"
) //注意字段必须是导出
type Params struct {
Width, Height int;
} type Rect struct{} func (r *Rect) Area(p Params, ret *int) error {
*ret = p.Width * p.Height;
return nil;
} func (r *Rect) Perimeter(p Params, ret *int) error {
*ret = (p.Width + p.Height) * 2;
return nil;
} func chkError(err error) {
if err != nil {
log.Fatal(err);
}
} func main() {
rect := new(Rect);
//注册rpc服务
rpc.Register(rect);
//获取tcpaddr
tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");
chkError(err);
//监听端口
tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);
chkError(err2);
//死循环处理连接请求
for {
conn, err3 := tcplisten.Accept();
if err3 != nil {
continue;
}
//使用goroutine单独处理rpc连接请求
go rpc.ServeConn(conn);
}
}
客户端:
package main; import (
"net/rpc"
"fmt"
"log"
) type Params struct {
Width, Height int;
} func main() {
//连接远程rpc服务
//这里使用Dial,http方式使用DialHTTP,其他代码都一样
rpc, err := rpc.Dial("tcp", "127.0.0.1:8080");
if err != nil {
log.Fatal(err);
}
ret := 0;
//调用远程方法
//注意第三个参数是指针类型
err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret);
if err2 != nil {
log.Fatal(err2);
}
fmt.Println(ret);
err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret);
if err3 != nil {
log.Fatal(err3);
}
fmt.Println(ret);
}
三、JSON RPC 方式
jsonrpc方式是数据编码采用了json,而不是gob编码。
服务端:
package main; import (
"net"
"log"
"net/rpc"
"net/rpc/jsonrpc"
) //注意字段必须是导出
type Params struct {
Width, Height int;
} type Rect struct{} func (r *Rect) Area(p Params, ret *int) error {
*ret = p.Width * p.Height;
return nil;
} func (r *Rect) Perimeter(p Params, ret *int) error {
*ret = (p.Width + p.Height) * 2;
return nil;
} func chkError(err error) {
if err != nil {
log.Fatal(err);
}
} func main() {
rect := new(Rect);
//注册rpc服务
rpc.Register(rect);
//获取tcpaddr
tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");
chkError(err);
//监听端口
tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);
chkError(err2);
for {
conn, err3 := tcplisten.Accept();
if err3 != nil {
continue;
}
//使用goroutine单独处理rpc连接请求
//这里使用jsonrpc进行处理
go jsonrpc.ServeConn(conn);
}
}
客户端:
package main; import (
"fmt"
"log"
"net/rpc/jsonrpc"
) type Params struct {
Width, Height int;
} func main() {
//连接远程rpc服务
//这里使用jsonrpc.Dial
rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8080");
if err != nil {
log.Fatal(err);
}
ret := 0;
//调用远程方法
//注意第三个参数是指针类型
err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret);
if err2 != nil {
log.Fatal(err2);
}
fmt.Println(ret);
err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret);
if err3 != nil {
log.Fatal(err3);
}
fmt.Println(ret);
}
go语言net包rpc远程调用的使用的更多相关文章
- 測试JSON RPC远程调用(JSONclient)
#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSonclient Auth ...
- 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)
写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...
- 从0到1:全面理解RPC远程调用
上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...
- Openstack Nova 源码分析 — RPC 远程调用过程
目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...
- rpc远程调用开发
RPC即远程过程调用,适用于集群管理,集群节点就是RPCServer,而我们发起远程调用的web服务器就是RPCClient.所以是少数rpcClient(可能一个)对多个RPCServer(集群节点 ...
- dubbo集成zookeeper rpc远程调用
注:下面使用dubbo依赖的是zookeeper注册中心,这里没有详细的介绍.在配置之前,请自行准备好zookeeper环境. 后续如果写zookeeper的配置会补放链接 添加Gradle依赖 co ...
- 详解RPC远程调用和消息队列MQ的区别
PC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). RP ...
- 基于http协议实现RPC远程调用
今天简单说一下基本Http协议来实现RPC框架~ 基于Http协议实现RPC框架: 优点: 1.简单.实用.开发方便 缺点: 1.性能不是很稳定,在海量数据时,完全顶不住,容易宕机 2.因为不是走的注 ...
- netcore 基于 DispatchProxy 实现一个简单Rpc远程调用
前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不 ...
随机推荐
- Reduction: the word AT
Reduction: the word AT Share Tweet Share Tagged With: AT Reduction Study the AT reduction. There ar ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)
Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...
- 吴裕雄 python 机器学习-Logistic(1)
import numpy as np def loadDataSet(): dataMat = [] labelMat = [] fr = open('D:\\LearningResource\\ma ...
- Spark MLlib特征处理:OneHotEncoder OneHot编码 ---原理及实战
http://m.blog.csdn.net/wangpei1949/article/details/53140372 Spark MLlib特征处理:OneHotEncoder OneHot编码 - ...
- OpenCV Python : No drawMatchesknn function
2 down vote The functions cv2.drawMatches and cv2.drawMatchesKnn are not available in newer versions ...
- UMD模式的js
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD define( ...
- Navicat的外键设置
“名”:可以不填,你一会保存成功系统会自动生成. “栏位”:这个子表哪个键设置为外键. “参考数据库”:外键关联的数据库. “参考表”:关联的父表 “参考栏位”:父表关联的的字段,一般是id “删除时 ...
- python网络编程之开启进程的方式
标签(空格分隔): 开启进程的方式 multiprocessing模块介绍: python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在pyth ...
- [Android] TextView长按复制实现方法小结(转载)
这是别人写的,既然别人总结过了,那我就不花时间研究这个了,但往后会补充一些使用经验之类的 原文地址:http://blog.csdn.net/stzy00/article/details/414778 ...
- 使用scaleBitmap类缩放和拉伸
使用scaleBitmap类缩放和拉伸 位图,画架,图形,小贴士我们一直在寻找在createJS中优化.简化或创建更好工作流的方法,scaleBitmap就是一个很好的例子.使用旧的flash方法,在 ...