gRPC-Web

除GraphQL外,JSON RPC优化的另一个取向–gRPCweb
GraphQL着眼的优化点在于通过移交一部分查询的逻辑到客户端,从而减少了数据的交换量,而RPC则着眼于使用可压缩的二进制/文本协议,减少JSON文本传输带来的不必要的协议损失。



gRPC web能给我们带来什么?



1.传输数据量减少,传输延迟降低



HTTP / 2天生具有头压缩等特性,解决了大量频繁的RPC交互通信带来的头部重复传输问题;使用二进制流或压缩文本传输,减少了一部分稀疏编码带来的字节空洞,提高了信息密度。传输速度更快,数据量更小,不仅降低成本,而且可以减少延迟。



2.可靠一致的API设计



客户端服务端使用相同的原文件进行接口定义,双方接口暴露完全相同,一致性更强,相较于传统的招摇接口管理,其数据结构更加直观精确,不再需要维护接口-URL间的复杂对应关系,API升级管理更加简单



3.对传输基础设施无感知的通信协议



节俭不能推出类似gRPCweb的方案的原因也正在于此.Thrift使用私有Tprotocol传输协议,与gRPC的HTTP / 2相比起来通用性大打折扣,Nginx的在最新的稳定版中已经提供了grpc_pass负载均衡支持,我们可以无痛使用原有的四层/七层负载均衡器提供大规模的调用支持



4.高效的序列化/反序列化支持



gRPC相较于JSON,拥有更高的序列化/反序列化效率,易于实现更高的吞吐性能



经过一次通信后,服务器直接返回升级升级连接的报头,随后双方使用的WebSocket进行通信,比起gRPC的协议,更加简易直白。



http://blog.itpub.net/31559359/viewspace-2637227/



总结一下:
1,gRPC-Web 不是 gRPC ,没有利用 Http2。
2,gRPC 不能和 Controller 放在同一项目,但 gRPC-Web 可以。
3,gRPC-Web 提供了一种代替 WebApi 的选择,后台项目之间的调用推荐 gRPC 不推荐 gRPC-Web。



https://blog.csdn.net/zl33842902/article/details/106904362/

A JavaScript implementation of gRPC for browser clients. For more information,
https://github.com/grpc/grpc-web



gRPC-web clients connect to gRPC services via a special proxy; by default, gRPC-web uses Envoy.



gRPC-Web 是一个 JavaScript 库,使 Web 应用程序能够直接与后端 gRPC 服务通信,不需要 HTTP 服务器充当中介。



目前 gRPC-Web 通过特殊网关代理连接到 gRPC 服务:默认情况下,当前版本的库使用了 Envoy 代理,它内置了对 gRPC-Web 的支持。
gRPC-Web 让你能够使用.proto 来定义客户端 Web 应用程序和后端 gRPC 服务器之间的服务“契约”,并自动生成客户端 JavaScript(你可以选择 Closure 编译器或使用更为广泛的 CommonJS)。你可以不用再为这些事情操心:创建自定义 JSON 序列化和反序列化逻辑、处理 HTTP 状态代码(可能因REST API 而异)、Content-Type 协商等。



https://www.oschina.net/p/grpc-web?hmsr=aladdin1e1



https://docs.microsoft.com/zh-cn/aspnet/core/grpc/browser?view=aspnetcore-6.0



gRPC-Web是一个JavaScript客户端库,使Web应用程序能够直接与后端gRPC服务通信,而不需要HTTP服务器充当中介。这意味着你现在可以通过使用.proto 文件定义客户端和服务器端数据类型和服务接口,轻松构建真正的端到端gRPC应用程序架构。因此,gRPC-Web为整个REST开发Web范例提供了一个引人注目的新选择。



需要明确的是,REST应用程序本身没有任何问题。使用REST API服务器构建了大量非常成功的应用程序,但是如果这些服务器使用非HTTP协议与后端服务进行通信,那么需要进行大量转换gRPC-Web的好处从“技术”上解决这个问题。



使用gRPC-Web的优点



随着时间的推移,gRPC-Web将提供更广泛的功能集。但我可以看到它从一开始就提供了一些巨大的胜利:



端到端gRPC - 如上所述,使用gRPC-Web,可以正式从堆栈中删除REST组件并将其替换为纯gRPC,从而使能够使用Protocol Buffers创建整个 RPC管道。
前端和后端团队之间更紧密的协调- 使用Protocol Buffers定义整个RPC管道,不再需要将“微服务团队”与“客户端团队”分离。客户端 - 后端交互只是一个gRPC层。
轻松生成客户端库- 使用gRPC-Web,意味着后端服务器是gRPC服务器而不是HTTP服务器,这意味着您的所有服务都是客户端库也可以是gRPC库。需要Ruby,Python,Java和其他4种语言的客户端库吗?您不再需要为所有这些客户端编写HTTP客户端。



https://www.jdon.com/50508
https://www.cnblogs.com/a00ium/p/14158625.html



gRPC is a modern, HTTP2-based protocol, that provides RPC semantics using the strongly-typed binary data format of protocol buffers across multiple languages (C++, C#, Golang, Java, Python, NodeJS, ObjectiveC, etc.)



https://github.com/improbable-eng/grpc-web



$ protoc todos.proto

–js_out=import_style=commonjs:./output

–grpc-web_out=import_style=commonjs:./output
#https://www.cnblogs.com/a00ium/p/14158625.html



% npm i grpc-web



#https://blog.csdn.net/u013919171/article/details/113520401



#https://github.com/improbable-eng/grpc-web
#https://www.npmjs.com/package/grpc



#https://github.com/improbable-eng/grpc-web/tree/master/go/grpcweb



#https://github.com/improbable-eng/grpc-web/tree/master/go/grpcwebproxy



#https://github.com/improbable-eng/ts-protoc-gen
#https://github.com/improbable-eng/grpc-web/tree/master/client/grpc-web



#https://www.cnblogs.com/dhqy/p/14110029.html



#https://github.com/grpc/grpc-web/releases/download/1.3.1/protoc-gen-grpc-web-1.3.1-darwin-x86_64
#https://github.com/grpc/grpc-web/releases
#https://www.cnblogs.com/dhqy/p/14110029.html
$ sudo mv ~/Downloads/protoc-gen-grpc-web-1.3.1-darwin-x86_64

/usr/local/bin/protoc-gen-grpc-web
$ chmod +x /usr/local/bin/protoc-gen-grpc-web
#https://blog.csdn.net/qq_32828933/article/details/108334190



% protoc todos.proto \
–js_out=import_style=commonjs:./output

–grpc-web_out=import_style=commonjs:./output
–grpc-web_out: todos.proto: options: mode is required



% protoc todos.proto

–js_out=import_style=commonjs:./output

–grpc-web_out=import_style=commonjs,mode=grpcwebtext:./output



$ protoc -I=. echo.proto

–js_out=import_style=commonjs:./client

–grpc-web_out=import_style=commonjs,mode=grpcwebtext:./client



% git submodule add https://github.com/grpc/grpc-web



Category golang