首页 > 其他分享 >golang实现RPC

golang实现RPC

时间:2023-04-22 21:14:21浏览次数:42  
标签:Args err 实现 args golang int RPC Arith go

 

 

一、RPC工作流程:
摘自《go web编程》

二、go支持三个级别的RPC( HTTP,TCP,JSONRPC)

三、实现http的RPC实例:

3.1 GO RPC的函数只有符合以下条件才能被远程访问

  • 函数必须是首字母是大写
  • 必须有两个首字母大写的参数
  • 第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
  • 函数还要有一个返回值error
    func (t *T)MethodName(arg1 T1, returnArg *T2)error

3.2 DEMO
3.2.1 server端

package main

import (
	"errors"
	"fmt"
	"net/http"
	"net/rpc"
)

//参数
type Args struct {
	A, B int
}

//结果
type Quotient struct {
	Quo int //求商
	Rem int //求余数
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

func (t *Arith) Divide(args *Args, quo *Quotient) error {
	if args.B == 0 {
		return errors.New("divide by zero")
	}

	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.B

	return nil
}

func main() {
	arith := new(Arith)

	rpc.Register(arith)
	rpc.HandleHTTP()
	err := http.ListenAndServe(":1234", nil)
	if err != nil {
		fmt.Println(err.Error())
	}
}

3.2.2 client端

package main

import (
	"fmt"
	"log"
	"net/rpc"
	"os"
)

type Args struct {
	A int
	B int
}

type Quotient struct {
	Quo int
	Rem int
}

func main() {
	if len(os.Args) != 2 {
		fmt.Println("usage:", os.Args[0], "server")
		os.Exit(1)
	}

	serverAddress := os.Args[1]
	client, err := rpc.DialHTTP("tcp", serverAddress+":1234")
	if err != nil {
		log.Fatal("dialing:", err)
	}

	args := Args{17, 8}
	var reply int
	err = client.Call("Arith.Multiply", args, &reply)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Arith:%d*%d=%d\n", args.A, args.B, reply)

	var quot Quotient
	err = client.Call("Arith.Divide", args, &quot)
	fmt.Printf("Arith:%d/%d=%d......%d\n", args.A, args.B, quot.Quo, quot.Rem)

}

3.3.3 启动server( go run main.go) 和 启动client( go run main.go localhost )查看运行结果

  分类: golang

标签:Args,err,实现,args,golang,int,RPC,Arith,go
From: https://www.cnblogs.com/cheyunhua/p/17343943.html

相关文章

  • 原型设计工具比较及实现
    目录一、原型设计工具比较墨刀AxureMockplus二、原型设计1.主题名称2.功能3.界面设计考虑因素4.切换界面5.界面切换流程一、原型设计工具比较1、墨刀适用范围墨刀是一款在线设计编辑原型的工具,特点短平快,适合一些APP,小型pc工程,以及一些频繁迭代的产品。优点墨刀有......
  • ZLMediaKit实现按需拉流时rtsp流地址不对addStreamProxy返回0,接口流id参数踩坑记录
    场景开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放:开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rts基于上面实现拉取视频流预览时,发现当调用api传参时如果更换了rtsp视频流地址,但是没有更改流......
  • QGIS中导入dwg文件并使用GetWKT插件获取绘制元素WKT字符串以及QuickWKT插件实现WKT显
    场景QGIS在Windows上下载安装与建立空间数据库连接:在上面实现QGIS的安装之后,版本是3.26.3。业务需求:1、在dwg文件上绘制多边形区域,并获取绘制区域的wkt字符串。2、根据已知的wkt字符串,在dwg上显示。如果新建多边形图层参考如下QGIS怎样设置简体中文以及新建可编辑的多边形的图层:......
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口
    场景Forest声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restfulapiclient接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口。官网:Forest 代码地址:forest:声明式HTTP客户......
  • ZLMediaKit在Windows上实现Rtmp流媒体服务器以及模拟rtmp推流和http-flv拉流播放
    场景开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放:开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博上面讲了ZLMediaKit在Windows上实现按需拉......
  • OpenCV实现文档扫描识别
    目录1.处理读入图像(1)读入模板图像(2)预处理(3)轮廓检测(4)透视变换2.调用pytesseract工具实现图片内容的提取本文实现了对读入图片进行变换,最后调用pytesseract工具实现图片内容的提取。包含高斯滤波操作去除噪音点、边缘检测、轮廓检测、透视变换、pytesseract文本识别。步......
  • 常见算法Python实现
    一、算法与数据结构1、二叉树1.重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如下图所示的二叉树并输出它的头节......
  • 如何开发一款医疗陪诊小程序:技术实现与流程
    当下,互联网与各行各业已经有了密切的结合,就拿医疗陪诊小程序来说,它是一种通过互联网技术为患者提供在线医疗陪诊服务的应用程序。它可以方便患者进行线上预约、在线咨询、在线购药等操作,为患者提供更加便捷的就医体验。那么,如何开发一款医疗陪诊小程序呢?下面我们来分析一下技术实现......
  • 阿里云1+X云计算开发与运维实战——使用云监控和弹性伸缩实现弹性架构设计
    实验概述本实验会自动创建2台部署了云监控插件的ECS实例。首先,配置负载均衡实例的监听配置,创建ECS实例的自定义镜像。然后,在创建弹性伸缩服务,配置报警任务,将已创建的ECS实例加入伸缩组和负载均衡实例后端。最后,增加ECS的CPU使用率达到100%,通过弹性伸缩服务,自动新建ECS实例并添加到......
  • 旋转图像--Python实现
    给定一个n×n的二维矩阵matrix表示一个图像。请将图像顺时针旋转90度。defrotate(matrix):"""Donotreturnanything,modifymatrixin-placeinstead."""matrix[:]=zip(*matrix[::-1])returnmatrix......