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

go语言使用grpc

什么是rpc

RPC(Remote Procedure Call)是远程过程调用。可以像调用本地服务一样取调用远程服务。百度的解释是它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。暂时可以先把他的功能理解为何api一样。

rpc调用过程

rpc是基于client / server的,所以在使用rpc时,首先就是建立连接。

rpc和RESTful API的一个区别就是,在进行数据传输的时候,rpc使用的是二进制数据,而API使用的JSON,所以rpc在进行调用的时候需要对数据进行序列化。
在这里插入图片描述

rpc与RESTful API的区别

传输效率上。 rpc使用自定义的协议,对传输数据进行二进制序列化,让请求报文体积更小。但是相对而言就多了序列化的步骤,比较麻烦,RESUful就相对简单些。

本质区别上看,RPC是基于TCP实现的,RestFul是基于HTTP来实现的。

因为HTTP协议是各个框架都普遍支持的。在toC情况下,因为不知道情况来源的框架、数据形势是什么样的,所以在网关可以使用Restful利用http来接受。而在微服务内部的各模块之间因为各协议方案是公司内部自己定的,所以知道各种数据方式,可以使用TCP传输以使各模块之间的数据传输更快。所以可以网关和外界的数据传输使用RESTFUL,微服务内部的各模块之间使用RPC。

golang使用grpc

什么是gprc

gRPC是由Google开发的一款语言中立、平台中立、开源的远程过程调用( RPC)技术,主要用来解决性能损失的问题。gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用Protocol Buffers作为序列化协议。

前置工作

grpc官网
1.安装go版本的proto

Linux:apt install -y protobuf-compiler
Mac:brew install protobuf
Windows: 到  https://github.com/protocolbuffers/protobuf/releases 下载相应的包

2.安装go语言的插件 protoc-gen-go

go get -u  google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
go get -u google.golang.org/protobuf/cmd/protoc-gen-go@v1.26   

3.将GOPATH下的bin目录添加到环境变量中

go get -u google.golang.org/protobuf/cmd/protoc-gen-go@v1.26   

proto 文件如何编写

https://colobu.com/2019/10/03/protobuf-ultimate-tutorial-in-go/

在proto文件编写完毕,在proto文件路径下使用命令
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative xxxx.proto

「注意:」上述的命令中最后的 xxxx.proto 中的xxxx替换自己 proto文件的名字

相关文章:

  • 研究生英语单词学习——Learning English
  • 【Java设计模式 规范与重构】 六 代码重构小结
  • ShardingSphere水平分片、多表关联、绑定表、广播表
  • SSM框架速成2——Spring5速成总结
  • 力扣第312场周赛题解:
  • MySQL流程控制函数
  • GB/T28181-2016基于RTP的视音频数据封装和技术实现
  • String类的详解
  • C/C++新手看过来----新手问题汇总分析
  • C语言 数组作为函数参数
  • 软件测试【秋招面试】字节跳动等各类大厂—面经
  • 【算子2】spark(四):spark core:trans算子中key-value类型的算子使用说明
  • 9.25
  • codeforces-1734C - Removing Smallest Multiples
  • Java IO流的“四大家族”
  • 10个最佳ES6特性 ES7与ES8的特性
  • Apache Pulsar 2.1 重磅发布
  • css选择器
  • isset在php5.6-和php7.0+的一些差异
  • Javascript基础之Array数组API
  • JavaScript设计模式与开发实践系列之策略模式
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Linux链接文件
  • rc-form之最单纯情况
  • vue.js框架原理浅析
  • 阿里云应用高可用服务公测发布
  • 聊聊flink的TableFactory
  • 深度学习在携程攻略社区的应用
  • 思否第一天
  • 一些关于Rust在2019年的思考
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 《天龙八部3D》Unity技术方案揭秘
  • elasticsearch-head插件安装
  • puppet连载22:define用法
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​低代码平台的核心价值与优势
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (day6) 319. 灯泡开关
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • *Django中的Ajax 纯js的书写样式1
  • .bashrc在哪里,alias妙用
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @我的前任是个极品 微博分析
  • [《百万宝贝》观后]To be or not to be?
  • [Android]Android开发入门之HelloWorld
  • [android学习笔记]学习jni编程
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BUUCTF 2018]Online Tool(特详解)
  • [CentOs7]iptables防火墙安装与设置