gRPC入门

文章目录

      • 1. 简介
      • 2. 安装gRPC
        • 2.1. 下载protobuf
        • 2.2. 安装grpc核心库
        • 2.3. 安装protoc的Go插件
        • 2.4. 检查
      • 3. 入门示例
      • 4. proto文件介绍
      • 5. 服务端代码编写
      • 6. 客户端代码编写
      • 7. 认证以及安全传输

1. 简介

在 gRPC 中,客户端应用程序可以像本地对象一样直接调用不同机器上的服务器应用程序上的方法,从而使您更轻松地创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务器端,服务器实现这个接口并运行一个gRPC服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中简称为客户端),它提供与服务器相同的方法。

image.png
gRPC 客户端和服务器可以在各种环境中运行和相互通信,并且可以用 gRPC 支持的任何语言编写。例如,您可以使用 Java 轻松创建 gRPC 服务器,并使用 Go、Python 或 Ruby 编写客户端。
默认情况下,gRPC 使用 Protocol Buffers,这是 Google 成熟的开源机制,用于序列化结构化数据
gPRC传输的是二进制字节流的数据,我们可以使用 **Protocol Buffers **进行代码的编码和解码的工作,从而用于数据传输。
protocol buffers (ProtoBuf)是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

2. 安装gRPC

2.1. 下载protobuf

从github下载https://github.com/protocolbuffers/protobuf发布版本然后配置环境变量。
image.png
其中:

  • bin 目录下的 protoc 是可执行文件。
  • include 目录下的是 google 定义的.proto文件,我们import "google/protobuf/timestamp.proto"就是从此处导入。
protoc

image.png

2.2. 安装grpc核心库
go get google.golang.org/grpc@latest

2.3. 安装protoc的Go插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28

该插件会根据.proto文件生成一个后缀为.pb.go的文件,包含所有.proto文件中定义的类型及其序列化方法。

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

该插件会生成一个后缀为_grpc.pb.go的文件,其中包含:

  • 一种接口类型(或存根) ,供客户端调用的服务方法。
  • 服务器要实现的接口类型。

上述命令会默认将插件安装到 G O P A T H / b i n ,为了 p r o t o c 编译器能找到这些插件,请确保你的 GOPATH/bin,为了protoc编译器能找到这些插件,请确保你的 GOPATH/bin,为了protoc编译器能找到这些插件,请确保你的GOPATH/bin在环境变量中。
image.png

2.4. 检查

依次执行以下命令检查一下是否开发环境都准备完毕。

  1. 确认 protoc 安装完成。
protoc --version
  1. 确认 protoc-gen-go 安装完成。
protoc-gen-go --version
  1. 确认 protoc-gen-go-grpc 安装完成。
protoc-gen-go-grpc --version

image.png

3. 入门示例

构建如下文件目录
image.png
在hello.proto中写入下面代码

syntax = "proto3"; // 版本声明,使用Protocol Buffers v3版本

option go_package = ".;service";  // 指定生成的Go代码在你项目中的导入路径 和  包名

// package pb; // 包名


// 定义服务
service SayHello {
  // SayHello 方法
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// 请求消息
// 注意这里并不是赋值,而是定义的这个变量在这个message中的位置
message HelloRequest {
  string requestName = 1;
//  int64 age = 2;
}

// 响应消息
message HelloResponse {
  string responseReply = 1;
}

进入相应文件目录执行以下命令生成go代码和grpc的相关代码

protoc --go_out=. hello.proto   //.代表输出目录  hello.proto表示给哪个文件生成代码
protoc --go-grpc_out=. hello.proto

image.png
image.png
接下来就可以根据业务需求补充实现生成代码文件的内容。

4. proto文件介绍

  • message

protobuf 中定义一个消息类型是通过关键字 message字段指定的。
消息就是需要传输的数据格式的定义。
message 关键字类似于C++中的class,JAVA中的class,go中的struct。
在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型。

  • field

required:消息体中必填字段,不设置会导致编码异常。在protobuf2中使用,在protobuf3中被删去。
optional:消息体中可选字段。protobuf3没有了required,optional等说明关键字,都默认为optional。
repeated:消息体中可重复字段,重复的值的顺序会被保留,在go中重复的会被定义为切片。

  • 消息号

下面定义中的1,必须唯一。

string requestName = 1;
  • 嵌套消息

可以在消息中嵌套定义消息

message Person {
    message HelloRequest {
        string requestName = 1;
    }
    string name = 1;
    int32 id = 2;
    bool has_ponycopter = 3;   
}
  • 服务定义

如果想要将消息类型用到RPC系统,可以在.proto文件中定义一个RPC服务接口,protocol buffer会根据所选择的不同语言生成服务接口的代码和存根。

service SearchService {
    # rpc 服务函数名 (参数) 返回 (返回参数)
    rpc Search(SearchRequest) returns (SearchResponse)
}

5. 服务端代码编写

基于生成的gprc服务端代码重写业务逻辑。

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	pb "grpc_demo/hello-server/proto"
	"net"
)

type server struct {
	pb.UnimplementedSayHelloServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	fmt.Printf("服务端被 %v 调用", req.RequestName)
	return &pb.HelloResponse{ResponseReply: "hello" + req.RequestName}, nil
}

func main() {
	// 开启端口
	listen, _ := net.Listen("tcp", ":9090")
	// 创建gRPC服务
	grpcServer := grpc.NewServer()
	// 在rpc服务端中注册我们自己编写的服务
	pb.RegisterSayHelloServer(grpcServer, &server{})
	//启动服务
	err := grpcServer.Serve(listen)
	if err != nil {
		fmt.Printf("failed to serve: %v", err)
		return
	}
}

6. 客户端代码编写

// hello-client/main.go
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	pb "grpc_demo/hello-server/proto"
	"log"
)

func main() {
	// 连接到server端,此处禁用安全传输,没有加密和验证
	conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()

	// 建立连接
	client := pb.NewSayHelloClient(conn)
	// 执行rpc调用
	resp, _ := client.SayHello(context.Background(), &pb.HelloRequest{RequestName: "acezsq"})
	fmt.Println(resp.GetResponseReply())
}

首先运行服务端,之后运行客户端,可以看到客户端完成了调用服务端的方法。
image.png

完整的项目代码文件在:https://github.com/acezsq/grpc_demo

7. 认证以及安全传输

客户端与服务端通信之前,客户端如何知道自己的数据发送给哪一个服务端?反过来,服务端也需要有一种方式确定一下自己的数据要返回给谁。
此处的认证不是用户身份认证而是多个client和多个server之间的识别。

  • SSL/TLS认证方式(采用http2协议)
  • 基于Token的认证方式(基于安全连接)
  • 不采用任何措施的链接,不安全的连接
  • 自定义的身份认证

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

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

相关文章

Flutter中的Provider状态管理工具有哪些优势

在Flutter应用开发中,状态管理是一个至关重要的方面。而Provider作为一种简单、灵活且高效的状态管理工具,在众多Flutter开发者中备受青睐。本文将深入探讨Provider在Flutter中的优势,帮助读者更好地理解其价值和应用场景。 简单易用 Provi…

《数字图像处理(MATLAB版)》相关算法代码及其分析(3)

目录 1 对边界进行子采样 1.1 输入参数检查 1.2 处理重复坐标 1.3 计算边界最大范围 1.4 确定网格线数量 1.5 构建网格位置向量 1.6 计算曼哈顿距离 1.7 整理输出结果 1.8 返回结果 2 改变图像的存储类别 2.1 函数输入 2.2 数据类型转换 2.3 错误处理 2.4 返回结…

Flutter整体框架

Flutter整体框架由三部分组成:Framework、Engine和Embedder。 Framework Framework提供了一个用 Dart 语言编写的现代、反应式框架,由许多抽象的层级组成。它包括一套丰富的布局、动画、绘制、手势UI组件及配套代码,以及更基础的异步、文件、…

参数引入和全局变量引入实现-目标和

LCR 102. 目标和 - 力扣(LeetCode) 分析题意,画出决策树,其他的思路都跟前面讲过的类似: 全局变量引入实现: 全局变量的引入,需要手动处理回溯; class Solution {int ret; //…

视频拉流推流技术梳理

概况 视频的整个流程主要分为推流和拉流 摄像头场景: 摄像头捕捉视频画面,推流到服务器,服务器分发到CDN, 客户端从CDN地址拉流,客户端进行播放 直播场景: 主播通过手机,电脑等客户端&…

前端爬虫+可视化Demo

爬虫简介 可以把互联网比做成一张 “大网”,爬虫就是在这张大网上不断爬取信息的程序。 爬虫是请求网站并提取数据的自动化程序。 省流:Demo实现前置知识: JS 基础Node 基础 (1)爬虫基本工作流程: 向…

RK3568平台 USB基础知识

一.现实工作中USB实际例子 现象:把USB设备比如Android手机接到PC 右下角弹出"发现android phone"跳出一个对话框,提示你安装驱动程序 问1:USB设备插到电脑上去,接触到的对方设备是什么? 答1:…

yum 和 rpm

rpm说明 rpm -qa :列出所有已安装的软件包 [roothub ~] rpm -qa geoipupdate-2.5.0-1.el7.x86_64 ncurses-base-5.9-14.20130511.el7_4.noarch libndp-1.2-9.el7.x86_64 libfastjson-0.99.4-3.el7.x86_64 。。。 rpm -qf FILENAME :查找提供 FILENAME…

SwiftUI之CoreData详解(一)

coreData 是一种数据持久化的方案,是对SQLite的一种封装。一说到这种桌面化的数据库,我就无比的怀念Foxbase|Foxpro, 多好的数据库产品,被微软扼杀了,相当年教大学生妹子们国家二级数据库时都是手把手教的,呃~~~&#…

wordpress模板官网

移民wordpress主题 移民代办wordpress主题,适合做海外移民咨询的代理公司搭建wordpress企业官方网站使用。 https://www.jianzhanpress.com/?p5130 夏令营wordpress主题 绿色夏令营wordpress主题,适合做夏令营或户外拓展的公司搭建wordpress官方网站…

【动态规划】第十一届蓝桥杯省赛第二场C++ C组《数字三角形》(c++)

1.题目描述 上图给出了一个数字三角形。 从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。 …

绝地求生:小团团曝被判8年:地图语音包或将下架,公会和主播被一锅端

这两天大家都在讨论某鱼平台办卡抽奖的事情。这件事发生之后没多久,某鱼平台里面的大量主播在同一时间停播,闲游盒认为大家应该也懂的,这次停播就是因为这些主播也参与了办卡抽奖,都需要接受调查,在两个月左右的调查中…

【项目实践】如何发掘用户隐性需求推送PUSH

1.背景 对比业界广告推荐、触达成熟的平台,例如抖音,小红书,淘宝,知乎等,都已经站在巨量数据的基础之上,具备了 “用户意图分析” 的能力,可以分析出 “用户的隐性需求”,假设我们同…

Python学习日记(一:List、Tuple、dictionary)

前言: 最近想拓展一下自己的知识面,特来学习一下python这门语言,因为之前学习过C语言,目前学习起来Python还不是特别费劲,也由此感叹C语言不愧是最基础的语言。不多废话,进入正题 概述: Pytho…

典中典之西电A测-气压测控仿真系统

兄弟,如果你看到这篇,只能说明你A测也挂了,没办法,哥们太菜了,抄的太假过不了你电有些老师的慧眼 这坨🐕⑩我先吃为敬 环境搭建可以参考这个兄弟的博客 一、题目要求 实现功能:使用 Arduino UNO 微控制器,搭建一个 PC 上位机远程气压检测控…

动态规划:LeetCode第10题 正则表达式匹配

题目: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1: …

C语言文件操作,linux文件操作,文件描述符,linux下一切皆文件,缓冲区,重定向

目录 C语言文件操作 如何打开文件以及打开文件方式 读写文件 关闭文件 Linux系统下的文件操作 open 宏标志位 write,read,close,lseek接口 什么是当前路径? linux下一切皆文件 文件描述符 文件描述符排序 C语言文件操…

【Linux从青铜到王者】进程信号

——————————————————————————————————————————— 信号入门 在了解信号之前有许多要理解的相关概念 我们可以先通过一个生活例子来初步认识一下信号 1.生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来…

达梦、金仓、南大、瀚高、优炫:从社区建设看企业技术自信心

正文约950字,预计阅读时间2分钟 国产技术厂商在面对自身产品问题时,往往保持回避态度,不愿公之于众,主要原因有2方面: 1,产品技术层面问题较多,如某些根本性缺陷难以攻克,或问题发…

Python爬虫实战(基础篇)—13获取《人民网》【最新】【国内】【国际】写入Word(附完整代码)

文章目录 专栏导读背景测试代码分析请求网址请求参数代码测试数据分析利用lxml+xpath进一步分析将获取链接再获取文章内容测试代码写入word完整代码总结专栏导读 🔥🔥本文已收录于《Python基础篇爬虫》 🉑🉑本专栏专门针对于有爬虫基础准备的一套基础教学,轻松掌握Py…