【grpc】一、grpc入门,从protobuf开始

一、protobuf简介

Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。

关于相关工具的安装网上很多资料了,这里不再赘述。但是有几点需要注意的,protoc的版本要3.x.x;另外需要安装protoc-gen-goprotoc-gen-go-grpc

二、proto文件

先上示例代码

// calc.proto

syntax="proto3";

package calc;
option go_package="./calc";

import "calcRequest.proto";

message String {
  string str = 1;
}

message SInt{
  sint32 num = 1;
}

message Empty{

}

service Calc{
  rpc Sum(CalcRequest) returns(SInt);
  rpc Version(Empty) returns(String);
}
// calcRequest.proto

syntax="proto3";

package calc;
option go_package="./calc";

message CalcRequest{
  sint32 a = 1;
  sint32 b = 2;
}

可以看到这里分了两个文件,calc.protocalcRequest.proto,其实一个文件也可以,这边分开的目的主要是为了展示多个文件的用法。
其实 proto 文件定义相对简单,下面就一些关键字介绍下:

  • syntax:标识protobuf版本,这边是proto3
  • package:区别不同的包
  • option:选项,上面示例中表示的是生成的go代码会使用的包名
  • message:类似结构体,格式为 变量类型 + 变量名 + = + 序号;
  • service:定义具体的rpc接口,格式为 rpc + 方法名 + ( + 入参 + ) + returns + 返回类型。这里需要注意,入参和出参一定要有,并且只能有一个。

三、生成代码

示例的文件结构为:
在这里插入图片描述

生成代码的命令为:

protoc -I./proto --go_out=.  --go-grpc_out=.    .\proto\*.proto

执行后在calc目录下生成3个文件分别为calc.pb.gocalc_grpc.pb.gocalcRequest.pb.go
在这里插入图片描述
calc_grpc.pb.go中有个接口

type CalcServer interface {
	Sum(context.Context, *CalcRequest) (*SInt, error)
	Version(context.Context, *Empty) (*String, error)
	mustEmbedUnimplementedCalcServer()
}

这里是对应我们上面calc.proto中定义的rpc,需要自己实现接口。
在calc目录下新建文件calcServer.go

package calc

import "context"

const version = "V1.0.0"

type Server struct {
	UnimplementedCalcServer
}

func (Server) Sum(ctx context.Context, request *CalcRequest) (*SInt, error) {
	return &SInt{Num: request.GetA() + request.GetB()}, nil
}

func (Server) Version(ctx context.Context, empty *Empty) (*String, error) {
	return &String{Str: version}, nil
}

func (Server) mustEmbedUnimplementedCalcServer() {}

grpc相关代码至此已经准备完毕,下篇介绍具体使用方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列】Java高并发篇 - Java 中用到的线程调度算法是什么?

大家好,我是锋哥。今天分享关于 【Java 中用到的线程调度算法是什么?】面试题,希望对大家有帮助; Java 中用到的线程调度算法是什么? 采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上面的…

使用 Python 批量提取 Excel 中的图片(提供工具下载链接)

本文收录于《Python入门核心技术》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文主要讲解如何利用 Python 来批量提取 Excel 中的图片,分别保存到目录中。并将程序打包成可执行文件&am…

cloudcompare对点云数据打标签流程

1.导入点云txt文件 2.点击小剪刀进行分割 这时视角不能动了,进行框选分割,分割出上牙和下牙 3.打标签 点击加号在前六列的基础上再加上一列,列名为label 这里设置其他为0,上牙的标签为1,下牙为2 左边状态栏可以看到 4.合并为一个…

VueDraggablePlus 支持 Vue2 和 Vue3 的拖拽组件

官网:https://alfred-skyblue.github.io/vue-draggable-plus/

Jmeter接口测试:响应断言元件

响应断言元件介绍: 响应断言元件的功能是对接口的响应信息进行自动断言校验,来判断接口测 试得到的接口返回值是否正确。jmeter中该元件支持将请求或响应的各个字段与 模式字符串进行比较。有了该元件,就可以完成自动化接口测试,…

自媒体内容创作助手:5款必备ai写作工具一览! #科技#知识分享#学习

这些工具不仅可以快速生成高质量的文本内容,还可以根据用户的需求进行个性化定制。它们可以帮助我们节省大量的时间和精力,让我们更加专注于创意和细节的打磨。本文将为大家详细介绍几个AI写作工具,让你在写作领域更上一层楼。 1.元芳写作 …

从MySQL5.7平滑升级到MySQL8.0的最佳实践分享

一、前言 升级需求:将5.7.35升级到8.0.27, 升级方式 in-place升级【关闭现有版本MySQL,将二进制或包替换成新版本并在现有数据目录上启动MySQL并执行升级任务的方式,称为in-place升级】 原版本 5.7.35 CentOS Linux release 7.9.2009 新版本…

数字图像处理项目——基于BCNN和迁移学习的鸟类图像细粒度分类(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 本文采用了ResNet50、VGG19、InceptionV3和Xception等四种不同的深度神经网络模型,并应用于鸟类图像的细粒度分类问题中,以探究其在该任务上的性能表现。 其中,本文使用了BCNN(B…

文献速递:深度学习胰腺癌诊断--胰腺肿瘤的全端到端深度学习诊断

Title 题目 Fully end-to-end deep-learning-based diagnosis of pancreatic tumors 胰腺肿瘤的全端到端深度学习诊断 01 文献速递介绍 胰腺癌是最常见的肿瘤之一,预后不良且通常是致命的。没有肿瘤的患者只需要进一步观察,而胰腺肿瘤的诊断需要紧…

RequestMapping注解

一、RequestMapping的作用 RequestMapping 注解是 Spring MVC 框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上。具体来说,它可以将指定 URL 的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。 二、RequestMappi…

Linux使用宝塔面板安装MySQL结合内网穿透实现公网连接本地数据库

文章目录 推荐前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

力扣-移除元素

题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

Ubuntu 20.04.06 PCL C++学习记录(十九)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 源代码及所用函数 源代码 #include<iostream> #include<vector> #in…

室内人员定位的几种方案

着物联网不断发展&#xff0c;人们对于室内位置的需求日益增多&#xff0c;室内人员定位管理的需求在很多企业中也纷纷尝试&#xff0c;通过数字化手段&#xff0c;对企业内部人员的信息、行为等进行实时监控、分析和管理。这种管理方式可以大大提高企业的管理效率&#xff0c;…

【CicadaPlayer】demuxer_service的简单理解

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SMPMessageControllerListener.cppplayer的demuxer服务类 std::unique_ptr<demuxer_service> mDemuxerService{nullptr};根据option (Cicada::options),可以决定音视频的不同操作,通过 hander可以获得具体使…

CSS - 浮动、定位

浮动 CSS浮动&#xff08;Float&#xff09;是一种布局技术&#xff0c;用于控制元素在页面中的位置。通过将元素浮动到其容器的左侧或右侧&#xff0c;可以使其他元素环绕在其周围。 相关属性&#xff1a; float&#xff1a;用于设置元素的浮动方向。可以设置为left&#xf…

刷题之动态规划-子序列

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的子序列类型相关的题目&#xff0c;子序列元素的相对位置和原序列的相对位置是一样的 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xf…

[工具使用]绕过付费-适用于谷歌/火狐/Edge浏览器

绕过付费-适用于谷歌/火狐/Edge浏览器 bypass-paywalls是一款浏览器插件&#xff0c;可以帮助绕过选定网站的付费 链接&#xff1a;https://github.com/iamadamdev/bypass-paywalls-chrome 一、谷歌/Edge浏览器安装说明&#xff08;支持自定义网站&#xff09; 1、从Github下…

Xinstall助力提升用户体验:一键打开App用户页面

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着App数量的激增&#xff0c;如何让用户更便捷地打开和使用App&#xff0c;提升用户体验&#xff0c;成为了开发者和广告主们亟待解决的问题。此时&#xff0c;Xinstall作为国内专业…

golang使用sse事件流调用AI大模型

目录 前言第一步 解决没有官方SDK的痛第二步 实现流式传输什么是SSE,SSE和WebSocket的区别基于gin实现SSE服务器gin接收AI大模型数据流响应1. 前端携带自定义问题请求后端接口2. 后端接受请求解析问题&#xff0c;然后创建stream对象3. 构建请求参数&#xff0c;调用创建数据流…