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

Go语言 gRPC 简述

参考文章:

聊聊gRPC的特性和背后设计的原则(一)-腾讯云开发者社区-腾讯云

 grpc-我们为什么要用gRpc?gRpc快在哪里?_grpc 优点-CSDN博客

 GRPC详解-CSDN博客

1. 什么是gRPC

        gRPC 是一个高性能 远程调用(RPC)框架,屏蔽分布式计算中的各种调用细节,可以像本地调用一样调用远程的函数。

2. 为什么要用gRPC   

(1) 性能高:使用 protobuf,性能高于json(快6倍); 使用 http2.0,性能高于 http1.1

(2) 生态好:开源,而且背靠Google,连nginx都支持gRPC

(3) 强数据类型:编译环节就帮助避免了数据类型问题。

(4) 跨语言:同一个协议文件(.proto),不用修改,可以使用在多种语言上,包括 go,java,c

3. 使用方式

(1) gRPC 通过 protocol buffers (.proto文件) 来定义接口,接口由服务端和客户端共同使用。

(2) 服务端将方法或者类注册到服务中。

(3) 客户端只要连接成功,就可以调用注册进服务的接口,把请求发到服务端,并获得返回。

4. 为什么protobuf比json快?

     主要是因为数据结构节省空间,具体包括:

(1) 无需分隔符:存储了字段的类型,可以直接计算出value的长度,无需匹配分隔符。

(2) 空字段省略:若字段没有被设置数字值,不需要进行编码。json需要传key和空值value。

(3) 二进制key:key 用字段的数字值转换成二进制表示,比json的key用字符串表示节省空间。

5. http2.0为什么比http1.1性能高?

(1) 多路复用:

http1:一次请求,一个响应,建立一个连接用完关闭,每一个请求都要建立一个连接。

http2:多个请求可并行执行,某个请求任务耗时严重,不会影响到其它连接的正常执行

而且,http2 减少了连接数,避免了频繁重建tcp,改善网络拥塞情况。

(2) 数据压缩:

http1:文本格式

http2:二进制格式,并且对body进行gzip压缩。

(3) 二进制分帧:

http1:以分隔符分割消息的数据,必须按顺序发送,在完成之前不能停止。

http2:将所有传输的信息分割为更小的消息和帧,可以乱序发送,然后根据每个帧首部的流标识符号进行组装。

(4) 支持服务器主动推送

http2 主动推送资源,节省前端的请求次数。

6. 同步和异步

    gRPC同时支持同步调用和异步调用。

    同步RPC调用时会一直阻塞直到服务端处理完成返回结果。

    异步RPC是客户端调用服务端时不等待服务段处理完成返回,而是服务端处理完成后主动回调客户端。

7. 负载均衡

    gRPC并没有直接实现负载均衡的功能,但是提供了负载均衡的接口。

相关文章:

  • 2018 年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书
  • 如何从异步调用中返回响应
  • new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器
  • internvl-chat部署
  • 效果炸裂!使用 GPT-4o 快速实现LLM OS
  • Linux源码编译安装MySQL + Qt连接MySQL
  • 告别虚拟机,在Windows10启动Linux子系统
  • C#面:DataReader与Dataset有什么区别
  • AI Agent智能体概述及原理
  • Android Dialog软键盘弹出问题完美解决办法
  • 自然语言处理(NLP)中的迁移学习
  • IEEE Latex模版踩雷避坑指南
  • 每日一题《leetcode--117.填充每个结点的下一个右侧结点指针||》
  • 基于transformers框架实践Bert系列6-完形填空
  • C++进程间通信 消息队列
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【知识碎片】第三方登录弹窗效果
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • JDK9: 集成 Jshell 和 Maven 项目.
  • linux学习笔记
  • MQ框架的比较
  • web标准化(下)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • - 概述 - 《设计模式(极简c++版)》
  • 手写双向链表LinkedList的几个常用功能
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 异常机制详解
  • elasticsearch-head插件安装
  • Linux权限管理(week1_day5)--技术流ken
  • #pragma pack(1)
  • #单片机(TB6600驱动42步进电机)
  • (3) cmake编译多个cpp文件
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (编译到47%失败)to be deleted
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (过滤器)Filter和(监听器)listener
  • (七)glDrawArry绘制
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Sublime Text3配置Lua运行环境
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .naturalWidth 和naturalHeight属性,
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net下简单快捷的数值高低位切换
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • /boot 内存空间不够
  • @Query中countQuery的介绍
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [4]CUDA中的向量计算与并行通信模式
  • [Android]Tool-Systrace