Categories
程式開發

微软发布gRPC-Web实现,可直接在浏览器端调用gRPC服务


最近,微软发布了.NET的gRPC-Web协议实现。该组件最初是作为一个实验特性,现在是grpc-dotnet项目的一部分。有了该组件,就可以在浏览器中使用gRPC,Web应用程序可以不通过HTTP代理服务器直接与gRPC服务通信。

gRPC最初由谷歌开发,是一个高性能远程过程调用框架,基于HTTP/2实现。但由于浏览器没有直接暴露HTTP/2,所以Web应用程序不能直接使用gRPC。gRPC- Web是一个标准化协议,它解决了这个问题,可以在浏览器中使用gRPC。

今年早些时候,微软宣布将gRPC-Web作为一个实验项目。当时,ASP.NET Core首席软件工程师James Newton-King表示该项目并不是一个正式项目:

我们想测试一下我们的gRPC-Web实现,并获取反馈,看看与使用代理相比,这种方法对.NET开发人员来说是否有用。

第一个gRPC-web实现是在2018年作为一个JavaScript库发布的,Web应用程序可以通过它直接与gRPC服务通信,无需使用HTTP服务器作为代理。其原理是创建与HTTP/1.1和HTTP/2兼容的端到端gRPC管道,然后浏览器发送常规的HTTP请求,位于浏览器和服务器之间的gRPC-Web代理对请求和响应进行转换。与gRPC类似,gRPC-Web在Web客户端和后端gRPC服务之间使用预定义的契约。Protocol Buffers被用来序列化和编码消息(尽管也可以使用其他编码器)。

微软发布gRPC-Web实现,可直接在浏览器端调用gRPC服务 1

图片来源:gPRC官网

有了这个新组件,.NET Blazor WebAssembly应用程序和JavaScript SPA就可以从在浏览器里直接调用ASP.NET Core gRPC应用程序。他们还提供了一个替代在IIS和Azure App Service服务器上托管ASP.NET Core gRPC应用程序的方案,因为它们目前都不能托管gRPC服务。

不过,在浏览器端使用gRPC-Web调用gRPC服务存在一些限制:不支持客户端流和双向流调用,并且跨域调用gRPC服务需要在服务器端配置CORS。另外,gRPC服务器端必须配置为支持gRPC-Web,或者必须有第三方服务代理(例如Envoy)在浏览器和服务器之间对调用进行转换。

在新的版本中,微软更新了原始的项目文档,并公开了一个gRPC-Web示例应用程序。gRPC-Web在NuGet上有两个独立的包:Grpc.AspNetCore.Web(向ASP.NET Core gRPC服务添加gRPC-Web支持)和gRPC.NET.Client.Web(可在.NET中调用gRPC-Web端点)。该组件需要3.1或更高版本的.NET Core SDK,可在Visual Studio 2019(16.4或更高版本)、Visual Studio Code和Visual Studio for Mac(8.4或更高版本)中使用。更多有关gRPC-Web的信息可以在这里找到。

原文链接

Microsoft Releases gRPC-Web for .NET