Golang 使用RPC

golang官方rpc包的使用 RPC(Remote Rrocedure Call,远程过程调用)是一个计算机通信协议。RPC协议假定某些传输协议的存在,如TCP和UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。 RPC采用C/S模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠... 阅读详情

RPC介绍

        远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。

       RPC是一种通讯网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

      RPC是远程过程调用,其调用协议通常包括序列化协议和传输协议,序列化协议有基于传统文本的xml和json,二进制编码的Protobuf和Hessian。传输协议是指其底层网络传输所使用的协议,比如TCP、HTTP。

 

Golang使用RPC

Go自带rpc库

示例1  使用net/rpc库

rpc_server.go

package main


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

//算术运算结构体
type Arith struct {

}

//算数运算请求结构体
type ArithRequest struct {
   A int
   B int
}

//算术运算响应结构体
type ArithResponse struct {
   Pro  int   //乘积
   Quo  int  //商
   Rem  int   //余数
}

//乘法运算
func (a *Arith) Multiply(req  *ArithRequest, res *ArithResponse) error {
   res.Pro = req.A * req.B
   return nil
}


//除法运算
func (a *Arith) Divide(req *ArithRequest, res *ArithResponse) error {
   if req.B == 0 {
      return errors.New("divide by zero")
   }

   res.Quo = req.A / req.B
   res.Rem = req.A % req.B
   return nil
}


func main() {
   rpc.Register(new(Arith))  //注册rpc服务
   rpc.HandleHTTP()   //采用http协议作为rpc通讯协议


   lis,err := net.Listen("tcp",":8095")
   if err != nil {
      log.Fatal("listen error:",err)
   }

   fmt.Fprintf(os.Stdout,"%s","start connection")
   http.Serve(lis,nil)
}

rpc_client.go

package main


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

//算数运算请求结构体
type ArithRequest struct {
   A int
   B int
}

//算术运算响应结构体
type ArithResponse struct {
   Pro  int   //乘积
   Quo  int  //商
   Rem  int   //余数
}

func main() {
   conn,err := rpc.DialHTTP("tcp","127.0.0.1:8095")
   if err != nil {
      log.Fatalln("dailing error:",err)
   }

   req := ArithRequest{9,2}
   var res ArithResponse

   //
   err = conn.Call("Arith.Multiply",&req,&res)
   if err != nil {
      log.Fatalln("arith error:",err)
   }

   fmt.Printf("%d * %d = %d\n",req.A,req.B,res.Pro)

   err = conn.Call("Arith.Divide",&req,&res)
   if err != nil {
      log.Fatalln("arith error:",err)
   }

   fmt.Printf("%d / %d , quo is %d , rem is %d\n",req.A,req.B,res.Quo,res.Rem)
}

 

示例二  使用net/rpc/jsonrpc

rpc_json_server.go

package main


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

//算术运算结构体
type Arith struct {

}

//算数运算请求结构体
type ArithRequest struct {
   A int
   B int
}

//算术运算响应结构体
type ArithResponse struct {
   Pro  int   //乘积
   Quo  int  //商
   Rem  int   //余数
}

//乘法运算
func (a *Arith) Multiply(req  *ArithRequest, res *ArithResponse) error {
   res.Pro = req.A * req.B
   return nil
}


//除法运算
func (a *Arith) Divide(req *ArithRequest, res *ArithResponse) error {
   if req.B == 0 {
      return errors.New("divide by zero")
   }

   res.Quo = req.A / req.B
   res.Rem = req.A % req.B
   return nil
}


func main() {
   rpc.Register(new(Arith))  //注册rpc服务

   lis,err := net.Listen("tcp",":8096")
   if err != nil {
      log.Fatal("listen error:",err)
   }

   fmt.Fprintf(os.Stdout,"%s","start connection")

   for {
      conn,err := lis.Accept()   //接受客户端的连接
      if err != nil {
         continue
      }

      fmt.Printf("receive client connect %s \n",conn.RemoteAddr())

      go func(conn net.Conn) {
         fmt.Fprintf(os.Stdout,"%s","new client is coming \n")
         jsonrpc.ServeConn(conn)
      }(conn)
   }
}

 

rpc_json_client.go

package main


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

//算数运算请求结构体
type ArithRequest struct {
   A int
   B int
}

//算术运算响应结构体
type ArithResponse struct {
   Pro  int   //乘积
   Quo  int  //商
   Rem  int   //余数
}

func main() {
   conn,err := jsonrpc.Dial("tcp","127.0.0.1:8096")
   if err != nil {
      log.Fatalln("dailing error:",err)
   }

   req := ArithRequest{9,2}
   var res ArithResponse

  
   err = conn.Call("Arith.Multiply",&req,&res)
   if err != nil {
      log.Fatalln("arith error:",err)
   }

   fmt.Printf("%d * %d = %d\n",req.A,req.B,res.Pro)

   err = conn.Call("Arith.Divide",&req,&res)
   if err != nil {
      log.Fatalln("arith error:",err)
   }

   fmt.Printf("%d / %d , quo is %d , rem is %d\n",req.A,req.B,res.Quo,res.Rem)
}

 

golang自带的RPC库只提供了一些简单的功能,如果想要在微服务框架中使用RPC,最好使用RPC框架

Golang常用的RPC库有gRPC、RPCX等

go原生rpc包的使用:传递数据的载体:golang封装的http协议/tcp/jsonrpc rpc是一种通信协议,也就是计算机之间的沟通方式,类比http,mysql等,计算机之间通信是网络连接,tcp/ip协议里一个网络连接包含五元组信息-协议-端口-ip,rpc通过在一个网络连接上设置stub,监控这个连接的rpc请求,一般情况rpc的server端绑定的stub的载体有:1.http协议上,监听所有的http连接(指定server端ip,协议,端口),所有通过http协议过来的连接... 阅读详情

相关推荐

golang使用rabbitmq(六)RPC

之前的章节都是在说一方发指令,另一方执行这种情况,指令发送者不关系指令的完成情况,或者不需要阻塞去获得结果,结果异步通知。 但很多时候是需要阻塞得去获得执行结果的,比如http的请求。 在rabbitmq使用RPC的关键就是ReplyTo属性 err = ch.ExchangeDeclare("rpc_topic", amqp.ExchangeTopic, true, false, false, ...

独自登高楼 望断天涯路 1556

golang实现rpc方法一:使用net/rpc库【不能跨平台】

通过官方库net/rpc实现rpc远程进程调用非常方便,并且实现还是比较简单的,但是有一个缺点就是不能跨平台。

lianxuhanshu_的博客 1155

metasocks:Go lang上的多Tor袜子代理

元袜 Go lang上的多Tor袜子代理

golang python rpc_golang实现RPC的几种方式

什么是RPC远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程调用或远程方法调用。维基百科:远程过程调用用通俗易懂的语言描述就是:RPC允许跨机器、跨语言调用计算机程序方法。打个比方,我用go语...

weixin_39860260的博客 633

CAB单片机开发指南

CAB单片机开发使用指南,IDE安装及烧录注意事项

Zoebuxiangtian的博客 1558

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

golang学习3:标准库中的rpc

RPC RPC是Remote Procedure Call Protocol三个单词首字母的缩写,翻译过来叫远程过程调用协议。 故明思议,也就是在本地调用远程的函数,这里的远程是相对于本地函数调用来讲的。 既然是远程了,一般就需要使用网络通信,客户端把要调用的方法和参数传过去,传过去之前这些参数要进行序列化从而转化为适合网络传输的格式,而服务端接收后需要进行相反的解码动作,也就是反序列化,从而得到程序使用的格式。处理后,返回的结果同样先序列化再反序列化传回给客户端,从而完成一次交互。 逻辑上讲于本地调用无异

yuanlulu的博客 609

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

手把手教你用golang撸rpc

引言 "微服务"这个概念想必不用我说大家都知道,就算没接触过也听说过。简单来说就是以前系统中的,用户,搜索,内容,等等模块都在一起,这样会导致代码「越来越冗余,越来越难维护」,所以往往需要拆分这些服务,微服务在拆分的时候,会根据业务功能模块把一个单体的应用拆分成许多个独立的项目,每个项目完成一部分的业务功能,然后独立开发和部署。这些独立的项目就成为一个微服务。进而构成一个「服务集群」。看下面两张图可能会对微服务的概念更加直观 单体服务 单体服务 微服务 微服务 RPC介绍 微服务中很重要的一个内容就是「RP

weixin_36469852的博客 1939

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 376

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 309

golang RPC包的使用和源码学习(上):基本原理和简单使用

本篇文章旨在通过学习rpc包和github上的一个rpc小项目,熟悉和学习golang中各个包的使用。

u012830303的博客 552

(2-4-01)目标检测与分割:地面提取(1)

请看下面的例子,生成了虚拟 LiDAR 点云数据,然后使用 DBSCAN 聚类方法进行 LiDAR 地面提取,并根据聚类结果可视化地面和非地面点云。首先生成虚拟 LiDAR 点云数据,然后基于设定的高程阈值进行地面提取,并通过 Open3D 可视化地面和非地面点云。地面提取是LiDAR(激光雷达)数据处理中的一个重要步骤,其目标是从点云数据中分离出地面点,即地面表面上的点。LiDAR点云数据通常包含地面点和非地面点(例如建筑物、树木等),地面提取的目标是从这些点中准确识别和提取地面点。

码农三叔 703

golang的rpc使用/ go实现简单的基础的微服务

在golang中实现RPC非常简单,有封装好的官方库和一些第三方库提供支持。 golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp或http数据传输方式,由于其他语言不支持gob编解码方式,所以使用net/rpc库实现的RPC方法没办法进行跨语言调用。 golang官方还提供了net/rpc/jsonrpc库实现RPC方法,JSON RPC采用JSON进行数据编...

u013862108的博客 1027

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3507

RK3588开发笔记-5G模块(SIM8200、广和通FM160、移远RM500U)调试笔记

RK3588 CPU提供了丰富的外设接口,本文主要介绍通过usb3.0接口驱动5G模块来实现5g无线数据传输功能。在物联网和边缘计算领域,5G网络支持的高速率、低延时连接为应用带来了更多可能性。RK3588作为一款高性能SoC,适合用于5G联网应用。SIM8200广和通FM160和移远RM500U。在RK3588上调试5G模块可以为设备提供稳定的高速联网能力。本文介绍了如何配置和调试SIM8200、广和通FM160和移远RM500U模块,通过AT指令和QMI/MBIM工具实现5G数据连接。

flypig has a dream! 2676

【Go】Golang使用反射实现RPC函数调用

Golang使用反射实现简单的单向RPC函数调用

vosats的博客 803

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Go语言中RPC使用步骤

Go语言学习之RPC使用

weixin_41335923的博客 4017

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

go使用twirp开发rpc

go使用twirp开发rpctwirp简介安装开发实现rpc twirp简介 twirp是谷歌开源的rpc框架,默认支持golang并提供其他语言的实现版本,使用proto进行rpc定义开发。 安装 安装proto插件和twirp插件 go get github.com/twitchtv/twirp/protoc-gen-twirp go get github.com/golang/protobuf/protoc-gen-go 开发 编写proto文件//文件名test.proto syntax = "

weixin_44627989的博客 513

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)

主要介绍了go-ethereum中的json rpc的基本使用方式

o0o 1242

Go 中 RPC 的使用教程

RPC(Remote Procedure Call)是一种允许程序调用远程服务器上函数的方法,调用过程对于开发者来说像是调用本地函数一样方便。Go 语言自带了强大的net/rpc库,能够让开发者轻松实现基于 Go 的 RPC 服务。本文将介绍 Go 中 RPC 的使用方法,并通过简单示例展示如何搭建 RPC 服务和客户端。RPC(远程过程调用)是一种跨网络通信协议,允许程序在不同的主机上执行代码而不需要明确处理底层网络通信。

上进!努力!!! 1549

golang RPC使用

golang 中使用RPC

zzbjut 7055

【Golang | RPC】使用包net/rpc实现基于http协议的RPC服务

环境: Golang:go1.18.2 linux/amd64前面两篇文章【Golang | RPC】Golang-RPC机制的理解,【Golang | RPC】利用json编解码器实现RPC介绍了基于socket连接,分别采用gob,json作编解码器实现RPC服务。本文基于http协议实现RPC服务,并简单分析原理通过Golang自带的包实现RPC服务。现有下面一种场景:服务端保存着用户的年龄信息,客户端输入姓名,经RPC后获得对应的年龄2.1.1 首先新建项目httpRPC,并创建Server目录,新

土豆 1331

golang tcp粘包 protobuf_Go语言:RPC与Protobuf结合使用

上节课我们使用Golang提供的核心net/rpc库实现了RPC调用编程。本节课继续来看一下RPC和之前所学的Protobuf在编程中的结合实现。需求:假设在一个系统中,有订单模块(Order),其他模块想要实现RPC的远程工程调用,根据订单ID和时间戳可以获取订单信息。如果获取成功就返回相应的订单信息;如果查询不到返回失败信息。现在,我们来进行需求的编程实现。传输数据格式定义在《Go语言微服务理...

weixin_42510222的博客 502

【Go微服务二】go RPC使用教程

RPC RPC简介 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求 服务,而不需要了解底层网络技术的协议。 简单来说,就是跟远程访问或者web请求差不多,都是一个client向远端服务器请求服务返回结果,但是web请求使用的网络协议是http高层协议,而rpc所使用的协议多为TCP,是网络层协议,减少了信息的包装,加快了处理速度。 golang本身有rpc包,可以方便的使用,来构建自己的rpc服务,下边是一个简单是实例,可以

weixin_43173303的博客 1558

RPC是什么?Go语言使用它

RPC是远程过程调用协议的缩写,简单说就是他可以在本地网络下,调用远方的一个进程中的方法。比如我在广州自己的电脑上运行自己写的一个程序,该程序使用了RPC协议,然后就可以调用远在北京的一个程序,该程序当然也使用了RPC协议。这样的话就可以屏蔽了语言的差异,比如本地可以用C或Python语言写,远端可以使用JAVA或GO语言写。 他们之间使用的是网络通信,为了保证数据传输的稳定性和安全性,使用TCP进行连接,所以RPC算是位于传输层和应用层之间。 我们进行网络编程一般使用Socket编程,相比TCP编程,So

名狱的博客 322
上一篇: k8s之Dowanward API详细理解及使用
下一篇: Golang 使用递归实例
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值