热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

REST的替代者:Envoy+gRPC-Web

自从在我觉得gRPC-Web的优势就是自Web端向下构建了完整的端到端gRPC服务架构。在以前,如果

gRPC-Web 作为gRPC的Javascript客户端库,使Web应用可以不用自定义HTTP服务器为中介,直接通过Envoy与gRPC服务交互。经过了约两年的活跃开发,上周(2018年10月底,译者注)gRPC团队在CNCF博客宣布gRPC-Web的GA版本正式发布。

自从在 Improbable engineering blog 读到了 这篇博文 ,我个人就对gRPC-Web很感兴趣。之前一直很看好gRPC的性能、可拓展性和IDL(接口描述语言)驱动的服务交互方式,而且特别想在服务调用链中去掉REST部分。我很高兴gRPC-Web发布正式版本,它在 Web 开发领域开辟了新的方式。

我觉得gRPC-Web的优势就是自Web端向下构建了完整的端到端gRPC服务架构。在以前,如果你想让web端与gRPC服务交互,就必须自己开发REST接口处理HTTP和gRPC之间的转换。而使用gRPC-Web,我们不再需要自己写额外的HTTP接口,可以直接用 Protocol Buffers 封装所有数据接口(这里借用了Envoy,在下文我会详细解释)。

REST 方式

下图展示了基于gRPC服务架构构建Web App的两种方式。左边是传统的REST方式。右边是gRPC-Web方式。

REST的替代者:Envoy+gRPC-Web

左图所示,REST API只是作为Web App和后端gRPC服务的连接点。在大部分场景下,REST 服务就是简单的将HTTP调用转换成gRPC调用。

举个例子:客户端需要验证服务于是用 POST 请求提交 JSON数据到HTTP服务器的 /auth 。然后HTTP端把JSON数据转换成Protobuf消息 AuthRequest ,并将消息发送给gRPC认证服务,最后从gRPC服务获取到 AuthResponse 响应并将其转换成JSON数据返回给前端。正如我在 CNCF博客 中 文章 中说的一样,这种方法本身并没有错,它是一种解决方案,而且很多开发者都用的很好,如果它能满足你,你可以继续这样用。

更好的方案:如果可以去掉HTTP中介我们会少做很多工作(试想一下,Javascript 端直接发送 AuthRequest 消息给gRPC服务并获得 AuthResponse 响应)。这意味着我们不需要关心HTTP状态码、JSON解析和HTTP服务本身带来的部署和管理问题。

上图右半部分是使用gRPC-Web的替代方案。它的架构更加清晰,一个protocol贯穿整个gRPC服务调用的始终。不再有额外的HTTP逻辑,所有的数据接口都在 .proto 文件中定义。整个调用过程就是客户端向gRPC服务发送Protobuf消息并从服务获取Protobuf消息。

我们仅需要一个组件就能达到这种比较好的效果。

Envoy 所扮演的角色

这里必须承认,我之前讲gRPC-Web直接调用gRPC服务的这种说法不是完全正确的。使用gRPC-Web的客户端调用仍然需要转换成对于gRPC友好的调用。Envoy填补了这个角色。同时Envoy也是gRPC-Web内置的默认服务网关。

下图中展示了Envoy结合gRPC-Web使用。图中Web App调用了一个gRPC服务,该服务又依赖另外两个gRPC服务。Envoy 将 HTTP/1.1 请求转换成 HTTP/2 请求。底层其实还是需要进行HTTP协议的转换,但客户端和服务端都不需要考虑HTTP层的问题。

REST的替代者:Envoy+gRPC-Web

gRPC-Web明显优于REST,因为它只需开发者创建一个Envoy并做一些基础配置,而不需要自己创建转换层。

Envoy 示例配置

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/”
                route:
                  cluster: auth_service
              cors:
                allow_origin:
                - "*"
                allow_methods: GET, PUT, DELETE, POST, OPTIONS
                allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web
                max_age: "1728000"
                expose_headers: grpc-status,grpc-message
                enabled: true
          http_filters:
          - name: envoy.grpc_web
          - name: envoy.cors
          - name: envoy.router
  clusters:
  - name: auth_service
    connect_timeout: 0.25s
    type: logical_dns
    http2_protocol_options: {}
    lb_policy: round_robin
    hosts:
socket_address:
  address: auth-server
  port_value: 9090

总的来讲它就是Envoy最基本的HTTP配置,只是有一点点区别:

  • 一点 gRPC-Web 必须的自定义头部: x-grpc-webgrpc-statusgrpc-message (Javascript 会自动处理它们)
  • 内置的 envoy.grpc_web HTTP过滤器用来完成繁杂的gRPC-Web代理工作
  • auth_service 配置中指定 http2_protocol_options: {} 来获取HTTP/2的链接

你只需要写一点YAML配置就可以从额外的HTTP适配工作中解脱出来。你不用关心HTTP与gRPC的方法映射问题,也不用去StackOverflow找HTTP的哪个状态码对应gRPC的哪个状态码,更不需要将Proto消息包装成JSON。

新方式

gRPC-Web + Envoy为web开发提供了一种全新的方式,它能保证Protocol Buffers和gRPC的类型安全还规避了HTTP+REST中的很多常见问题。我推荐大家在自己的下一个项目中试试它。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 探讨异步 Rust 中多线程代码无法实现并行化的原因及解决方案。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 大家好,我是李白。本文将分享一个从零开始的全栈项目,涵盖了设计、前端、后端和服务端的全面学习过程。通过这个项目,我希望能够帮助初学者更好地理解和掌握全栈开发的技术栈。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
author-avatar
格个蝎子_844
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有