Go语言net包RPC远程调用三种方式http与json-rpc及tcp
作者:秋天的春 发布时间:2024-05-29 22:06:14
标签:net,RPC,远程调用
rpc有多种调用方式,http、json-rpc、tcp
一、服务端
在代码中,启动了三个服务
package main
import (
"log"
"net"
"net/http"
"net/rpc"
"net/rpc/jsonrpc"
"sync"
)
//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)
var wg sync.WaitGroup
wg.Add(3)
go func() {
//把服务处理绑定到http协议上
rpc.HandleHTTP()
err := http.ListenAndServe(":8080", nil)
wg.Wait()
if err != nil {
log.Fatal(err)
defer wg.Done()
}
}()
log.Println("http rpc service start success addr:8080")
go func() {
tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081")
tcplisten, err := net.ListenTCP("tcp", tcpaddr)
if err != nil {
log.Fatal(err)
defer wg.Done()
}
for {
conn, err3 := tcplisten.Accept()
if err3 != nil {
continue
}
go rpc.ServeConn(conn)
}
}()
log.Println("tcp rpc service start success addr:8081")
go func() {
tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8082")
tcplisten, err := net.ListenTCP("tcp", tcpaddr)
if err != nil {
log.Fatal(err)
defer wg.Done()
}
for {
conn, err3 := tcplisten.Accept()
if err3 != nil {
continue
}
go jsonrpc.ServeConn(conn)
}
}()
log.Println("tcp json-rpc service start success addr:8082")
wg.Wait()
}
二、http客户端
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客户端
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:8081")
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客户端
package main
import (
"fmt"
"log"
"net/rpc/jsonrpc"
)
type Params struct {
Width, Height int
}
func main() {
//连接远程rpc服务
rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082")
if err != nil {
log.Fatal(err)
}
ret := 0
//调用远程方法
//注意第三个参数是指针类型
err2 := rpc.Call("Rect.Area", Params{150, 100}, &ret)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println(ret)
err3 := rpc.Call("Rect.Perimeter", Params{150, 100}, &ret)
if err3 != nil {
log.Fatal(err3)
}
fmt.Println(ret)
}
五、运行结果
来源:https://blog.csdn.net/ffzhihua/article/details/83270771
0
投稿
猜你喜欢
- 1.彻底弄懂CSS盒子模式一(DIV布局快速入门)3.彻底弄懂CSS盒子模式三(浮动的表演和清除的自述) 4.彻底弄懂CSS盒子模式四(绝对
- QSpinBox 是一个计数器控件,允许用户选择一个整数值,通过单击向上/向下按钮或按键盘上的上/下箭头来增加/减少当前显示的值,当然用户也
- 本文实例为大家分享了PHP文件操作的具体代码,供大家参考,具体内容如下(1)文件读取file_get_contents( )实例:<?
- 一、JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON建
- PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务本章介绍了许多不
- 最近在做一个小案例的时候遇到了Math.max.apply这么一个用法,之前很少遇到过感觉挺有趣的,就记录一下。1Math.max语法: M
- 本文实例讲述了js+css实现有立体感的按钮式文字竖排菜单效果。分享给大家供大家参考。具体如下:这是一款较不错的竖排菜单,有立体感效果的菜单
- 情感分析(sentiment analysis)是2018年公布的计算机科学技术名词。它可以根据文本内容判断出所代表的含义是积极的还是负面的
- 在我们想要对不同变量进行判断的时候,会分析其中的之间的联系。这种理念同样也被用在实例生活中,最常见到的是做一个地理的热力图。很多人对画热力图
- 1.批量处理所谓的批处理就是批量处理cmd里面的命令。python要想实现批处理功能需要导入os库,然后利用批处理的命令为os.system
- 首先,我的索引结构是酱紫的。
- 1-错误详情cmd下运行net start mysql启动MySQL服务:提示发生系统错误5。拒绝访问。cmd管理员模式运行可以启动MySQ
- 如下所示:for line in file.readlines():line=line.strip('\n')来源:http
- 1. 换源地址# 中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-
- 环境:python3.6 pyqt5只是简单的一个思路,请忽略脆弱的异常防护:# -*- coding: utf-8 -*-import s
- Golang Goroutine和线程的区别 Golang,轻松学习一、Golang Goroutine?当使用者分配足够多的任务,系统能自
- 问题:过滤用户输入中前后多余的空白字符‘ ++++abc123---
- python的requests它是python的一个第三方库,处理URL比urllib这个库要方便的多,并且功能也很丰富。【可以先看4,5表
- create 语句后面的TYPE=MyISAMTYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版
- 单表的唯一查询用:distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在