13 | API 风格(下):RPC API介绍
该思维导图由 AI 生成,仅供参考
RPC 介绍
- 深入了解
- 翻译
- 解释
- 总结
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-2466 - 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-21441 - 柠柠RPC 与 RESTful 共通逻辑抽象出来 Service 层,RPC server 和 RESTful server 初始化or 启动时时都需要指定 service,真正提供服务的是 Service 层
作者回复: 对的!
2021-06-2514 - 💎Ahttps://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-2510 - 不明真相的群众你有一个 gRPC 服务,但是却希望该服务同时也能提供 RESTful API 接口,这该如何实现? --------------------------- 在封装一层?
作者回复: 用这个:https://github.com/grpc-ecosystem/grpc-gateway
2021-06-246 - fliyu想方便调用grpc,可以使用grpcurl和grpcui,基于反射的方式使用
作者回复: 感谢分享!
2022-01-105 - Juniper查了下文档,optional是protoco 3.12版本加入的,如果参数设置成optional,执行时必须要带--experimental_allow_proto3_optional。但是我是3.15.8版本,执行时没有加上--experimental_allow_proto3_optional也没有报错
作者回复: 我试了,后面的版本去掉了--experimental_allow_proto3_optional参数的限制。那就可以不用加这个选项了,代码我也更新了。
2021-10-0224 - wei 丶老师有个疑问 protoc --go_out=. *.proto protoc --go_out=plugins=grpc:. *.proto 这俩有啥啥区别 😵
作者回复: 第二个指定了grpc plugin
2021-08-1224 - 张名哲老师,文章中有四种模式,平时用的最多的是哪一种模式?
作者回复: 简单模式用的比较多
2021-07-134 - 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-2443