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",&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) * 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",&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,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",&ret);
	if err3 != nil {
		log.Fatal(err3);
	}
	fmt.Println(ret);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s "strings" import "fmt" var p = fmt.Println func main() { p("Contains: ", s.Contains("test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考