封神,谷歌架构师分享 出gRPC 与云原生应用开发 Go 和 Java 为例文档

news2024/11/18 17:45:15

前言

随着微服务和云原生相关技术的发展,应用程序的架构模式已从传统的单体架构或分层架构转向了分布式的计算架构。尽管分布式架构本身有一定的开发成本和运维成本,但它所带来的收益是显而易见的。

在实现分布式应用程序时,我们必须考虑两个因素:网络协议和传输载荷的编码。从最早的 RMI+Java 原生序列化,到 HTTP+JSON/XML,业界一直在尝试寻找一种兼具高效性和可读性的方案。虽然在实践微服务的过程中,大家普遍愿意采用更具语义化的 HTTP+JSON 形式,但这种形式有其自身的局限性,比如其网络传输载荷低效、接口规范松散等。

正是在这样的背景下,gRPC 应运而生,借助优异的性能和谷歌的大力推广,gRPC 受到众多大厂青睐。目前,gRPC 已经成为云原生计算基金会的孵化项目,并被广泛应用于众多开源项目和企业级项目中。

gRPC 最大的特点是高性能,HTTP/2+protocol buffers 的组合使其在性能方面具备了天然的优势,这也是 gRPC 广受欢迎的重要原因。但是,相对于更成熟稳定的 HTTP+JSON 组合,gRPC 的风险不容低估,比如其协议不够稳定、社区相对较小等,这些都是在做技术选型的时候需要考虑的重要因素。正如我们所熟知的,从来就没有“银弹”,作为技术从业者,我们只能去分析和对比各种可用的技术,根据自身需求选择最合适的技术方案。

如今,软件应用程序会经常通过计算机网络,借助进程间通信技术实现彼此间的连接。gRPC 是一种基于高性能 RPC(远程过程调用)的现代进程间通信风格,适用于构建分布式应用程序和微服务。随着微服务云原生应用程序的出现,gRPC 的采用率正在呈指数级增长。

本文由浅入深,介绍了 gRPC 相关技术,从通信模式到消息编码,从服务跟踪到容器化部署,并且文中的所有示例都提供了 Java 语言和 Go 语言的两种实现。不管你是只想了解这项新技术,还是想为自己的项目寻找新方案,相信都能从本文中找到感兴趣的话题。

目录

我们以实际用例阐述理论、概念的方式编排了本文的内容。全文广泛使用 Go 和 Java 编写示例代码,帮助你实际运用每个概念。我们将本文分为 8 章。

第 章 gRPC 入门;你将了解 gRPC 的基础知识,并将它与 REST、GraphQL 和其他 RPC 技术等类似的进程间通信风格进行对比。

现代软件应用程序很少是孤立运行的,相反,它们会通过计算机网络连接在一起,并且以互相传递消息的方式进行通信和协调。因此,现代软件系统是分布式软件应用程序的集合,这些应用程序在不同的网络位置运行,并且运用不同的通信协议在彼此间传递消息。例如,一个在线零售软件系统会由多个分布式应用程序组成,如订单管理应用程序、商品目录应用程序和数据库等。为了实现在线零售系统的业务功能,这些分布式应用程序需要相互连接。

第 章 开始使用 gRPC;你将初次体验使用 Go 或 Java 构建完整的 gRPC 应用程序。

关于 gRPC 的理论知识已经介绍得差不多了,接下来根据第 1 章介绍的知识从头构建真正的 gRPC 应用程序。本章将分别使用 Go 和 Java 构建简单的 gRPC 服务以及调用该服务的客户端应用程序。在此过程中,我们将学习如何使用 protocol buffers 声明 gRPC 服务定义、生成服务器端骨架和客户端存根、实现服务的业务逻辑、在 gRPC 服务器上运行我们实现的服务并通过 gRPC 客户端应用程序调用该服务。

本章继续使用第 1 章的在线零售系统,并在这个系统中构建一个管理零售商店中所有商品的服务。该服务可以进行远程访问,服务的消费者能够向系统添加新的商品,并可以根据所提供的商品 ID 检索商品详情。我们将使用 gRPC 建模该服务及其消费者。你可以使用任意喜欢的语言来实现这些功能,但本章将使用 Go 和 Java 来实现。

第 章 gRPC 的通信模式;在这一章中,我们将使用真实的示例探索 gRPC 通信模式。

第 1 章和第 2 章介绍了 gRPC 进程间通信技术的基础知识,其中还涉及构建简单的 gRPC 应用程序。到目前为止,我们已经完成了定义服务接口、实现服务、运行 gRPC 服务器以及通过 gRPC 客户端应用程序远程调用服务等操作。客户端和服务器端之间的通信模式是简单的请求–响应风格的通信,这里每个请求都会得到一个响应。但是,借助 gRPC,可以实现不同的进程间通信模式(也称 RPC 风格),而不仅仅是简单的请求–响应模式。

本章将讨论 gRPC 应用程序的 4 种基础通信模式:一元 RPC、服务器端流 RPC、客户端流 RPC 以及双向流 RPC。在这个过程中,我们会使用一些真实用例来展示每种模式,使用 gRPC IDL 进行服务定义,并使用 Go 语言来实现服务和客户端。

第 章 gRPC 的底层原理;如果你是 gRPC 高级用户,并且对 gRPC 的底层原理感兴趣,那么可以通过这一章来学习这些知识。这一章讲述在服务器端和客户端之间进行 gRPC 通信的步骤以及如何通过网络实现。

本章将探索 gRPC 通信流的实现方式、所使用的编码技术以及 gRPC 中的底层网络通信技术的使用方法等,介绍涉及客户端调用给定 RPC 的消息流,并探讨其他相关问题,包括如何将其编排为网络上的 gRPC 调用、如何使用网络通信协议、如何在服务器端解排,以及如何调用对应的服务和远程函数等。

另外,本章将 protocol buffers 作为 gRPC 的编码技术,将 HTTP/2 作为 gRPC 的通信协议,并介绍它们的实现方法,最后研究 gRPC 实现架构以及围绕它所构建的语言支持栈。尽管对大多数 gRPC 应用程序来说,这里要讨论的底层细节作用有限,但在设计复杂的 gRPC 应用程序或设法调试现有的应用程序时,理解底层通信细节很有帮助。

第 章 gRPC:超越基础知识;这一章讲述 gRPC 的一些非常重要的高级特性,如拦截器、截止时间、元数据、多路复用、负载均衡等。

当构建真正的 gRPC 应用程序时,可能需要增强它们的各种能力以满足需求,比如拦截 RPC 的输入和输出、弹性处理网络延迟、处理错误、在服务和消费者之间共享元数据等。

本章将介绍一些关键的高级 gRPC 功能,包括使用 gRPC 拦截器在服务器端和客户端拦截 RPC、使用截止时间来指定等待 RPC 完成的时间、服务器端和客户端错误处理的最佳实践、使用多路复用在同一台服务器上运行多个服务、在应用程序间共享自定义的元数据、在调用其他服务的时候使用负载均衡和命名解析技术,以及压缩 RPC 调用以高效使用网络带宽。

第 章 安全的 gRPC;你将全面理解如何保护通信通道、如何认证以及如何控制用户对 gRPC 应用程序的访问。

基于 gRPC 的应用程序会通过网络彼此进行远程通信,这需要每个 gRPC 应用程序向其他需要与之通信的应用程序暴露其入口点。从安全的角度来看,这并不是一件好事。拥有的入口点越多,攻击面就越广,受到攻击的风险也就越高。因此,保护通信和保护入口点的安全对于任何真实的使用场景都至关重要。每个 gRPC 应用程序都必须能够处理加密的消息,加密所有节点间的通信,并对所有消息进行认证和签名等。

本章将介绍一组安全基础措施和模式,以应对我们在启用应用级安全性时所面临的挑战。简而言之,我们将探索如何保护微服务之间的通信通道,并对用户进行认证和访问控制。让我们从保护通信通道开始讨论吧。

第 章 在生产环境中运行 gRPC 你将了解 gRPC 应用程序的整个开发生命周期。我们将讨论测试;gRPC 应用程序、与 CI/CD 集成、在 Docker 和 Kubernetes 上部署与运行以及观察 gRPC 应用程序。

前面的章节涵盖了设计和开发 gRPC 应用程序的各个方面。现在该深入研究在生产环境中运行 gRPC 的细节了。本章将讨论如何为 gRPC 服务和客户端开发单元测试和集成测试,以及如何将它们与持续集成工具集成到一起。随后,将转向 gRPC 应用程序的持续部署,这里会探讨一些在虚拟机(VM)、Docker 和 Kubernetes 上的部署模式。最后,为了在生产环境中运行 gRPC 应用程序,需要有一个坚实的可观察性平台。在此方面,我们会讨论面向 gRPC 应用程序的多种可观察性工具,还会探讨 gRPC 应用程序的问题排查和调试技术。下面从测试这些应用程序开始进行讨论。

第 章 gRPC 的生态系统;在这一章中,我们将讨论围绕 gRPC 所构建的有用的支撑组件。在使用 gRPC 构建真正的应用程序时,这些项目中的大多数是有用的。

本章将讨论一些并非 gRPC 核心实现的项目,但它们对于构建和运行真正的 gRPC 应用程序非常有帮助。这些项目是 gRPC 生态系统父项目的一部分,对于运行 gRPC 应用程序来说,这里提到的技术都不是强制要求的。如果你的需求与这些项目提供的功能类似,请探索并评估这些技术。

我们首先讨论 gRPC 网关。

读者对象

本文最直接的读者是使用不同的进程间通信技术构建分布式应用程序和微服务的开发人员。在构建这样的应用程序和服务时,开发人员需要学习 gRPC 的基础知识,以及何时和如何将其用于服务间通信、在生产环境中运行 gRPC 服务的最佳实践。同时,对于采用微服务或云原生架构并设计服务间通信的架构师来说,也能从本文中受益匪浅,这是因为文中对比了 gRPC 和其他的技术,指出了何时应该使用它、何时应该避免使用它。

我们假定开发人员和架构师都对分布式计算的基础,如进程间通信技术、面向服务的架构(SOA)和微服务,有基本的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加热炉优化燃烧控制系统开发

首先给大家推荐本书:      认识 加热炉是是把坯料加热到均匀的、适合轧制的温度(奥氏体组织)。温度提高以后,首先是提高钢的塑性,降低变形抗力,使钢容易变形。 钢坯加热模型。如T12钢室温下变形抗力约为600Mpa,加热…

ide运行报错“Command line is too long”解决办法

有时运行程序时,ide会报如下错,如何解决呢,其实提示已经告诉你解决办法了。点击图中的蓝色超链接: “JAR MAINIFEST” 或 “CLASSPATH FILE” 都能解决问题 这是因为命名的方法名太长了才会报这个错 方法2 如果没有弹窗&#xf…

DisplayPort Alt Mode On Type-c协议_Ver2.0(学习笔记)

1.简介 USB-C设想支持使用Type-C连接器和电缆的Alt Mode,其中各种Type-C连接器引脚可以重新配置,以支持超出Type-C范围的接口。 Type-C(以及它所利用的USB PD)提供了一个Discovery Process,用于发现连接的USB设备中对…

【Yolo系列目标检测模型】详细整理!更新中

文章目录 1、YOLOv11.1、概述1.2、实现方案1)整体思路2)网络结构3)损失函数4)推理/预测过程5)优缺点 2、YOLOv22.1、概述/改进整体思路2.2、YOLOv2的改进点/tricks1)Multi-Scale Training2)High…

智安网络|常见的网络安全陷阱:你是否掉入了其中?

在数字化时代,网络安全成为了一个重要的议题。随着我们越来越多地在互联网上进行各种活动,诸如在线银行交易、社交媒体分享和在线购物等,我们的个人信息也更容易受到攻击和滥用。虽然有许多关于网络安全的指导和建议,但仍然有许多…

代码扫描平台SonarQube搭建保姆级教程

代码扫描工具SonarQube,想必大家也有了解,就是那种不明觉厉的存在,最近刚好有需求,需要自己搭建,下面就给大家记录下搭建的过程。 不了解的,可以先看看 https://github.com/SonarSource/sonarqube 有一个初…

【浩鲸科技】济南Java后端面经

本文目录 写在前面试题总览题目解析1.说一下SpringBoot中常用的注解2.Redis中的基本数据类型3.TCP的网络协议4.java中常见的锁5.Hashmap的底层数据结构、底层源码、扩容机制源码6.java面向对象的特点 写在前面 关于这个专栏: 本专栏记录一些互联网大厂、小厂的面试实…

短视频矩阵系统源码开发流程​

一、视频矩阵系统源码开发流程分为以下几个步骤: 四、技术开发说明: 产品原型PRD需求文档产品交互流程图部署方式说明完整源代码源码编译方式说明三方框架和SDK使用情况说明和代码位置平台操作文档程序架构文档 一、抖音SEO矩阵系统源码开发流程分为以…

什么是 MyBatis?

经过前几篇博客的学习 Spring 系列的基本操作已经实现的差不多了,接下来,我们来学习更重要的知识,将前端传递的数据存储起来,或者查询数据库里面的数据。 一、MyBatis 是什么? MyBatis 是一款优秀的持久层框架&…

Vue中$route和$router的区别

$router:用来操作路由,$route:用来获取路由信息 $router其实就是VueRouer的实例,对象包括了vue-router使用的实例方法,还有实例属性,我们可以理解为$router有一个设置的含义,比如设置当前的跳转…

二叉树的基本操作函数(先、中、后、层次遍历)

//链式二叉树数据结构 typedef struct Node { TElemType data;//数据域 struct Node* lchild, * rchild;//左右孩子 }Node, * Tree; #include <queue> #define TElemType int //方便 应用的时候 改//链式二叉树数据结构 typedef struct Node {TElemType data;//数据域s…

ceph集群---使用RBD块存储

文章目录 创建和删除池RBD设备的配置及使用RBD 块设备数据的导出和导入 块存储接口是一种主流的存储访问接口&#xff0c;也是常见的存储形态&#xff0c;比如服务器下的/dev/sdx都是块存储设备。你可以像使用磁盘一样来使用Ceph提供的块存储设备。 在创建块存储设备之前&#…

Python缔造超级马里奥世界,带你畅游冒险与创造的奇境!

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 马里奥大叔这次发现了一个很大的宝藏&#xff0c;这次他终于可以不当马里奥大叔&#xff01; 可以当一次有钱的富人喽&#xff0c;让我们一起来玩一玩吧&#xff01; 帮马里奥大叔闯关并收集到金币。只有所有的金币都收集完…

删除(取消)亚马逊的云服务器Amazon EC2的操作方法、教程

删除&#xff08;取消&#xff09;亚马逊的云服务器Amazon EC2的操作方法、教程 关于Amazon EC2服务器 1.亚马逊的服务器只能终止&#xff0c;不能删除&#xff0c;终止后卷&#xff08;存储、硬盘会自动关闭&#xff0c;如果没有快照不可恢复&#xff09; 2.终止的服务器会存…

简单工厂模式VS策略模式

简单工厂模式VS策略模式 今天复习设计模式&#xff0c;由于简单工厂模式和策略模式太像了&#xff0c;重新整理梳理一下 简单工厂模式MUL图&#xff1a; 策略模式UML图&#xff1a; 1、简单工厂模式中只管创建实例&#xff0c;具体怎么使用工厂实例由调用方决定&#xff0c…

TSINGSEE青犀视频监控管理平台EasyNVR如何配置鉴权?

视频监控汇聚平台EasyNVR是基于RTSP/Onvif协议的视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端的分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求&#xff0c;我们也提供了丰富的API接口供…

基于Java+SpringBoot+vue前后端分离古典舞在线交流平台设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DP83867IS SGMII eye diagram问题调试记录

1. 前言 使用的是带CPU的DP83867IS,通过SGMII接口 从PHY到CPU的眼图看起来很好 而从CPU到PHY的眼图很差 2. 问题梳理 (1)能证实SGMII道有100欧姆的阻抗吗? (2)能不能做一个误码率测试来看看眼图是否仍然是可以接受的? (3)因为从PHY到CPU的眼睛是好的,可能有一个…

【初中数学竞赛题】已知m,n为正整数,且m^2+n^2=2009,求m+n的值。

已知 m m m, n n n为正整数&#xff0c;且 m 2 n 2 2009 m^2n^22009 m2n22009,求 m n mn mn的值。 一、使用因式分解加枚举 ① 对2009进行短除 7 | 2009 ‾ 7 | 287 ‾ 41 7 \underbar{|\enspace\enspace2009\enspace} \\ \enspace\enspace 7 \underbar{|\enspace287\enspa…

android首页申请android.permission.READ_PHONE_STATE权限合规处理办法?

1、像闲鱼一样&#xff0c;申请的时候在顶部弹个解释说明对话框&#xff1f;