当前位置: 首页 > news >正文

Go语言gRPC快速入门

文章目录

  • 前言
  • gRPC是什么
  • Go语言的gRPC技术栈
  • 准备工作
  • 接口定义
  • 代码生成
  • 服务端代码编写
  • 客户端代码编写
  • 效果演示
  • 完整代码链接
  • 最后

前言

你好,我是醉墨居士,这篇博客想帮助初学者能够快速入门gRPC,希望能够为你节省宝贵的时间,让时间花费在有价值的事情上

gRPC是什么

gRPC是Google公司基于HTTP/2传输协议与Protobuf 编码协议 开发的跨语言的高性能、开源的远程过程调用(RPC)框架,具有高效的通信机制、跨语言支持、强大的服务定义与拓展能力

Go语言的gRPC技术栈

在这里插入图片描述
基于Unix Socket协议或者TCP协议实现HTTP/2协议,在HTTP/2协议的基础上构建了针对Go语言的gRPC核心库,应用程序通过gRPC插件工具生成Stub代码来和gRPC核心库进行交互

准备工作

安装protoc编译器

下载地址:https://github.com/protocolbuffers/protobuf/releases
在这里插入图片描述
选择自己对应的操作系统与架构类型的安装包

安装go语言相关的protoc与gRPC插件

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

更新 PATH,使 protoc 编译器能够找到插件

export PATH="$PATH:$(go env GOPATH)/bin"

接口定义

通过编写proto文件来定义接口信息,定义服务和消息

// The greeting service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user's name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}

代码生成

使用 protoc 编译器将 helloworld.proto 文件编译成 Go 语言的代码 和 gRPC 相关的代码

protoc --go_out=. --go_opt=paths=source_relative \--go-grpc_out=. --go-grpc_opt=paths=source_relative \helloworld/helloworld.proto

protoc:这是 Protocol Buffers 编译器的命令行工具。

–proto_path=.:这是一个编译选项,指定了搜索 .proto 文件的目录。在这个例子中,它被设置为当前目录(.),意味着编译器会在当前目录下搜索 .proto 文件。

–go_out=.:这个选项告诉 protoc 编译器生成 Go 语言的代码,并且将生成的代码放在当前目录(.)。

–go_opt=paths=source_relative:这个选项是传递给 Go 语言代码生成器的,paths=source_relative 指定了生成的 Go 代码中的 import 路径应该是相对于源 .proto 文件的路径。

–go-grpc_out=.:这个选项告诉 protoc 编译器生成 Go 语言的 gRPC 代码,并且将生成的代码放在当前目录(.)。

–go-grpc_opt=paths=source_relative:这个选项是传递给 Go 语言 gRPC 代码生成器的,paths=source_relative 指定了生成的 Go gRPC 代码中的 import 路径应该是相对于源 .proto 文件的路径。

helloworld/helloworld.proto:这是指定要编译的 .proto 文件的路径。在这个例子中,.proto 文件位于 helloworld 目录下,文件名为 helloworld.proto。

普通的消息类型代码,用于序列化和反序列化 Protocol Buffers 消息。
gRPC 服务端和客户端代码,用于实现远程过程调用。
这些代码都是根据 helloworld.proto 文件中定义的消息和服务生成的,生成的代码会放置在执行命令的当前目录中。如果你的 .proto 文件中定义了 package,那么生成的 Go 文件将会有相应的 package 名称,并且 import 路径会相对于 .proto 文件的源路径。

服务端代码编写

package mainimport ("context""fmt""go-examples/grpc/hello""net""google.golang.org/grpc"
)// 接口实现
type GreeterServer struct {hello.UnimplementedGreeterServer
}// 实现SayHello方法
func (s *GreeterServer) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) {fmt.Printf("Received: %s\n", in.GetName())return &hello.HelloReply{Message: "Hello " + in.Name}, nil
}func main() {// 创建监听器lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 40404))if err != nil {panic(err)}defer lis.Close()// 创建grpc servers := grpc.NewServer()// 注册服务hello.RegisterGreeterServer(s, &GreeterServer{})// 启动服务s.Serve(lis)
}

客户端代码编写

package mainimport ("context""fmt""go-examples/grpc/hello""time""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"
)func main() {// 连接远程服务器conn, err := grpc.NewClient("localhost:40404", grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {panic(err)}defer conn.Close()// 创建客户端实例cli := hello.NewGreeterClient(conn)ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)defer cancel()// 调用服务端方法resp, err := cli.SayHello(ctx, &hello.HelloRequest{Name: "world"})if err != nil {panic(err)}fmt.Printf("Greeting: %s\n", resp.Message)
}

效果演示

在这里插入图片描述

完整代码链接

https://github.com/zm50/go-examples/tree/master/grpc

最后

我是醉墨居士,希望用最简单的文章帮助你快速入门Go语言进行gRPC开发,如果对你有所帮助,请多多支持呀

相关文章:

Go语言gRPC快速入门

文章目录 前言gRPC是什么Go语言的gRPC技术栈准备工作接口定义代码生成服务端代码编写客户端代码编写效果演示完整代码链接最后 前言 你好,我是醉墨居士,这篇博客想帮助初学者能够快速入门gRPC,希望能够为你节省宝贵的时间,让时间…...

Golang | Leetcode Golang题解之第479题最大回文数乘积

题目: 题解: func largestPalindrome(n int) int {if n 1 {return 9}upper : int(math.Pow10(n)) - 1for left : upper; ; left-- { // 枚举回文数的左半部分p : leftfor x : left; x > 0; x / 10 {p p*10 x%10 // 翻转左半部分到其自身末尾&…...

UDP协议讲解

预备知识: 端口号port: 我们在正常网络通信时,实际上是进程在互相通信。 我们所有的网络通信的行为,本质上都是进程间通信。 对双方而言,1.先保证数据能到达自己的机器 ip解决 2.找到指定的进程 端口号 ip地址用来…...

交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…...

CSDN Markdown 编辑器语法大全

Markdown 是一种轻量级标记语言,它以简洁、易读易写的特点,被广泛应用于技术文档、博客文章、笔记等领域。CSDN 的 Markdown 编辑器为用户提供了丰富的功能,让用户能够轻松地创建格式规范、内容丰富的文档。以下是一份详细的 CSDN Markdown 编…...

TCP/IP 协议【四次挥手】简要说明

四次挥手是为了确保数据的完整性和可靠性,解决的主要问题是双方在断开连接时,可能还有未完成传输的数据或者未被接收的数据。 具体来说,四次挥手解决的问题是: 第一次挥手(发送方向接收方发送FIN包)&#…...

第11篇:网络安全协议

目录 引言 11.1 安全套接字层(SSL)和传输层安全(TLS)协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网(VPN)和 IP 安全协议(IPSec) 11.2.1 VPN 的工…...

ES-入门-javaApi-文档-新增-删除

新增指定索引的文档数据的代码如下: package com.atgulgu.es.test;import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRe…...

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…...

【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例

在前面的文档中,介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3(二)在Unity中配置Pico SDK 本文将介绍如何运行一个简单…...

C#中委托的应用与示例

委托 委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。 可以委托将看作一个包含有序方法列表…...

算法: 模拟题目练习

文章目录 模拟替换所有的问号提莫攻击Z 字形变换外观数列数青蛙 总结 模拟 替换所有的问号 按照题目的要求写代码即可~ public String modifyString(String ss) {int n ss.length();if (n 1) {return "a";}char[] s ss.toCharArray();for (int i 0; i < n; i…...

软考中级科目怎么选?软考中级证书有什么用?

❇有计算机背景&#xff1a; 建议选择软件设计师或网络工程师。软件设计师更适合软件工程专业的同学报考&#xff0c;而网络工程师更适合网络工程专业的朋友&#xff08;仅供参考&#xff09;。 ❇没有计算机背景&#xff1a; 建议选择系统集成项目管理工程师作为入门科目。…...

HTTP 请求的请求体是什么

HTTP 请求的请求体(request body)是指在 HTTP 请求中除了请求行(request line)、请求头(headers)之外的实际数据部分。请求体通常包含用于向服务器发送数据的信息,这些信息可以是表单数据、JSON 对象、XML 文档或其他任何形式的数据。 http请求一般包含的内容 HTTP(超…...

助力语音技术发展,景联文科技提供语音数据采集服务

语音数据采集是语音识别技术、语音合成技术以及其他语音相关应用的重要基础。采集高质量的语音数据有助于提高语音识别的准确性&#xff0c;同时也能够促进语音技术的发展。 景联文科技作为专业的数据采集标注公司&#xff0c;支持语音数据采集。可通过手机、专业麦克风阵列、专…...

PyTorch搭建神经网络入门教程

PyTorch搭建神经网络入门教程 在机器学习和深度学习中&#xff0c;神经网络是最常用的模型之一&#xff0c;而 PyTorch 是一个强大的深度学习框架&#xff0c;适合快速开发与研究。在这篇文章中&#xff0c;我们将带你一步步搭建一个简单的神经网络&#xff0c;并介绍 PyTorch…...

你的电脑能不能安装windows 11,用这个软件检测下就知道了

为了应对Windows 11的推出&#xff0c;一款名为WhyNotWin11的创新型诊断软件应运而生。这个强大的工具不仅仅是一个简单的兼容性检测器&#xff0c;它更像是一位细心的数字医生&#xff0c;全方位评估您的计算机是否准备好迎接微软最新操作系统的挑战。 WhyNotWin11的功能远超…...

BF 算法

目录 BF算法 算法思路 完整代码 时间复杂度 查找所有起始位置 BF算法 BF算法&#xff1a;即暴力(Brute Force)算法&#xff0c;是一种模式匹配算法&#xff0c;将目标串 S 的第一个字符与模式串 T 的第一个字符进行匹配&#xff0c;若相等&#xff0c;则继续比较 S 的第二…...

SHOW-O——一款结合多模态理解和生成的单一Transformer

1.前言 大型语言模型 (LLM) 的重大进步激发了多模态大型语言模型 (MLLM) 的发展。早期的 MLLM 工作&#xff0c;例如 LLaVA、MiniGPT-4 和 InstructBLIP&#xff0c;展示了卓越的多模态理解能力。为了将 LLM 集成到多模态领域&#xff0c;这些研究探索了将预训练的模态特定编码…...

缓存框架JetCache源码解析-缓存变更通知机制

为什么需要缓存变更通知机制&#xff1f;如果我们使用的是本地缓存或者多级缓存&#xff08;本地缓存远程缓存&#xff09;&#xff0c;当其中一个节点的本地缓存变更之后&#xff0c;为了保证缓存尽量的一致性&#xff0c;此时其他节点的本地缓存也需要去变更&#xff0c;这时…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...