Golang 语言 gRPC 到底是什么?

简介: Golang 语言 gRPC 到底是什么?

介绍

我们上一篇文章「Golang 语言 gRPC 使用的接口设计语言 protobuf」介绍了 Golang 语言 gRPC 使用的接口设计语言 Protobuf,本文我们开始介绍主角 - 谷歌开源的 RPC 框架 gRPC。

在正式介绍 gRPC 之前,我们先简单介绍一下什么是 RPC,它是 Remote Procedure Call 的缩写,中文译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议,该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。

gRPC 是通信协议基于 HTTP/2,支持多语言的 RPC 框架,使用 Protobuf 作为它的接口设计语言(IDL),可以通过 protoc 工具生成 Golang 语言的结构体,服务端接口和客户端 Stub。

gRPC 消息序列化方式通常使用 Protobuf,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高,但是可读性差。不过,gRPC 也支持 JSON 序列化方式。

「图片来源:https://grpc.io/img/landing-2.svg

02

怎么使用 gRPC 定义服务端

gRPC 默认使用 Protobuf 作为接口设计语言,我们可以在 .proto 文件中使用 service 关键字定义服务,使用 rpc 和 returns 关键字定义指定请求参数和返回结果的方法。

示例代码:

service User {
  rpc Login (LoginRequest) returns (LoginResponse);
}
message LoginRequest {
  string email = 1;
  string password = 2;
}
message LoginResponse {
  int64 id = 1;
  string name = 2;
}

阅读上面这段代码,我们使用 Protobuf 接口设计语言定义了一个一元 RPC 服务,即客户端向服务端发送一个请求,服务端向客户端返回一个响应。

此外,gRPC 还支持另外三种定义服务的方式,即服务器流式 RPC、客户端流式 RPC 和双向流式 RPC。限于篇幅,我准备在后续文章中详细介绍这四种定义服务的方式,本文先不展开介绍。

gRPC 提供了 Protobuf 编译器插件 protoc-gen-grpc,用于编译 .proto 文件,生成服务端和客户端代码,我们只需在服务端编写实现 Api 的代码,然后在客户端调用 Api。

03

怎么使用 gRPC 的客户端

我们通过 protoc 编译 .proto 文件,自动生成服务端和客户端代码后,我们如果想要使用 gRPC 的客户端,还需要手动编写客户端代码,也就是在服务端实现 Api 的业务逻辑代码,然后在客户端调用 Api,具体如下:

在服务端,手动编写生成的服务端方法的业务逻辑代码,然后运行 gRPC 服务,接收并处理客户端请求,gRPC 服务自动解码请求参数,然后执行服务的方法,并将返回结果自动进行编码。

在客户端,Stub (也称为存根或客户端)实现和服务相同的方法,然后客户端可以本地调用这些方法,将请求参数封装在 Protobuf 的消息类型中,gRPC 将请求发送给服务器,并返回服务器的 Protobuf 序列化方式的响应消息。

04

总结

本文我们介绍了 gRPC 到底是什么,怎么定义 gRPC 的服务端,以及怎么使用 gRPC 的客户端。更多关于 gRPC 的介绍,我建议感兴趣的读者朋友们阅读官网文档了解更多。

推荐阅读:

参考资料:

https://grpc.io/docs/what-is-grpc/ 


目录
相关文章
|
4天前
|
安全 Go
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
【4月更文挑战第24天】Go语言标准库中的`text/template`包用于动态生成HTML和文本,但不熟悉其用法可能导致错误。本文探讨了三个常见问题:1) 忽视模板执行错误,应确保正确处理错误;2) 忽视模板安全,应使用`html/template`包防止XSS攻击;3) 模板结构不合理,应合理组织模板以提高可维护性。理解并运用这些最佳实践,能提升Go语言模板编程的效率和安全性,助力构建稳健的Web应用。
15 0
|
14小时前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
6 1
|
14小时前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
8 1
|
14小时前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
5 0
|
1天前
|
安全 Unix Go
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
【4月更文挑战第26天】Go语言的`time`包提供处理日期和时间的功能,包括`time.Time`类型、时间戳、格式化与解析。本文讨论了核心概念、常见问题(如时区处理、格式字符串混淆、超时控制和并发安全)及解决方法。推荐使用`time.LoadLocation`管理时区,熟悉时间格式规则,用`context`精确控制超时,并注意并发安全。文中通过代码示例展示了如何获取格式化时间、计算时间差以及创建定时任务。学习和应用这些知识可提高程序的健壮性和准确性。
15 2
|
1天前
|
XML JSON Go
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
【4月更文挑战第26天】Go语言的`encoding/xml`库提供XML处理,包括序列化和反序列化。本文讨论了XML处理的基础,如`xml.Marshal`和`xml.Unmarshal`函数,以及常见问题和易错点,如标签命名、结构体嵌套、omitempty标签和命名空间。建议遵循标签命名规则,正确处理嵌套和属性,谨慎使用omitempty,以及理解并有效利用命名空间。文中还给出了基础示例和处理XML属性的代码示例,帮助读者掌握XML处理技巧。
12 1
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
|
1天前
|
JSON JavaScript 前端开发
Golang深入浅出之-Go语言JSON处理:编码与解码实战
【4月更文挑战第26天】本文探讨了Go语言中处理JSON的常见问题及解决策略。通过`json.Marshal`和`json.Unmarshal`进行编码和解码,同时指出结构体标签、时间处理、omitempty使用及数组/切片区别等易错点。建议正确使用结构体标签,自定义处理`time.Time`,明智选择omitempty,并理解数组与切片差异。文中提供基础示例及时间类型处理的实战代码,帮助读者掌握JSON操作。
12 1
Golang深入浅出之-Go语言JSON处理:编码与解码实战
|
1天前
|
安全 Go 开发者
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
【4月更文挑战第25天】Go语言的`text/template`和`html/template`库提供动态HTML生成。本文介绍了模板基础,如基本语法和数据绑定,以及常见问题和易错点,如忘记转义、未初始化变量、复杂逻辑处理和错误处理。建议使用`html/template`防止XSS攻击,初始化数据结构,分离业务逻辑,并严谨处理错误。示例展示了条件判断和循环结构。通过遵循最佳实践,开发者能更安全、高效地生成HTML。
7 0
|
2天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
15 1
|
2天前
|
数据管理 Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第25天】Go语言中的`context`包在并发、网络请求和长任务中至关重要,提供取消、截止时间和元数据管理。本文探讨`context`基础,如`Background()`、`TODO()`、`WithCancel()`、`WithDeadline()`和`WithTimeout()`。常见问题包括不当传递、过度使用`Background()`和`TODO()`以及忽略错误处理。通过取消和超时示例,强调正确传递上下文、处理取消错误和设置超时以提高应用健壮性和响应性。正确使用`context`是构建稳定高效Go应用的关键。
12 1