首页 > 其他分享 >golang 实现 RPC(远程过程调⽤实例)

golang 实现 RPC(远程过程调⽤实例)

时间:2023-07-22 15:36:35浏览次数:32  
标签:Args websocket err int args golang RPC 实例 Arith

golang 实现 RPC

   前提概要,先了解几个概念,websocket简介

什么是websocket
  WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
Websocket是一个持久化的协议
websocket的原理
  websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"
websocket的心跳机制和重连机制
  心跳机制:客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客户端就会收到消息,若没收到,则说明连接断开,此时,客户端就要主动重连,完成一个周期

断线重连:若某时间段内客户端发送了消息,而服务端未返回,则认定为断线;这个时候会触发到websocket中的onclose事件,需要重新连接服务.
————————————————

一、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, ")
	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 ) 查看运行结果

 

     

标签:Args,websocket,err,int,args,golang,RPC,实例,Arith
From: https://www.cnblogs.com/Gaimo/p/17573439.html

相关文章

  • C# 实现抓取财经网站页面内容的实例方法
    ​ protectedvoidEnter_Click(objectsender,EventArgse)        {            WebClientwe=newWebClient();  //主要使用WebClient类            byte[]myDataBuffer;            myDataBuffer=we.DownloadData......
  • c#不安装excle创建表格的实例
    ​  使用c#创建excel的示例,刚时给出了不安装excel也可创建excel的方法,需要的朋友可以参考学习网上的列子学习下下//创建excelobjectmissing=System.Reflection.Missing.Value;Excel.Applicationapp=newExcel.Application();app.Application.Workbooks.Add(true);......
  • Golang 中 Gin 框架开发学习记录 ——(二)
    4、响应页面  首先创建template文件夹将需要的hmtl文件放在里面,然后编写hmtl<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>我的GOweb页面</title><linkrel="stylesheet"href=&......
  • linux Vim配置Golang语言环境
    下载vim要配置Linux上的Vim,可以按照以下步骤进行操作:打开终端并运行以下命令安装Vim:sudoapt-getupdatesudoapt-getinstallvim12在主目录下创建.vimrc文件:cd~touch.vimrc12编辑.vimrc文件并添加您想要的配置选项。例如,您可以添加以下行以启用语法高亮和......
  • moveable实例学习地址
    https://daybrush.com/moveable/storybook/?path=/story/able-combination--combination-draggable-resizable-rotatble支持大部分主流开发语言的实例,废话不多说,直接看图。 ......
  • Golang中Gin框架开发学习记录——(一)
    1、环境配置    在GO语言中,使用"goget"命令获取相关包"goget"命令的作用与“gitclone”类似,这里使用:goget-ugithub.com/gin-gonic/gin来获取,相关代理问题可以参考以下链接:(19条消息)解决GO安装gin框架(goget-ugithub.com/gin-gonic/gin)超时问......
  • LECTOR 621阅读器用于料盘读码和筛选调试实例
    第一部分:现场需求/问题描述 客户样品为卷料盘,料盘上有一张白色标签和一个粉色标签,白色标签上有4个一维码及一个二维码(QR码),粉色标签上有一个一维码 客户要求静态读取粉色标签上一维码和白色标签QR码,客户要求在没有粉色标签的时候输出二维码,在有粉色标签的情况下既输......
  • (转载) 支撑微博千亿调用的轻量级RPC框架:Motan
    编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由张雷在高可用架构群分享。张雷,新浪微博技术专家,MotanRPC框架技术负责人。2013年加入新浪微博,作为核心技术成员参与微博RPC服务化、混合云等多个重点项目,当前负责MotanRPC框架的维护与架构改进。专注于高可用架......
  • RedisTemplate 泛型不同 指向的是同一个实例吗
    RedisTemplate泛型不同指向的是同一个实例吗在使用RedisTemplate时,我们经常会遇到需要指定不同数据类型的情况。比如,我们可能需要将某个对象存储到Redis中,并且需要使用不同的数据类型进行序列化和反序列化。那么,RedisTemplate在这种情况下会创建多个实例吗?本文将解答这个问......
  • hyperf 创建 JSON RPC 服务
    JSONRPC服务hyperf框架为PHP打开了微服务的大门,而服务之间相互调用,又以RPC为基础。所以这个章节非常重要。但官方文档还是有些坑的,我以前就在这儿踩过坑。这里省略了接口类,只保留最主要的部分。 安装依赖composerrequirehyperf/json-rpccomposerrequirehyperf/rp......