Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

13 | API 风格(下):RPC API介绍

Protocol Buffers介绍
gRPC调用流程
gRPC特性
提供RESTful API接口
实现RPC API服务
gRPC协议
RPC API
RESTful API
适用场景比较
优缺点比较
实现gRPC客户端
实现gRPC服务
生成客户端和服务器代码
定义gRPC服务
用途
Protocol Buffers特性
gRPC介绍
RPC调用流程
远程过程调用
课后练习
总结
RESTful VS gRPC
gRPC示例
Protocol Buffers
RPC介绍
如何设计RPC API?

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。这一讲,我们继续来看下如何设计应用的 API 风格。
上一讲,我介绍了 REST API 风格,这一讲我来介绍下另外一种常用的 API 风格,RPC。在 Go 项目开发中,如果业务对性能要求比较高,并且需要提供给多种编程语言调用,这时候就可以考虑使用 RPC API 接口。RPC 在 Go 项目开发中用得也非常多,需要我们认真掌握。

RPC 介绍

根据维基百科的定义,RPC(Remote Procedure Call),即远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员不用额外地为这个交互作用编程。
通俗来讲,就是服务端实现了一个函数,客户端使用 RPC 框架提供的接口,像调用本地函数一样调用这个函数,并获取返回值。RPC 屏蔽了底层的网络通信细节,使得开发人员无需关注网络编程的细节,可以将更多的时间和精力放在业务逻辑本身的实现上,从而提高开发效率。
RPC 的调用过程如下图所示:
RPC 调用具体流程如下:
Client 通过本地调用,调用 Client Stub。
Client Stub 将参数打包(也叫 Marshalling)成一个消息,然后发送这个消息。
Client 所在的 OS 将消息发送给 Server。
Server 端接收到消息后,将消息传递给 Server Stub。
Server Stub 将消息解包(也叫 Unmarshalling)得到参数。
Server Stub 调用服务端的子程序(函数),处理完后,将最终结果按照相反的步骤返回给 Client。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

gRPC是一种基于HTTP 2.0协议开发的高性能、开源的通用RPC框架,采用Protocol Buffers数据序列化协议,支持多语言、双向流、消息头压缩、单TCP的多路复用、服务端推送等特性。本文通过示例详细介绍了如何使用gRPC编写API接口,包括定义gRPC服务、生成客户端和服务器代码、实现gRPC服务以及实现gRPC客户端的步骤。同时,还介绍了在具体场景中的注意事项,如通过指针来判断客户端是否传入参数。这篇文章全面介绍了gRPC框架的特点和使用方法,对于想要快速了解和使用gRPC的读者具有很高的参考价值。 在Go项目开发中,RESTful API适合用在需要对外提供API接口的场景中,而RPC API因为性能比较高、调用方便,更适合用在内部业务中。推荐使用gRPC协议,因为它轻量、性能高、稳定,是一个优秀的RPC框架。此外,文章还提到了其他优秀的Go RPC框架,如腾讯的tars-go、阿里的dubbo-go、Facebook的thrift、rpcx等,读者可以根据实际情况进行选择。 课后练习包括使用gRPC包快速实现一个RPC API服务并实现PrintHello接口,以及思考如何让一个gRPC服务同时提供RESTful API接口。这些练习有助于读者加深对gRPC的理解和应用。 总之,本文通过对gRPC框架的介绍和实际应用场景的讨论,为读者提供了全面的参考和指导,有助于他们快速了解和应用gRPC技术。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(42)

  • 最新
  • 精选
  • pedro
    假定希望用RPC作为内部API的通讯,同时也想对外提供RESTful API,又不想写两套,可以使用gRPC Gateway 插件,在生成RPC的同时也生成RESTful web server。

    作者回复: 正解

    2021-06-24
    66
  • Geek_e7af5e
    这里提供一些更新说明(刚踩过的坑) github.com/golang/protobuf/protoc-gen-go和google.golang.org/protobuf/cmd/protoc-gen-go是不同的。区别在于前者是旧版本(操作类似于作者大大的),后者是google接管后的新版本,他们之间的API是不同的,也就是说用于生成的命令,以及生成的文件都是不一样的。因为目前的gRPC-go源码中的example用的是后者的生成方式,所以这里提供后者说明: 1. 首先需要安装两个库: go install google.golang.org/protobuf/cmd/protoc-gen-go go install google.golang.org/grpc/cmd/protoc-gen-go-grpc 2. 然后.proto文件保持一致,输入两个生成代码命令: protoc -I. --go_out=$GOPATH/src helloworld.proto protoc -I. --go-grpc_out=$GOPATH/src helloworld.proto 3. 上述两个命令会生成两个文件: helloworld.pb.go helloworld_grpc.pb.go 这两个文件分别生成message和service的代码,合起来就是老版本的代码 这是排查了两小时的坑,希望大家注意!

    作者回复: 感谢分享!

    2022-01-21
    4
    41
  • 柠柠
    RPC 与 RESTful 共通逻辑抽象出来 Service 层,RPC server 和 RESTful server 初始化or 启动时时都需要指定 service,真正提供服务的是 Service 层

    作者回复: 对的!

    2021-06-25
    14
  • 💎A
    https://www.bookstack.cn/read/API-design-guide/API-design-guide-04-%E6%A0%87%E5%87%86%E6%96%B9%E6%B3%95.md 我又来做贡献了

    作者回复: 感谢分享,文章非常棒!已收藏!

    2021-06-25
    10
  • 不明真相的群众
    你有一个 gRPC 服务,但是却希望该服务同时也能提供 RESTful API 接口,这该如何实现? --------------------------- 在封装一层?

    作者回复: 用这个:https://github.com/grpc-ecosystem/grpc-gateway

    2021-06-24
    6
  • fliyu
    想方便调用grpc,可以使用grpcurl和grpcui,基于反射的方式使用

    作者回复: 感谢分享!

    2022-01-10
    5
  • Juniper
    查了下文档,optional是protoco 3.12版本加入的,如果参数设置成optional,执行时必须要带--experimental_allow_proto3_optional。但是我是3.15.8版本,执行时没有加上--experimental_allow_proto3_optional也没有报错

    作者回复: 我试了,后面的版本去掉了--experimental_allow_proto3_optional参数的限制。那就可以不用加这个选项了,代码我也更新了。

    2021-10-02
    2
    4
  • wei 丶
    老师有个疑问 protoc --go_out=. *.proto protoc --go_out=plugins=grpc:. *.proto 这俩有啥啥区别 😵

    作者回复: 第二个指定了grpc plugin

    2021-08-12
    2
    4
  • 张名哲
    老师,文章中有四种模式,平时用的最多的是哪一种模式?

    作者回复: 简单模式用的比较多

    2021-07-13
    4
  • learner2021
    哪里设置错误了? [going@dev server]$ pwd /home/going/workspace/golang/src/github.com/marmotedu/gopractise-demo/apistyle/greeter/server [going@dev server]$ go run main.go main.go:8:2: no required module provides package github.com/marmotedu/gopractise-demo/apistyle/greeter/helloworld: go.mod file not found in current directory or any parent directory; see 'go help modules' main.go:9:2: no required module provides package google.golang.org/grpc: go.mod file not found in current directory or any parent directory; see 'go help modules'

    作者回复: 看看github.com/marmotedu/gopractise-demo目录下,有没有go.mod。 如果有建议执行下:go mod tidy

    2021-06-24
    4
    3
收起评论
显示
设置
留言
42
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部