Go语言gRPC快速入门

news2024/10/22 6:13:36

文章目录

  • 前言
  • 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 greeting
  rpc 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 main

import (
	"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 server
	s := grpc.NewServer()

	// 注册服务
	hello.RegisterGreeterServer(s, &GreeterServer{})

	// 启动服务
	s.Serve(lis)
}

客户端代码编写

package main

import (
	"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开发,如果对你有所帮助,请多多支持呀

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

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

相关文章

无线网络基础

文章目录 无线组网胖AP瘦AP胖瘦AP的区别组网方式连接方式CAPWAP概念 无线组网 WLAN:无线局域网 蜂窝网络:无线广域网 802.11,无线网络封装的报文头部 WLAN是一种基于IEEE 802.11标准的无线局域网技术 802.11标准聚焦在TCP/IP对等模型的下两层…

算力提升10倍,特斯拉Cybercab预示了半导体行业哪些方向?

北京时间10月11日上午,备受世界瞩目的“We,Robot”发布会成功举行。现场,特斯拉正式发布了被命名为Cybercab的特斯拉Robotaxi(无人驾驶出租车),以及Robovan(无人驾驶厢式货车)。 这次…

Harmony OS原生端渲染RTMP流功能实现

前段时间公司收到鸿蒙的邀请,希望我们加入鸿蒙的生态应用。领导要求我们将原先安卓SDK实现的功能在鸿蒙生态上1:1还原。相信这也是当前很多公司在做的事情。 我们项目原先有获取硬件实时视频流展示的需求,这块功能也耗费了两周的时间才打通测…

springboot 整合 快手 移动应用 授权 发布视频 小黄车

前言: 因快手文档混乱,官方社区技术交流仍有很多未解之谜,下面3种文档的定义先区分。 代码中的JSON相关工具均用hutool工具包 1.快手 移动双端 原生SDK 文档https://mp.kuaishou.com/platformDocs/develop/mobile-app/ios.html 2.快手 Api 开…

每日OJ题_牛客_chika和蜜柑_TopK_C++_Java

目录 牛客_chika和蜜柑_TopK 题目解析 C代码 Java代码 牛客_chika和蜜柑_TopK chika和蜜柑 (nowcoder.com) 描述: chika很喜欢吃蜜柑。每个蜜柑有一定的酸度和甜度,chika喜欢吃甜的,但不喜欢吃酸的。 一共有n个蜜柑&am…

万物皆可浮雕,comfyui一键图片转浮雕

一键生成图片浮雕效果:ComfyUI工作流指南 在图像处理和艺术创作领域,生成浮雕效果的图片是一种既独特又吸引人的表现手法。使用ComfyUI工作流,可以一键生成灰度图、深度图和浮雕图,大大简化了复杂的图像处理过程。本文将详细介绍…

嵌入式C语言之结构体封装函数

嵌入式C语言之结构体封装函数 Chapter1 嵌入式C语言之结构体封装函数结构体封装函数的作用结构体封装函数的应用结构体封装函数的好处举例1举例2举例3 Chapter1 嵌入式C语言之结构体封装函数 原文链接:https://blog.csdn.net/qq_43416206/article/details/13140531…

spring:Springboot3使用模版引擎thymeleaf

文章目录 介绍语法1、文本替换2、属性替换3、条件判断4. 列表循环5. 表单处理 基本示例视图解析机制视图解析器的默认配置为什么用Controller可以,用RestController就只是返回字符串 介绍 Thymeleaf 是一个现代的服务器端 Java 模板引擎,用于在服务器端…

掌握这几款在线音频剪辑工具,轻松成为音频处理达人!

在数字时代,音频剪辑已经成为一项必备技能。无论是制作短视频、播客,还是进行音乐创作,一款好用的音频剪辑工具都能助你事半功倍。今天,我们就来为大家推荐几款实用的在线音频剪辑工具,让你轻松成为音频处理达人&#…

救命!后悔没早点读,自学Python,这本书永远的神,经典又好懂!

这是一本对新手来说很友好的入门书,这本是今年才出的新版,之前的两个版本在某瓣都是9分以上了。专为初学者设计,同时也适合有编程经验的读者。该书由Eric Matthes编写,内容涵盖Python基础语法、编程概念以及丰富的实践项目。 全书…

【工具变量】文明城市评选DID(2000-2023年)

数据简介: 随着城市化的不断推进和全球城际竞争的日益激烈,城市品牌成为争夺优质资源、推动城市可持续发展的重要战略工具。通过关注城市品牌建设,不仅可以刺激本地企业家更多地进行创新活动,为企业家创新活动提供更好的营商环境…

自回溯天线:实现波束自动跟踪的智能天线系统

自回溯天线:实现波束自动跟踪的智能天线系统 1. 引言 自回溯天线是一种能够自动将接收到的信号发射回信号源方向的智能天线系统。它基于相位共轭原理,无需复杂的信号处理和控制系统,就能实现波束的自动跟踪。 自回溯天线技术依靠纯模拟方式实现,通过共轭模块对入射…

vue3中如何更改当前类的文件名称

首先&#xff0c;使用script指定文件名称 <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ age }}</h2><button click"showTel">查看联系方式</button><bu…

【含文档】基于Springboot+Vue的招投标管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

如何恢复误删除的照片?能恢复多少?

最近在旅行时不小心删除了相机里之前拍摄的照片&#xff0c;我尝试在相机上恢复&#xff0c;但是没有找到恢复选项。我还能恢复这些照片吗&#xff1f;求助&#xff01; 一、照片恢复的可能性 照片恢复的可能性取决于多个因素&#xff0c;包括数据是否被覆盖、存储介质的类型、…

C语言笔记 10

求前n项之和 程序设计 f(n)1… 起点终点数字已知&#xff0c;用for循环最合适 #include <stdio.h>int main() {int n;int i;double sum 0.0;scanf("%d", &n);for ( i1; i<n; i ) {sum 1.0/i;}pritnf("f(%d)%f\n", n, sum);return 0; } i…

宿舍离人自动断电控制系统的功能要求是什么?

宿舍离人自动断电系统&#xff0c;由石家庄光大远通电气有限公司匠心打造&#xff0c;专为集体公寓、学生宿舍等密集型居住空间量身定制的智能用电管理解决方案&#xff0c;其卓越性能与广泛适应性&#xff0c;如同智慧之网&#xff0c;精准覆盖并优化每一份用电需求。该系统不…

八卦GPT-5的一切

这篇超长文章——既是评论&#xff0c;也是探索——关于GPT-5 对最受期待的下一代 AI 模型的深入分析 但它不仅仅是关于GPT-5。 • 它涉及我们对下一代AI模型的期望。 • 它关于即将出现的令人兴奋的新功能&#xff08;如推理和代理&#xff09;。它不仅讨论GPT-5技术本身&…

人工智能领域科学问题

科学问题 目前中国在人工智能领域亟待解决的问题包括但不限于以下几个方面&#xff1a; 数据隐私和安全&#xff1a;随着人工智能技术的发展&#xff0c;个人数据的收集和使用越来越广泛&#xff0c;如何保护个人隐私和数据安全成为一个重要问题。 伦理和道德问题&#xff1…

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…