【学习笔记】go-gRPC 初尝试

news2024/9/29 1:28:21

安装protoc

安装地址

找到对应版本的anz安装文件
file

解压,将文件夹移动到goroot目录中,可以通过命令go env查看goroot目录。

如我的goroot目录为D:\Program Files\Go

file

或者移动到自定义目录,并将该目录设置到环境变量中即可。

安装go插件

go本身并不支持protoc,要安装插件获得对应支持。

这里使用go mod 更新插件

在项目目录中

go mod init grpc_study
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

编辑proto文件

syntax="proto3"; //pb版本号
package raftRpc;  //pb包名
option go_package = "./pb"; // 如果编译出现找不到go_package问题,建议添加声明

service TestRpc {
  rpc Testecho (EchoRequest) returns (EchoResponse) {}
}

message EchoRequest {
  string message = 1;
}

message EchoResponse {
  string message = 1;
}

生成.go文件

使用如下命令进行编译
protoc --go_out=. --go-grpc_out=. .\test.proto

会看到执行编译目录下输出两个文件
file

  • test.pb.go主要是对message生成对应的结构体和方法
  • test_grpc.pb.go生成gRPC,主要是对service生成对应的interface接口和方法

使用生成的文件编写服务

服务端

package main

import (
	"context"
	"grpc_study/pb"
	"log"
	"net"

	"google.golang.org/grpc"
)

type server struct {
	// 继承 protoc-gen-go-grpc 生成的服务端代码
	pb.UnimplementedTestRpcServer
}

// SimplePRC 服务端代码
func (s *server) Testecho(ctx context.Context, in *pb.EchoRequest) (*pb.EchoResponse, error) {
	log.Println("client call simpleRPC...")

	log.Println(in)
	return &pb.EchoResponse{Message: "hi! you say " + in.Message}, nil
}

func main() {
	// 监听本地 5678 端口
	listen, err := net.Listen("tcp", ":5678")
	if err != nil {
		log.Fatal(err)
		return
	}

	// 创建 gRPC 服务器
	s := grpc.NewServer()
	// 将实现的接口注册进 gRPC 服务器
	pb.RegisterTestRpcServer(s, &server{})
	log.Println("gRPC server starts running...")
	// 启动 gRPC 服务器
	err = s.Serve(listen)
	if err != nil {
		log.Fatal(err)
		return
	}
}

客户端

package main

import (
	"context"
	"grpc_study/pb"
	"log"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func Testecho(c pb.TestRpcClient) {
	ctx := context.Background()
	// 调用服务端 SimpleRPC 并获取响应
	reply, err := c.Testecho(ctx, &pb.EchoRequest{Message: "hello"})
	if err != nil {
		log.Fatal(err)
	}
	log.Println(reply.GetMessage())
}

func main() {
	// 连接服务端,因为我们没有SSL证书,因此这里需要禁用安全传输
	dial, err := grpc.Dial("127.0.0.1:5678", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
		return
	}
	defer dial.Close()

	conn := pb.NewTestRpcClient(dial)
	Testecho(conn)
}

运行结果

file

附件(有需要自取)

由于防盗链设置,请到原文下载原文连接

参考资料

CSDN : 【Golang | gRPC】使用protoc编译.proto文件
CSDN : gRPC 入门使用教程
CSDN : go导入自定义包

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

混淆矩阵的输出,异常检测可视化(针对二分类)

对于二分类任务: 真阳性(True Positives, TP)为真实值为1,预测值为1,即正确预测出的正样本个数真阴性(True Negatives, TN)为真实值为0,预测值为0,即正确预测出的负样本…

网关(史上最全)

什么是网关 网关,很多地方将网关比如成门,没什么问题,但是需要区分网关与网桥的区别。 网桥工作在数据链路层,在不同或相同类型的LAN之间存储并转发数据帧,必要时进行链路层上的协议转换。可连接两个或多个网络&…

漫画:是喜,还是悲?AI竟帮我们把Office破活干完了

图文原创:亲爱的数据 国产大模型烈火制造。阿里百度字节美团各科技大佬不等闲。 大模型嘛,重大工程,对我等“怀保小民”来说,只关心怎么用,不关心怎么造。 我来介绍一下自己,我是一个写稿男团组合的成员&am…

13、fishhook原理Dobby

一、fishhook原理 1.1 fishhook代码分析 int rebind_symbols(struct rebinding rebindings[], size_t rebindings_nel) {//prepend_rebindings的函数会将整个 rebindings 数组添加到 _rebindings_head 这个链表的头部//Fishhook采用链表的方式来存储每一次调用rebind_symbols…

Java动态代理(JDK/CGLIB)静态代理

Java Guide动态代理阅读笔记。 一、代理模式 代理模式是一种比较好的理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real obiect)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 …

vue2+vue3——36+

vue2vue3——36 尚硅谷vue2vue2 Vue监测数据的原理_数组【18:56】数组vue 查看 没有 set() get()对象 有 get() set() 监测不到 不更新测试 : 数据改了 , 单页面没变 修改数组的 7方法 : filter 不改变原数组, 返回新的 数组 可以替换掉 原数…

逍遥自在学C语言 | 位运算符~的高级用法

前言 在上一篇文章中,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 ——…

linux 安装git(centos7)-yum

文章目录 在 Linux 系统上安装 Git步骤一:使用自带软件管理器安装步骤二:检查 Git步骤三:设置git环境变量 在 Linux 系统上安装 Git Git 是一种分布式版本控制系统,适用于处理从小型到非常大型的项目。在 Linux 系统上&#xff0…

c++11 标准模板(STL)(std::queue)(四)

定义于头文件 <queue> template< class T, class Container std::deque<T> > class queue; std::queue 类是容器适配器&#xff0c;它给予程序员队列的功能——尤其是 FIFO &#xff08;先进先出&#xff09;数据结构。 类模板表现为底层容器的包…

flac格式如何转mp3,3招帮你搞定

flac格式如何转mp3&#xff0c;3招帮你搞定的方法来啦。当你的音频是flac格式是不是很头疼&#xff0c;又不知道怎么转mp3 。然后网上搜索出很多方法又不知道从哪个下手&#xff0c;是不是很疑惑&#xff1f;那今天就来看看小编推荐的方法吧&#xff0c;一定让你眼前一亮&#…

petalinux-2021.1在zynq7020的flash上启动linux

一、 前言 在电脑上安装虚拟机或者找一个电脑安装linux&#xff0c;用于编译petalinux工程&#xff1b;安装与vivado对应的petalinux-tool&#xff1b;版本信息&#xff1a; 1&#xff09;linux&#xff1a;ubuntu16.04.06&#xff1b; 2&#xff09;vivado&#xff1a;v2021.…

row_number 和 cte 使用实例:考场监考安排

row_number 和 cte 使用实例&#xff1a;考场监考安排 考场监考安排使用 cte 模拟两个表的原始数据使用 master..spt_values 进行数据填充优先安排时长较长的考试使用 cte 安排第一个需要安排的科目统计老师已有的监考时长尝试使用 cte 递归&#xff0c;进行下一场考试安排&…

网咯通信基础 - 数据交换方式

文章目录 1 概述2 分类2.1 电路交换2.2 报文交换2.3 分组交换 1 概述 2 分类 2.1 电路交换 图示&#xff1a;发送方和接收方用一系列链路直接连通数据传输划分&#xff1a;电路建立、数据传输 和 电路拆除 3 个过程原理&#xff1a;当交换机收到一个呼叫后就会在网络中寻找一…

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

系类文章目录 机器学习算法——KD树算法介绍以及案例介绍 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 一、SVM支持向量机介绍 1.1、SVM介绍 1.2、几种核函数简介 a、sigmoid核函数 b、非线性SVM与核函…

运行时内存数据区之堆(一)

堆&#xff08;Heap&#xff09; 堆的核心概述 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建&#xff0c;其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定…

“行泊舱”+出海全面发力,这家ADAS厂商跑出规模化“新速度”

进入2023年&#xff0c;智能汽车市场已经由纯技术驱动迈入了市场驱动的新周期&#xff0c;接下来的市场竞争比拼的重点将是真正的规模化普及。 《高工智能汽车研究院》认为&#xff0c;中国乘用车市场已经来到了L2普及、L2冲刺发力以及L3/L4小规模落地的并行发展周期。对于智能…

AI工具应该成为开发者的帮手

前言 作为一名大前端开发者来说&#xff0c;最看重的就是web3.0的进一步发展以及推广速度。说到web3.0就不得不说元宇宙&#xff0c;就拿今年的支付宝集五福活动&#xff0c;就用到了元宇宙的功能&#xff1a;福气乐园&#xff0c;这也是为什么元宇宙越来越成为触手可及的&…

Ubuntu 自带截图工具快捷键盘

PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。 Shift PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。 Alt PrtSc –获取当前窗口的截图并保存到 Pictures 目录。 Ctrl PrtSc – 获取整个屏幕的截图并存放到剪贴板。 Shift Ctrl PrtSc – 获取屏幕的某个…

嚣张|微软“光明正大”要数据,Access用户怎么办?WPS笑了

微软“光明正大”要数据 继微软“数据门”事件之后&#xff0c;微软又开始出“幺蛾子”了。 最近&#xff0c;电脑是windows11会提示&#xff1a;你的数据将在所在国家或地区之外进行处理。 最让用户感到霸道的是&#xff0c;竟然没有“跳过”按钮。只能点击继续&#xff0c;…

MyBatis学习总结(五)逆向工程

MyBatis学习总结&#xff08;五&#xff09;逆向工程 一、MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。 Hibernate是支持正向工 程的。逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&am…