1. 背景
学习ing
2. HTTP 微服务 与 GRPC 微服务的区别
grpc和http协议比较大的差异在于grpc需要通过
protobuf
来实现API接口以及数据结构的定义。
2.1. 通信协议和效率:
-
gRPC: 基于HTTP/2协议,利用ProtoBuf(Protocol Buffers)作为高效的二进制序列化格式,这使得gRPC在数据传输上更为高效,减少带宽消耗并提高速度。gRPC还利用了HTTP/2的多路复用特性,可以在单个TCP连接上并行处理多个请求响应,减少了网络延迟。
-
HTTP微服务: 通常使用JSON作为数据交换格式,通过HTTP/1.1或HTTP/2协议。虽然HTTP/2也支持多路复用,但在实际应用中,HTTP请求往往比gRPC更冗长,因为JSON相比ProtoBuf来说体积更大,解析也更耗时。
2.2. 接口定义和代码生成:
-
gRPC: 强依赖于.proto文件来定义服务接口和消息结构,然后通过gRPC工具自动生成客户端和服务端的存根代码(Stub),支持多种编程语言,大大简化了跨语言通信的复杂度。
-
HTTP微服务: 通常采用RESTful风格,接口定义较为灵活,但缺乏标准的接口描述语言和自动代码生成工具。开发者需要手动编写和维护客户端和服务端的API调用逻辑。
2.3. 功能特性:
-
gRPC: 支持双向流、服务端流、客户端流以及双向流式处理,这对于实时数据传输和交互式服务非常有利。此外,gRPC提供了丰富的元数据支持和身份验证机制。
-
HTTP微服务: 虽然可以通过长轮询或者SSE(Server-Sent Events)模拟流式处理,但并不原生支持双向或多向流。RESTful API在设计上更侧重于资源的表述和操作,适合简单的CRUD操作。
2.4. 适用场景:
-
gRPC: 适合内部微服务通信,尤其是那些对性能有高要求、需要频繁且低延迟通信的服务间交互。
-
HTTP微服务: 更适用于对外暴露的API,因为其简单性和广泛接受度,以及浏览器和许多第三方库的良好支持。
2.5. 社区和生态系统:
-
HTTP微服务: 由于RESTful API的普及,拥有更广泛的社区支持和成熟的工具链。
-
gRPC: 虽然相对较新,但得益于Google的推动和其在高性能场景下的优势,生态也在迅速发展,特别是在云原生和微服务架构中。
3. 创建文件:helloworld.proto
syntax = "proto3";
package protobuf;
option go_package = "github.com/gogf/gf/grpc/example/helloworld/protobuf";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;