go rpc

运用go标准库写一个rpc例子

服务端

package mainimport ("fmt""net""net/rpc"
)//对象
type Hello struct {
}
//对象方法
func (h *Hello) HelloWorld(name string, resp *string) error {*resp = name + "你好"return nil
}func main() {//1. 注册RPC服务,绑定对象方法;这里采用的是默认的rpc对象err := rpc.RegisterName("hello", new(Hello))if err != nil {fmt.Println("rpc RegisterName error")return}//2. 初始化监听器listener, err := net.Listen("tcp", "127.0.0.1:8800")if err != nil {fmt.Println("net Listen error")return}defer listener.Close()//3.建立连接conn, err := listener.Accept()if err != nil {fmt.Println("listener Accept error")return}defer conn.Close()//4.将连接绑定rpc服务rpc.ServeConn(conn)
}

注意绑定的对象方法,必须有两个参数,第二个参数必须是“指针类型”为传出参数。方法只有一个error类型的返回值。

客户端

package mainimport ("fmt""net/rpc"
)func main() {//建立连接conn, err := rpc.Dial("tcp", "127.0.0.1:8800")if err != nil {fmt.Println("rpc Dial error")return}defer conn.Close()//调用远程函数var resp stringerr = conn.Call("hello.HelloWorld", "李白", &resp)if err != nil {fmt.Println("conn Call error")return}fmt.Println(resp)
}

注意:上面代码中rpc的远程函数调用采用的是golang中特有的序列化包gob,其他语音不能解析。所以,要进行不同语言之间的rpc通信可以采用通用的序列化方式,如json,protobuf

然后,在实际运用中都会对服务端和客户端的再进行封装:
在这里插入图片描述
在这里插入图片描述

protobuf添加rpc服务

在这里插入图片描述
此时使用的protobuf编译指令,将定义好的proto规则和rpc服务生成go代码,需要用到的是grpc

protoc --go_out=. *.proto
protoc --go-grpc_out=. *.proto

举例:
定义proto文件,然后用上面两个命令生成go代码

syntax="proto3";package pb;//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录的
// name 表示生成的go文件所属的包名
option go_package=".;pb";message HelloRequest {string requestName = 1;
}message HelloResponse {string responseMsg = 1;
}service Hello{rpc SayHello(HelloRequest) returns (HelloResponse);
}

服务端:

package mainimport ("context""fmt""google.golang.org/grpc""net""rpc_day01/pb"
)type My struct {pb.UnimplementedHelloServer //必须嵌套这个
}func (m *My) SayHello(c context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {var resp pb.HelloResponseresp.ResponseMsg = req.RequestName + " hello !!"return &resp, nil
}func main() {//1 初始化一个gpc对象grpcServer := grpc.NewServer()//2 注册服务pb.RegisterHelloServer(grpcServer, &My{})//3 设置监听,指定IPlistener, err := net.Listen("tcp", "127.0.0.1:8801")if err != nil {fmt.Println("net Listen error")return}defer listener.Close()//4 启动服务grpcServer.Serve(listener)
}

客户端:

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""log""rpc_day01/pb"
)func main() {//连接grpc服务(无加密)conn, err := grpc.Dial("127.0.0.1:8801", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatal(err)}defer conn.Close()//初始化grpc客户端grpcClient := pb.NewHelloClient(conn)resp, err := grpcClient.SayHello(context.Background(), &pb.HelloRequest{RequestName: "李白"})if err != nil {log.Fatal(err)}fmt.Println(resp.ResponseMsg)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/103263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现货白银投资什么的?

也许很多投资者听说过现货白银,但并不知道它投资的是什么,过程中是如何进行买卖的,也不知道如果参与其中,自己需要承担什么风险,最终的收益会如何。对于上述的这些问题本文,将为大家简单地介绍一下。 虽然现…

前端进阶Html+css09----BFC模型

1.什么是BFC模型 全称是:Block formatting context(块级格式化上下文),是一个独立的布局环境,不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC(Formatting Context)。 块级元素的布…

javaweb01-html、css基础

话不多说,先来一张泳装板鸭镇楼 接上一开篇, 首战以web的三大基石开头(html、css、js),js内容比较多,下一序章讲解,这一章节主要以html和css为主。 目录 一、初始web前端 二、HTML标签结构 三、…

Elasticsearch 常见的简单查询

查看es中有哪些索引 请求方式:GET 请求地址:http://localhost:9200 /_cat/indices?v 参数:无 结果: 查看索引全部数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 参数&a…

29款影音娱乐-视频类应用评测体验报告

为方便开发者更好地衡量APP在同类产品中的表现和竞争力,有针对性地进行产品优化,软件绿色联盟策划了垂类APP评测体验专题,目前已发布了天气类、小说类、教育学习类APP评测体验报告,本期将对影音娱乐类中的视频类APP围绕绿标五大标…

【JMeter】常用线程组设置策略

目录 一、前言 二、单场景基准测试 1.介绍 2.线程组设计 3.测试结果 三、单场景并发测试 1.介绍 2.线程组设计 3.测试结果 四、单场景容量/爬坡测试 1.介绍 2.线程组设计 3.测试结果 五、混合场景容量/并发测试 1.介绍 六、稳定性测试 1.介绍 2.线程组设计 …

Wireshark流量分析例题

目录 前言 一、题目一(1.pcap) 二、题目二(2.pcap) 三、题目三(3.pcap) 四、题目四(4.pcap) 前言 Wireshark流量包分析对于安全来说是很重要的,我们可以通过Wireshark来诊断网络问题,检测网络攻击、监控网络流量以及捕获恶意软件等等 接下来我们…

【NLP】1、BERT | 双向 transformer 预训练语言模型

文章目录 一、背景二、方法 论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 出处:Google 一、背景 在 BERT 之前的语言模型如 GPT 都是单向的模型,但 BERT 认为虽然单向(从左到右预测…

PowerJob的启动及使用

首先,本文中提到的server就是指powerjob-server模块(也就是powerJob的重点之一的调度服务) 一、初始化项目 1. PowerJob的下载 官方文档 2. 导入到IDEA中,下载依赖后,打开powerjob-server模块的a…

nvm安装使用教程

文章目录 下载配置安装最新稳定版 node安装指定版本查看版本切换版本删除版本 常见问题安装node后 显示拒绝访问的问题使用cnpm会报错的问题降低cnpm版本npm镜像 下载 NVM for Windows 下载地址:https://link.juejin.cn/?targethttps%3A%2F%2Fgithub.com%2Fcoreyb…

【云计算】Docker特别版——前端一篇学会

docker学习 文章目录 一、下载安装docker(一)Windows桌面应用安装(二)Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…

SQL 数据库

安装配置 【1】 MySQL安装配置教程(超级详细、保姆级) 【2】 MySQLNavicat安装配置教程(超级详细、保姆级) 学习资料 【戴师兄】SQL入门免费教程 刷题链接:https://share.mubu.com/doc/4BHMMbbvIMb 学习笔记&#xf…

C语言入门 Day_9 条件判断

目录 前言: 1.if判断 2.else判断 3.易错点 4.思维导图 前言: 我们知道比较运算和逻辑运算都会得到一个布尔型的数据,要么为真(true),要么为假(false)。 今天我们来学习真和假在…

什么是软件压力测试?软件压力测试工具和流程有哪些?

软件压力测试 一、含义:软件压力测试是一种测试应用程序性能的方法,通过模拟大量用户并发访问,测试应用程序在压力情况下的表现和响应能力。软件压力测试的目的是发现系统潜在的问题,如内存泄漏、线程锁、资源泄漏等,…

无涯教程-PHP - preg_replace()函数

preg_replace() - 语法 mixed preg_replace (mixed pattern, mixed replacement, mixed string [, int limit [, int &$count]] ); preg_replace()函数的操作与POSIX函数ereg_replace()相同,不同之处在于可以在模式和替换输入参数中使用正则表达式。 可选的输…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介,以及IOC注解 I…

完成出版工作

书籍完成出版,正式上线售卖。若有需要,可在淘宝,当当,京东这些平台上都可以搜索到,书名是《多智能体机器人系统控制及其应用》,提前感谢,封面如下。 至于本专栏,留作大家讨论和书籍…

怎么维护自己的电脑

文章目录 我的电脑日常维护措施维护技巧键盘&屏幕清洁清理磁盘空间控制温度 电脑换电池 无论是学习还是工作,电脑都是IT人必不可少的重要武器,一台好电脑除了自身配置要经得起考验,后期主人对它的维护也是决定它寿命的重要因素&#xff0…

学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

文章目录 课后练习解答需求分解增加KEY3控制代码如下: 第一版代码问题分析Tips:STC-ISP的设置 Tips:定时器实现完整电磁炉显示功能的代码测试流程 总结 课后练习解答 增加按键3,按下后表示启动,选择的对应的功能的LED…

Rust之自动化测试(一):如何编写测试

开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说,“程序测试可以是一种非常有效的方法来显示错误的存在,但它对于显示它们的不存在…