一、grpc-web简介
grpc-web是Google于2018年发布的一个支持在Web浏览器中使用gRPC服务的技术。gRPC 是一个高性能的远程过程调用框架,支持多种语言,包括 C、C#、Go、Java、Python、Ruby、Objective-C 等等。在跨平台方面,gRPC 也特别强大,我们既可以使用 gRPC 在各种环境间通讯,也可以使用更轻量级的 protobuf 协议来实现跨语言调用。而 grpc-web 实现了在Web浏览器中使用 gRPC 服务的功能,已经在一些大型项目中得到了应用。
二、grpc-web的优点
相对于原本的http通讯,引入gRPC的通讯有如下优点:
1. 更优秀的性能
gRPC采用 Protobuf(Protocol Buffers)作为序列化工具,而 Protobuf 是一种二进制序列化工具,能够高效地进行编解码。因此,采用 gRPC 相比 HTTP 通信可以显著提升性能,尤其是在移动端和高并发场景下。
2. 跨平台支持
gRPC 使用 Protobuf 协议,在不同平台和编程语言之间实现了不受限制的通讯,同时还支持 HTTP/2 协议,使其在 Web 应用中可以很好地使用。
3. 更加灵活的传输
gRPC支持多种协议类型,可以选择不同的序列化方式以及传输协议。例如,在 TCP/IP 协议底层上使用 Protobuf 来序列化通讯数据,或者在 HTTP/2 上使用 ProtoBuf 来序列化通讯数据,从而兼具高性能和跨语言支持。
4. 自动生成代码
gRPC不仅自动生成了客户端和服务端的底层代码,还可以通过 proto 编译器生成相应语言的代码,方便了开发人员快速上手,减少了开发人员的编写工作量。
三、grpc-web的使用
1. 环境搭建
在使用 grpc-web 之前,我们需要先安装 protobuf 和 grpc 环境。同时,也需要安装对应语言的 grpc 插件,例如 gRPC for Java等。这里只提供Javascript环境的安装方式:
npm install grpc-web
同时还需要生成 proto 文件并编译为 JavaScript,由 proto-loader 帮助我们实现 proto 文件和 JavaScript 的相互转换。使用如下命令可以进行 proto-loader 的安装:
npm install @grpc/proto-loader
2. 生成.proto文件
首先需要编写Protobuf语言的.proto文件,protobuf是一种语言中立、平台中立、可扩展的序列化结构数据的格式,适用于数据存储、数据交换和配置文件等领域。
以下是简单的proto文件定义:
syntax = "proto3";
package greeter;
option go_package = "pb";
service Greeter {
rpc Hello(HelloRequest) returns (HelloReply) {
}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
编译.proto文件:
protoc --proto_path=. ./greeter.proto --js_out=import_style=commonjs:. --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.
3. 编写前端代码
使用前需要调用MetholdNameClient来进行初始化:
const { MetholdNameClient } = require('service_grpc_web_pb.js');
const { MetholdRequst } = require('service_pb.js');
const client = new MetholdNameClient('http://localhost:8080', null, null);
const name = 'world';
const request = new MetholdRequst();
request.setName(name);
client.metholdName(request, {}, (err, response) => {
if (err) {
console.log(err);
} else {
console.log(response.getData());
}
});
初始化后,就可以通过调用gRPC方法进行通讯了。
四、grpc-web的实际应用
grpc-web已经在一些大型项目中得到了应用,如Uber的调度系统等。另外,使用 gRPC + grpc-web 进行微服务架构的部署也是不错的选择。
五、总结
grpc-web是一个非常高效的跨平台实时应用编程解决方案,它充分利用了gRPC和Protobuf所提供的高性能和跨平台支持等优点,在Web应用开发中得到广泛应用。使用 grpc-web,我们可以给 Web 应用带来更快、更稳定的通讯能力。