GRPC详解

2023-11-16

什么是GRPC

 

 官网:gRPC

gRPC 是一个现代开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。 它可以有效地连接数据中心内和跨数据中心的服务,并提供对负载平衡、跟踪、健康检查和身份验证的可插入支持。 它还适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。

简单来说:它是一种协议用来屏蔽分不分布式计算中的各种调用细节,使你可以像可以本地调用一样调用远程的函数

为什么要用GRPC

微服务架构带来服务与服务间存在的调用关系,而在服务与服务之间存在进程和进程,服务器和服务器之间的调用,使用GRPC协议能够不同的服务快速的连接,在性能上优于http协议

 gRPC支持各种常见的开发语言,在大型项目的开发中,可以让各种语言像调用本地方法一样调用远程的函数,

gRPC传输协议(Protocol Buffers)

Concept Diagram

默认情况下,gRPC 使用 Protocol Buffers,这是 Google 成熟的开源机制,用于序列化结构化数据(尽管它可以与 JSON 等其他数据格式一起使用)。

即用Protocol Buffers将数据在不同的代码写的不同应用间共享

Protocol Buffers安装

官方github:

Releases · protocolbuffers/protobuf · GitHub

选择最新版本对应自己系统的压缩包解压:

我的电脑是win64所以下载win64压缩包

 解压后将bin目录加入系统环境变量

命令行中输出version成功则安装成功

 

 go安装gRPC

go get google.golang.org/grpc

上面这行代码安装的是protocol编译器,除了这个编译器我们还需要对应的代码生成工具

对于go来说是protoc-gen-go

注意 github上的protoc-gen-go为旧版本

安装google托管的新版本

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

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

 因为这两个文件在下载grpc时就已经下载下来了,所以用install命令

实践

创建项目

安装 

go get google.golang.org/grpc

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

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

创建项目文件

相当于两个项目,客户端和服务端

假如没高亮取插件市场搜索proto插件下载

 在hello.proto中添加

//声明使用proto3 语法
syntax = "proto3";

// 定义最后生成的go文件位于那个目录哪个包中,.代表在当前目录中生成,service代表了生成的go文件的包名为service.这个包名可以随意
option go_package = ".;service";

/*
  需要定义一服务,在这个服务中需要有一个方法,这个方法可以接受客户端的参数,再返回服务端的响应.
  其实可以很容易看出,我们定义了一个service,称为SayHello,这个服务有一个rpc方法,称为SayHello
  这个方法会发送一个HelloRequest,然后返回一个HelloResponse.
 */
service SayHello {
  rpc SayHello(HelloRequest) returns (HelloResponse){}
}

/*
  message关键字,可以理解为go中的结构体
  后面的"赋值",并不是赋值,而是定义这个变量在message中的位置
 */

message HelloRequest{
  string requestName = 1;
  int64 age = 2;
  repeated string name =3;
}


message HelloResponse{
  string responseMsg = 1;
}

 在编写玩上述内容后

cd进server/proto下执行命令

protoc --go_out=. hello.proto

protoc --go-grpc_out=. hello.proto

 可以获取

在服务端中

grpc是抽象对象将其注册到grpc server的内部中心

客户端中

发送rpc请求到服务端并输出响应结果

服务端方法编写

方法实现

因为文件中只有

这一个方法.让我们实现它

看下生成的文件,重写这个结构体

 我们要在main函数中定义一结构体(这里为server)包含这个结构体,导入并取个pb的别名

 接下来重写函数

把这个

 复制到main中

 然后开启服务

客户端编写

连接服务端并获取数据,在客户端的main.go中编写

 

测试结果

安全认证

此处的安全认证不是传统意义上的安全,而是客户端和服务端之间的通信要安全

也就是多个服务端和客户端都能知道自己的消息能够发给谁

推荐采用证书认证的方式来实现传输的安全性

生产环境可以购买证书或使用一些平台发行的免费证书

TLS协议解决的痛点

1.保密,用encyption实现加密,第三方无法窃取

2.完整性,mac地址通信,一旦窜改能发现

3.认证,双方都可以配备证书放置身份冒充

 结语

grpc是为了在不同的服务器上像调用本地方法一样调用远程方法

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GRPC详解 的相关文章

  • GOMAXPROCS 默认值是多少?

    不设置同名环境变量时是否保证GOMAXPROCS设置为1 此代码显示的值 package main import runtime fmt func getGOMAXPROCS int return runtime GOMAXPROCS 0
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • 如何在golang中创建一个充满“000000...”数据的10MB文件?

    我打算在日志或磁盘队列等系统中使用 fdatasync 首先是在 ext4 等文件系统中创建一个带有 000000 的 10MB 文件 但我不知道如何正确地做到这一点 jnml fsc r630 src tmp SO 16797380 ls
  • 如何在golang中解析JSON而不需要解组两次

    我有一个 Web 套接字连接 它在 JSON 对象中发送不同类型的消息 并且我想将内容解组到一些已知的结构中 为此 我认为我应该执行以下操作 步骤 1 将 JSON 解组为通用映射 字符串 接口 步骤 2 找到我要找的钥匙 步骤 3 尝试将
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 如何为所有 API 端点全局设置 http.ResponseWriter Content-Type 标头?

    我是 Go 新手 现在正在用它构建一个简单的 API package main import encoding json fmt github com gorilla mux github com gorilla handlers log
  • 如何读取大型平面文件

    我有一个平面文件 其中包含 339276 行文本 大小为 62 1 MB 我试图读入所有行 根据我所拥有的某些条件解析它们 然后将它们插入数据库 我最初尝试使用 bufio Scan 循环和 bufio Text 来获取该行 但缓冲区空间不
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • 指针上定义的方法仍然可以用值调用

    Effective Go 文档说明如下 关于接收者的指针与值的规则是 可以在指针和值上调用值方法 但只能在指针上调用指针方法 http tip golang org doc effective go html pointers vs val
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • 为什么 DER ASN.1 大整数的解组在 Golang 中仅限于 SEQUENCE?

    我希望能够使用encoding asn1 包从 DER 文件中解组一个大整数 但它看起来只适用于整数序列 例如 这不起作用 这很奇怪 因为 Big Int 的编组效果很好 https play golang org p Wkj0jAA6bp
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input
  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • Go 指针 - 通过指针将值附加到切片

    我有一个 struct ProductData 及其实例 p 它有一个切片属性 type ProductInfo struct TopAttributes map string interface 我想设置 TopAttributes 如下
  • 管理多租户 ArangoDB 连接

    我使用 ArangoDB Go 使用 go driver 并且需要实现多租户 这意味着每个客户都将在单独的数据库中拥有他的数据 我想要弄清楚的是如何使这种多租户发挥作用 我知道为每个请求创建一个新的数据库连接是不可持续的 这意味着我必须维护

随机推荐

  • Python,OpenCV使用KNN来构建手写数字及字母识别OCR

    Python OpenCV使用KNN来构建手写数字及字母识别OCR 1 原理 1 1 手写数字识别 1 2 字母识别 2 源码 2 1 手写数字OCR 2 2 字母OCR 参考 这篇博客将介绍如何借助OpenCV提供的手写数字及字母数据集
  • Linux用户空间与内核空间

    Linux用户空间与内核空间 2012 08 30 15 39 1969人阅读 评论 1 收藏 举报 linux linux内核 struct user system allocation Linux 操作系统和驱动程序运行在内核空间 应用
  • 2.Xaml 停靠框架

    1 运行效果图片 2 Xaml程序
  • ChatGPT实现知识图谱生成

    知识图谱生成 在之前章节中 我们尝试过让 ChatGPT 对一段文本做实体识别和词性分析 结果很不错 但如果是需要长期留存下来 后续在不同场景下快速查询分析 最好还是要把数据存入到专门的图数据库中 才能方便随时读取 本节 我们试试让 Cha
  • 《计算机网络原理》(谢希仁)笔记——第二章

    此为本人观看韩立刚老师视频所做笔记与总结 下面为视频连接 https www bilibili com video av10921041 from search seid 733222547867341420 第二章 物理层 主要知识点为数
  • Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    重点 1 正数截位 直接看截掉的最高位是不是一 是的话进一 负数截位 截的最高位为1且其它位不全是0进一 2 饱和 也就是大于求的结果 整数变为符号位为0 其它位为1 负数变成第一位为1 其它位为0 一 引言 在利用Verilog写数字信号
  • Python入门到放弃(一)

    介绍python和库文件管理 python是解释型语言 Python的特点 简单 易学 速度快 免费开源 高层语言 可移植性 解释性 面向对象 也支持面向过程 可扩展性 可嵌入性 丰富的库 规范的代码 在cmd中退出python 输入exi
  • Tomcat优化相关问题

    1 你怎样给 tomcat 去调优 JVM 参数调优 Xms 表示 JVM 初始化堆的大小 Xmx表示 JVM 堆的最大值 这两个值的大小一般根据需要进行设置 当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出 并且导致应用服务崩溃
  • Spark(七)——累加器和广播变量

    5 累加器 通过在驱动器中调用SparkContext accumulator initialValue 方法 创建出存有初始值的累加器 返回值为org apache spark Accumulator T 对象 其中 T 是初始值 ini
  • ObjectARX编程(八) --------有名对象字典、用户字典和字典中的对象

    在AutoCAD数据库中 对象字典是字典类型数据库对象的总称 按其层次关系可分为两类 一是有AutoCAD数据库直接管理的第一层对象字典 二是有第一层对象字典管理的第二层对象字典 为了便于区别 我们把第一层对象字典称为有名对象字典 用于在应
  • 浅谈std::move和std::forward原理

    前言 本文主要整理了C 11中std move和std forward的原理 这对理解C 的移动拷贝有很重的意义 一 左值和右值 左值 一般来说 能在内存中取得其地址 即是左值 右值 在内存在无取得其地址的 即是右值 note 左值持久 右
  • Python中MNE库模拟原始脑电数据

    研究脑电算法的时候发现了一个问题 如何评价模型的准确性 之前的工作流程都是先用公开数据集的数据训练好模型 然后放到实测数据上进行参数微调 在公开数据集上进行模型的选择主要是因为公开数据集的数据质量较好 可以排除硬件的影响 从而专心于算法的研
  • RTL仿真验证

    注意 个人学习笔记 后续会进行修改完善 目前还在初步学习阶段 参考gitee上 从零开始写RISC V处理器 在写testbench文件时 有两点需要注意的 第一点就是在testbench文件里加上读指令文件的操作 initial begi
  • Pandas中插入新的行或列

    python中插入新行或列 前言 一 新增列 二 新增行 前言 在特定位置插入行或者列是比较常用的操作 具体的插入操作主要是在哪插入和插入什么 提示 以下是本篇文章正文内容 下面案例可供参考 一 新增列 在pandas中新增列用到的是ins
  • 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配(腾讯2012面试题)

    编写C 中的两个类 一个只能在栈中分配空间 一个只能在堆中分配 腾讯2012面试题 这道题挺好的 HeapOnly cpp include
  • windows修改远程端口号

    windows远程桌面默认使用的是3389 为了提高服务器安全性 可以修改默认端口3389为其它端口号 端口使用原则 TCP与UDP段结构中端口地址都是16比特 所以端口范围在0 65535 对于这65536个端口号有以下的使用规定 1 端
  • java 根据已有ppt模板修改其内容

    现有需求 根据数据库数据 定期更新 ppt 报表内容 本文修改内容 主要是 ppt中的图表 测试ppt 代码 package org springblade bigdata ureport service impl import java
  • (一)win10安装hadoop 2.8.5(详细步骤)

    目录 1 JDK 2 Hadoop 2 1 下载 2 2 配置环境变量 2 3 配置文件 2 4 格式化hdfs 已解决 格式化总是报错 The markup in the document following the root eleme
  • JavaSwing结合windowBuilder以及BeautyEye开源UI框架快速实现美观的界面

    前言 虽然Java Swing现在公司用的比较少 但是我们平时学习中经常会用它来做一些小项目或者学校的任务 这个时候我们就发现Swing提供给我们的原生控件太丑了 下面教大家如何快速搭建美观的JavaSwing桌面程序 1 准备工作 首先通
  • GRPC详解

    什么是GRPC 官网 gRPC gRPC 是一个现代开源高性能远程过程调用 RPC 框架 可以在任何环境中运行 它可以有效地连接数据中心内和跨数据中心的服务 并提供对负载平衡 跟踪 健康检查和身份验证的可插入支持 它还适用于分布式计算的最后