写点什么

gRPC-Web 发布,REST 又要被干掉了?

  • 2018-10-28
  • 本文字数:0 字

    阅读完需:约 1 分钟

云原生计算基金会(CNCF)正式发布 GA 版本的 gRPC-Web,这是一个 JavaScript 客户端库,使 Web 应用程序能够直接与后端 gRPC 服务通信,不需要 HTTP 服务器充当中介。这意味着你现在可以通过.proto 文件来定义客户端和服务器端数据类型和服务接口,轻松构建真正的端到端 gRPC 应用程序架构。gRPC-Web 为 Web 开发提供了 REST 之外的另一个选择。

基础

gRPC-Web 让你能够使用.proto 来定义客户端 Web 应用程序和后端 gRPC 服务器之间的服务“契约”,并自动生成客户端 JavaScript(你可以选择 Closure 编译器或使用更为广泛的 CommonJS)。你可以不用再为这些事情操心:创建自定义 JSON 序列化和反序列化逻辑、处理 HTTP 状态代码(可能因​​REST API 而异)、Content-Type 协商等。

从更广泛的架构角度来看,gRPC-Web 让端到端的 gRPC 成为可能。如下图所示:

在左侧,一个客户端应用程序通过 Protocol Buffers 与一个 gRPC 后端服务器通信,然后这个服务器也通过 Protocol Buffers 与其他的 gRPC 后端服务器通信。在右侧,Web 应用程序通过 HTTP 与后端 REST API 服务器通信,然后这个服务器又通过 Protocol Buffers 与其他后端服务通信。

需要明确指出的是,右侧的 REST 应用程序本身没有任何问题。已经有大量非常成功的应用程序是基于 REST API 服务器而构建的,这些服务器使用非 HTTP 协议与后端服务进行通信。但如果这些应用程序的开发过程只围绕一个协议和一组.proto 接口(以及一组服务契约)进行,那么就可以节省无数个小时的时间以及避免那些令人头疼的问题。gRPC-Web 的好处不仅仅体现在“技术”方面,还体现在对组织的影响上。图中的亮橙色线不仅仅是一个协议——它代表的是独立的工作和认知负荷来源,而现在,你完全可以把它变成亮绿色。

gRPC-Web 的优势

随着时间的推移,gRPC-Web 将提供更广泛的特性集。目前,我可以看到的是:

  • 端到端 gRPC——如上所述,有了 gRPC-Web,你就可以正式从技术栈中移除 REST 组件,并用 gRPC 来替换,从而可以使用 Protocol Buffers 来创建整个 RPC 管道。想象一下这样的场景:一个客户端请求被转发到 HTTP 服务器上,HTTP 服务器与后端的 5 个 gRPC 服务进行交互。你很可能需要花费很多时间来构建 HTTP 交互层,因为你需要构建整个管道的其余部分。
  • 前端和后端团队之间更紧密的协作——回看上面的图表,使用 Protocol Buffers 定义整个 RPC 管道后,你就不再需要将“微服务团队”与“客户端团队”捆绑在一起。客户端与后端之间的交互只是多了一个 gRPC 层。
  • 轻松生成客户端库——使用 gRPC-Web 之后,与“外部”世界交互的服务器变成了 gRPC 服务器而不是 HTTP 服务器,这意味着所有的客户端库都可以是 gRPC 库。需要 Ruby、Python、Java 和其他 4 种语言的客户端库吗?你不再需要为所有这些语言编写 HTTP 客户端了。

一个 gRPC-Web 示例

上面介绍了 gRPC-Web 在大规模应用中的一些优势。现在让我们通过一个例子来说明:一个简单的 TODO 应用程序。在 gRPC-Web 中,你可以从一个简单的 todos.proto 定义开始,如下所示:

复制代码
syntax = “proto3”;
 
package todos;
 
message Todo {
string content = 1;
bool finished = 2;
}
 
message GetTodoRequest {
int32 id = 1;
}
 
service TodoService {
rpc GetTodoById (GetTodoRequest) returns (Todo);
}

你可以使用这个.proto 定义和 protoc 命令行工具生成 CommonJS 客户端代码:

复制代码
protoc echo.proto \
--js_out=import_style=commonjs:./output \
--grpc-web_out=import_style=commonjs:./output

然后从后端 gRPC 服务器获取 TODO 列表:

复制代码
const {GetTodoRequest} = require(‘./todos_pb.js’);
 
const {TodoServiceClient} = require(‘./todos_grpc_web_pb.js’);
 
const todoService = new proto.todos.TodoServiceClient(‘http://localhost:8080’);
const todoId = 1234;
 
 
var getTodoRequest = new proto.todos.GetTodoRequest();
 
getTodoRequest.setId(todoId);
 
var metadata = {};
 
var getTodo = todoService.getTodoById(getTodoRequest, metadata, (err, response) => {
 
if (err) {
console.log(err);
} else {
const todo = response.todo();
 
if (todo == null) {
console.log(`A TODO with the ID ${todoId} wasn’t found`);
} else {
console.log(`Fetched TODO with ID ${todoId}: ${todo.content()}`);
}
}
});

这里没有 HTTP 代码或方法,没有 JSON 解析,没有头部信息协商。你声明了数据类型和服务接口,gRPC-Web 抽离了所有的样板代码,留给你的是一组干净且人性化的 API。

在后端,gRPC 服务器可以使用任何支持 gRPC 的语言编写,包括 Go、Java、C++、Ruby、Node.js 等等(请参阅官方 gRPC 文档中的与开发语言相关的文档 https://grpc.io/docs/ )。最后一个关键组件是服务代理。从一开始,gRPC-Web 支持将 Envoy 作为默认服务代理,它提供了内置的 envoy.grpc_web 过滤器,只需几行配置即可。更多信息将在 Envoy 博客上( https://blog.envoyproxy.io/ )详细说明。

下一步

GA 版本的发布意味着核心构建块已经就绪,可以用在生产环境中。但 gRPC-Web 还将带来很多其他的东西。可以查看官方的开发路线图( https://github.com/grpc/grpc-web/blob/master/ROADMAP.md ),以便了解核心团队所设想的未来。

如果你有兴趣为 gRPC-Web 做出贡献,核心团队希望社区能够为以下事项提供帮助:

  • 前端框架集成——常用的前端框架(如 React、Angular 和 Vue)尚未正式支持 gRPC-Web。我们希望看到这些框架能够支持它,因为每个框架都将从 gRPC 中受益匪浅。
  • 特定于语言的代理支持——截止 GA 版本,Envoy 是 gRPC-Web 的默认代理,通过一个特殊的模块提供支持。我们也很乐意看到使用其他特定语言开发进程内代理。进程内代理移除了对特殊代理的依赖——例如 Envoy 和 nginx——并且可以让 gRPC-Web 的使用变得更加容易。

查看英文原文: https://www.cncf.io/blog/2018/10/24/grpc-web-is-going-ga/

2018-10-28 04:3412238
用户头像

发布了 731 篇内容, 共 413.9 次阅读, 收获喜欢 1977 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

对话抖音电商:量级庞大、参差不齐,“数据质量治理”有妙招!

字节跳动数据平台

大数据 数据治理 电商 抖音 企业号 3 月 PK 榜

PyTorch 深度学习实战 | Fashion MNIST图片重建实战

TiAmo

深度学习 MNIST

Github霸榜!由阿里出品的最新java面试极速突击核心讲

Java编程日记

Java 架构 面试 java程序员 java面试

远程控制电脑软件哪个好?

RayLink

远程控制软件 远控软件 远程桌面连接

手把手教小伙伴们使用 Nginx 部署 TienChin 项目!

江南一点雨

Java nginx Vue 前后端分离 springboot

MobPush Android SDK API

MobTech袤博科技

2023腾讯最新发布JVM调优笔记,轻松拿捏JVM面试,调优

开心学Java

Java JVM GC

天天预约|新功能工具「美团优惠券」上线啦!

天天预约

虚拟机专用Win10/win11系统镜像下载(m1/intel合集)

真大的脸盆

Mac win10 Mac 软件 win11 win镜像文件

数字孪生智慧停车场三维可视化管理云平台

2D3D前端可视化开发

智慧停车场 停车场三维可视化 数字孪生智慧停车 无人值守停车场 停车场物联网系统

云原生月报丨值得开发者关注的最新动态

阿里巴巴中间件

阿里云 云原生 月报

2023 年开源现状报告确认安全是首要问题

开源雨林

统计学 开源软件 开源现状

腾讯首席架构师亲自码出的“Redis深度笔记”PDF版限时分享

开心学Java

Java 数据库 redis 腾讯

《流浪地球2》里的机器人企业,如何高质量地交付产品?

万事ONES

MobPush,专业和免费的消息推送SDK

MobTech袤博科技

宝刀未老?低代码何德何能受大厂们的推崇

这我可不懂

低代码 数字化 大厂 JNPF

软件测试/测试开发丨app自动化测试之Capability 使用进阶

测试人

软件测试 自动化测试 测试开发 appium capability

解决方案| anyRTC融合腾讯会议

anyRTC开发者

音视频 视频会议 视频通话 融合会议 腾讯会议

对话 BitSail Contributor | 吴畅:从好奇,到深入

字节跳动数据平台

大数据 开源 开发者 数据集成 企业号 3 月 PK 榜

你掌握了吗?在PCB设计中,又快又准地放置元件

攻城狮华哥

模块 元器件 PCB 原理图 PCB设计

计算界年度大赛“先导杯”再度来袭!

科技热闻

软件测试/测试开发丨app自动化测试之模拟器控制

测试人

软件测试 自动化测试 Android Studio 测试开发 appium

奇怪的翻译

五月的风

翻译软件 ChatGPT

最新Github霸榜标星96K!号称Java八股“PLUS”版,限时开源!

Java编程日记

Java 程序员 架构 Java 面试 java程序员

基于ByteHouse构建实时数仓实践

字节跳动数据平台

数据库 云原生 Clickhouse 企业号 3 月 PK 榜

国内首家!云科通明湖应用交付控制器通过金融信创生态实验室适配验证

云科通明湖

火山引擎DataTester:抖音的设计团队是如何用A/B测试实现高效优化的?

字节跳动数据平台

大数据 AB testing实战 抖音 A/B 测试 企业号 3 月 PK 榜

数仓发展史:大数据的“底气”来自于哪?

鼎道智联

大数据 数据仓库

2023年市场快速恢复,社交资讯营销如何把握新机遇

易观分析

社交 资讯

中国券商数字化转型趋势报告2023

易观分析

金融 券商 经济

Open-GeoIP:超简单的开源IP地址位置查询服务

冯骐

golang 开源 网络 ip地理定位 geoip

gRPC-Web发布,REST又要被干掉了?_REST_Luc Perkins_InfoQ精选文章