golang中的RPC调用服务器方法

使用Golang打包jar应用 golang打包功能 阅读详情

原文链接,参考Golang中文文档:http://docscn.studygolang.com/pkg/net/rpc/#NewServer

rpc 包提供了一个方法来通过网络或者其他的I/O连接进入对象的外部方法. 一个server注册一个对象, 标记它成为可见对象类型名字的服务。注册后,对象的外部方法就可以远程调用了。一个server可以注册多个 不同类型的对象,但是却不可以注册多个相同类型的对象。

只有满足这些标准的方法才会被远程调用视为可见;其他的方法都会被忽略:

- 方法是外部可见的。
- 方法有两个参数,参数的类型都是外部可见的。
- 方法的第二个参数是一个指针。
- 方法有返回类型错误

事实上,方法必须看起来类似这样

func (t *T) MethodName(argType T1, replyType *T2) error

T,T1和T2可以被encoding/gob序列化。 不管使用什么编解码,这些要求都要满足。 (在未来,这些要求可能对自定义的编解码会放宽)

方法的第一个参数代表调用者提供的参数;第二个参数代表返回给调用者的参数。方法的返回值,如果是非空的话 就会被作为一个string返回,客户端会error像是被errors.New调用返回的一样。如果error返回的话, 返回的参数将会被送回给客户端。

服务断可以使用ServeConn来处理单个连接上的请求。更通用的方法,服务器可以制造一个网络监听,然后调用 Accept,或者对一个HTTP监听,处理HandleHTTP和http.Serve。

客户端希望使用服务来建立连接,然后在连接上调用NewClient来建立连接。更方便的方法就是调用Dial(DialHTTP) 来建立一个新的网络连接(一个HTTP连接)。客户端获得到的对象有两个方法,Call和Go,指定的参数有:服务和方法 指向参数的指针,接受返回结果的指针。

call方法等待远程调用完成,但Go方法是异步调用call方法,使用Call通道来标志调用完成。

除非有明确制定编解码器,否则默认使用encoding/gob来传输数据。

这是个简单的例子,服务器希望对外服务出Arith对象:

package server

type Args struct {
	A, B int
}

type Quotient struct {
	Quo, 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
}

服务端调用(使用HTTP服务):

arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
	log.Fatal("listen error:", e)
}
go http.Serve(l, nil)

在这个时候,客户端可以看见服务“Arith”,并且有“Arith.Multiply”方法和“Arith.Divide”方法。 调用其中一个,客户端首先连接服务:

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

当它要调用远程服务的时候:

// Synchronous call
args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
	log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

or

// Asynchronous call
quotient := new(Quotient)
divCall := client.Go("Arith.Divide", args, quotient, nil)
replyCall := <-divCall.Done	// will be equal to divCall
// check errors, print, etc.

服务端的实现需要为客户端提供一个简单的,类型安全服务。

也就是当服务端register了某个对象,就可以调用挂在这个对象上的所有方法



golang rpc的一些坑 文章目录前言rpc 前言 好久没有写golang有点生疏,今天一写遇到几个坑,一个是rpc的一些坑,还有一个是结构体初始化的一些坑… rpc rpc都知道是远程系统调用,网上也有不少的例子我就不例举了,这里我们要讲的例子是,rpc除了client可以借用rpc server对外提供的方法进行运算之外,client还可以通过rpc server提供的rpc方法去改server中相应的结构成员变量,如下我只提供了一个方法,这个方法就是更改rpc server上结构体用的 //server package ma 阅读详情

相关推荐

基于 golang 的实现简单的 RPC 版 Watch 功能

本文主要参考《Go 语言高级编程》一书! 在很多系统中都提供了 Watch 监视功能的接口,当系统满足某种条件时 Watch 方法返回监控的结果。在这里我们可以尝试通过 RPC 框架实现一个基本的 Watch 功能。因为 RPC client.send 方法是线程安全的,我们可以通过在不同的 Goroutine 中同时并发阻塞调用 RPC 方法,通过在一个独立的 Goroutine 中调用 Wat...

chunqizhi 1469

golang如何实现rpc服务(基于服务发现)

golang对rpc服务提供了很好地支持,在原生rpc服务的基础上进行简单封装,再加上服务发现功能,就能实现基本的rpc服务功能,可以在此基础上进行优化和完善,以供http服务访问,具体实现如下: 编写服务 建立一个用于数学计算的struct:RemoteMathUtil // MathUtil 用于数学计算 type RemoteMathUtil struct{} // CaculateCircleArea 计算圆的面积 func (m *RemoteMathUtil) CalculateCircleA

xjie_jack的博客 791

golang与java间的json-rpc跨语言调用需要的jar

golang与java间的json-rpc跨语言调用需要的jar

Go rpc调用

RPC原理图 客户端Stub: 客户端存根 服务端Stub: 服务端存根 RPC技术架构 服务端:server.go package main import ( "math" "net" "net/http" "net/rpc" ) type MathUtil struct { } // 该方法向外暴露:提供计算圆形面积的服务 func (mu *MathUtil) CalculateCircleArea(req float32, resp *float32) erro...

weixin_40123451的博客 1428

grpc远程调用完整jar包,google proctoc proctobuf

由于google被墙,完整收集grpc远程调用引用完整jar包,google proctoc proctobuf

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 918

golang调用java——secp256k1

问题描述:项目需要使用secp256k1类型的椭圆曲线进行加解密,客户端是用java实现的,而后台是用golang。问题在于java有secp256k1的标准库,可以生成密钥和加密,通过x509序列化之后传给golang后台,但是golang没有该标准库,无法进行验证。解决方案(两种): 对照java的标准库用golang自行实现可用的椭圆曲线(待定) java实现验证,编成jar包,利用golan

foam的专栏 1万+

⑨【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图

前面的文章已经能够实现在odom坐标系下显示小车模型和里程计数据了,本文加上激光slam必不可少的传感器雷达,先进行测试,然后直接开始建图!

海风的博客 2916

手把手教你用golang撸rpc

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

weixin_36469852的博客 1939

一种基于改进YOLOv8并与ORB-SLAM3融合的动态环境密集点云同步定位与建图(SLAM)方法

文章提出了一种基于改进 YOLOv8 与 ORB-SLAM3 融合的动态环境稠密点云 SLAM 方法,通过引入GSConv 卷积模块和VoVGSCSP 特征融合模块优化 YOLOv8 的轻量性,结合实时目标检测与语义分割技术去除动态特征点,显著提升了动态场景下的位姿估计精度。

2401_87345388的博客 1942

vue中使用video-player视频插件,第一次无法监听父组件穿过来的值解决办法

需求: 页面![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208141906802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FfOTg4OA==,size_16,color_FFFFFF,t_70) 作品清单是从后端请求回来的不同格式的url,前端需求根据后缀动态判断格式,然后对齐进行下载和

A_9888的博客 770

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

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

weixin_43173303的博客 1558

LVGL core theme主题管理(lv_theme.c)

如果打开宏,主题的初始化是在显示设备注册时完成的。整个themes的实现放在目录下面。这里一共有三套主题(basic、default和mono)可供选择或者参考。源码中默认对接的是 default 主题,所以在中,看到的是调用default主题的接口。也就是说,如果需要更换主题,把这里面的接口换掉就可以了。或者要重新做一套主题,参考这些实现修改也就可以了。虽说有三套主题,但逻辑流程是一样的。主要完成两个工作:构造lv_theme_t结构体和初始化默认样多备用(style_init函数内实现)。构造。....

Bigan(安)的博客 3414

Go RPC

proto。

游戏全栈,技术合作 967

Robot Framework 7.0 报告解析

本文深入解析 Robot Framework 7.0 新增的 JSON 报告功能,手把手教你如何从 output.xml 转换为结构清晰的 output.json,并通过 Python 脚本提取关键测试指标。文章附完整示例、命令、解析脚本,支持导出为 CSV 和 Markdown,方便接入可视化看板、群通知和 CI 流程。适用于测试自动化、质量平台建设和回归趋势分析场景。

点点寒彬的博客 267

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3740

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

qq_32421489的博客 1483

vue3:实现飞书扫码授权登录流程+完整示例源码,用户使用飞书移动端扫描飞书登录二维码进行登录后获取用户信息数据,vue3接入飞书登录系统,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码)

vue3飞书扫码登录网页,vue3飞书扫码登录网页,vue3接入飞书扫码登录全流程,Vue3在网页中接入飞书二维码SDK,vue3飞书扫码登录网页,实现用户授权登录的流程,Vue3集成飞书前端JSSDK,对接飞书扫码授权,飞书扫码授权,vue3网站集成飞书登录生成二维码,VUE3用户扫码飞书授权登录,飞书开发-网页应用JSSDK鉴权流程,飞书开放平台自建网页应用登录与免登录,vue3接入二维码SDK将飞书登录的二维码嵌入到网页中,pc后台管理系统接入飞书登录,vue3项目中实现扫码登录飞书,Vue飞书免登录

✅ 精选推荐文章 4394

java 调用golang_golang与java间的json-rpc跨语言调用

关于如何使用golang进行json-rpc的调用,网上虽然有很多的帖子,但都仅仅是golang程序间通信,没有牵涉到跨语言调用的问题。在使用golang开发服务端程序的时候,不可避免的要与其他语言的程序进行交互,特别是json-rpc这的协议,本身就应该是用在不同的平台间的调用上的(因为golang程序间的交流已经有了封闭的用gob编码解码的rpc包了,我们自然而言的会想到用json-rpc来提...

weixin_34644635的博客 1049

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

在php中调用go rpc套接字方法_Go 每日一库之 rpc

简介RPC(Remote Procedure Call)是远程方法调用的缩写,它可以通过网络调用远程对象的方法。Go 标准库net/rpc提供了一个简单、强大且高性能的 RPC 实现。仅需编写很少的代码就能实现 RPC 服务。本文就来介绍一下这个库。快速使用标准库无需安装。由于是网络程序,我们需要编写服务端和客户端两个程序。首先是服务端程序:package main import ( "er...

weixin_39833429的博客 373

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

在php中调用go rpc套接字方法_Go 每日一库之 rpc:这是标准库提供的

简介RPC(Remote Procedure Call)是远程方法调用的缩写,它可以通过网络调用远程对象的方法。Go 标准库net/rpc提供了一个简单、强大且高性能的 RPC 实现。仅需编写很少的代码就能实现 RPC 服务。本文就来介绍一下这个库。快速使用标准库无需安装。由于是网络程序,我们需要编写服务端和客户端两个程序。首先是服务端程序:packagemainimport("error...

weixin_39820910的博客 193

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

golang的jsonRPC调用

package rpcz // first we create a simple golang rpc server based on socket import (     "fmt"     "net"     "net/rpc"     "net/rpc/jsonrpc" ) type Counter struct {     Sum int } func (this *Counter...

quanyy99的博客 1425

Go入门指南-15.9RPC 远程调用

方法的返回值要求是一个 error 类型,所以示例的 net.Error 执行会出错,因此要换成 error 类型(有可能是版本更新造成的,测试使用的 Go 版本为: go1.10.1 )。服务器注册一个对象,通过对象的类型名称暴露这个服务:注册后就可以通过网络或者其他远程客户端的 I/O 连接它的导出方法。服务器可以注册多个不同类型的对象(服务),但是相同的类型注册多个对象的时候会出错。运行的 Go 服务器,并且想以不同的用户去运行你的代码,Brad Fitz 的。,在调用完成后将分配一个新的通道。

qq_45030264的博客 523

golang rpc的两种调用方法

golang的rpc有两种方法进行调用,一种是rpc例子中给的: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package main import ( "net/rpc" "net/http" "lo...

weixin_33735077的博客 294

golang 插件rpc 调用demo

定义RPC接口和方法:首先需要在主程序中定义RPC接口和方法,以供插件调用。RPC接口和方法的定义方式类似于普通的Go函数和方法定义,但需要添加net/rpc包的标记,如rpc.Params和rpc.Results等。编写插件代码:插件代码中需要通过net/rpc包中的Dial函数连接到主程序的RPC服务器,并调用主程序中定义的RPC接口和方法。启动RPC服务器:然后需要在主程序中启动RPC服务器,监听指定的网络地址(如TCP、Unix套接字等),以便接收来自插件的远程调用请求。

WangJinLong_cu的博客 433
上一篇: golang中net包用法
下一篇: golang语言中map的初始化及使用
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值