写在前面

上一篇文章中,我们讲解了网飞当前的架构,但网飞的架构并不是一开始就是这样的,而是不断演进发展才是当前的样子。
在这里插入图片描述
这篇文章我们就来讲讲网飞架构的演进过程。

第一阶段:Zuul Gateway + REST API

  • 使用 Zuul 作为API网关,单一前门
  • 设备调用网关,网关扇出到多个微服务
    Netfile 第一版架构

而在这个架构下,会遇到一些问题:

  • 不同设备有不同的数据需求,Web端、App端、TV端所需要的数据结构不一样
  • 单一REST API无法满足所有设备,导致api变多且难以维护,要么获取过多数据,要么需要多次调用
  • 设备特定的优化需求难以进行

第二阶段:BFF(Backend For Frontend)模式

为了处理不同设备的差异化数据需求和减少网络调用,网飞采用了Backend For Frontend (BFF)模式。每个前端都有专属的后端。

  • UI开发者编写和维护 Groovy脚本定制化获取数据。
  • Groovy 脚本部署在API服务器上,通过 Java 调用gRPC/REST服务,并使用 RxJava 和容错库 Hystrix 处理扇出中的线程管理和容错问题

Groovy 是 ‌后端导向的语言‌,主要服务于 JVM 平台的后端逻辑、自动化脚本和构建工具链

在这里插入图片描述
然而,这种 BFF 模式存在局限性:

  1. 需要维护大量的脚本,每个终端一个脚本,维护复杂。
  2. 反应式编程本身学习曲线陡峭且复杂
  3. UI 开发者不喜欢用 Groovy/Java/RxJava

第三阶段:GraphQL Federation + Java Version 21

  • 采用DGS微服务:基于 GraphQL 的 SprintBoot 服务
  • API 网关处理GraphQL

GraphQL Federation 取代了 BFF,因为客户端可以通过 GraphQL 精确选择所需的字段,解决了 REST API 过度或不足获取数据的问题,使得一个 API 可以服务于不同的 UI。这意味着 UI 工程师不再需要进行服务器端开发来获取自己所需要的数据。

在这里插入图片描述

Java 版本升级

从 Java 8 迁移到 Java 17 后,得益于G1垃圾收集器的改进,CPU 使用率降低约 20%,这是一个非常恐怖的优化,会省下非常多的云资源。这些jdk的升级其实很难做,需要兼顾每一个第三方包。是一项很繁琐的工作。

举个视频中的例子,网飞处理Spring Boot 3升级中的Jakarta EE 命名空间的变化,Spring Boot 3 是基于JDK 17,并且从javax切换到了jakarta.ee。对于应用程序而言,这只是简单的查找并替换。
在这里插入图片描述

但对于依赖 javax 并且已经编译成JAR包的老旧库来说,而这些老旧库已经找不到源代码了但还在使用,运行时仍然会尝试寻找 javax.servlet.Filter。但此时,环境提供的却是 jakarta.servlet.Filter。由于包名和类名不匹配,即使功能相同,JVM也无法找到对应的类,从而导致运行时错误。

针对这种二进制不兼容性的情况,Netflix利用 Gradle transforms 来解决。通过 Gradle插件工具,在依赖包下载时的 artifact resolution time 进行字节码重写相当于二进制的查找并替换,将所有javax 替换为 jakarta。

在这里插入图片描述
由于这些API在功能上没有变化,只是命名空间改变,所以这种重写是安全的。而这个工具已作为Netflix Nebula生态系统的一部分开源。
在这里插入图片描述

此外网飞目前正测试和推广 Java 21+,Java 21+ 的 ZGC 垃圾收集器(低暂停时间)和虚拟线程(Virtual Threads)特性都非常优秀。 虚拟线程结合结构化并发很有可能完全取代反应式编程(如 RxJava),简化并发代码的开发和调试。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ros2服务实现人脸检测2-人脸检测功能实现(适合0基础小白)

文章目录 一、用到的库二、使用步骤1.引入库2.获取图片真实路径3.检测人脸4.绘制人脸5.显示结果6.更改setup.py7.完整代码 三、结果展示 一、用到的库 face_recognition:实现在图片中检测人脸。 cv2:显示图片,并且可以在图像中展示检测结果。…

中国农村统计年鉴-Excel版(1985-2024年)

《中国农村统计年鉴》系统收录了全国和各省农村社会经济统计数据,以及近年全国农村主要统计数据,是一部全面反映我国农村社会经济情况的资料性年刊。年鉴内容覆盖农村人口结构、农业产值、主要农产品产量、市场物价、进出口贸易以及收入消费水平等社会经…

golang pprof性能调试工具

简介 pprof是性能调试工具,可以生成类似火焰图、堆栈图,内存分析图等。 整个分析的过程分为两步:1. 导出数据,2. 分析数据。

PPIO × 302.AI:三分钟搭建可共享的聊天机器人

最近,各主流模型厂商频频发布新模型,有一如既往强大的DeepSeek-R1-0528,擅长长输入推理的MiniMax-M1-80k…… 好用的AI大模型这么多,如何才能集成在一个应用自由使用呢?302.AI作为企业级AI应用平台支持各主流模型调用&…

怎么样在自己的网站/独立站中添加视频?

文章目录 **前言** 一、视频在网站/独立站的好处二、视频嵌入网站的原理三、如何简易地把视频嵌入到独立站中? 前言 在信息传播形式日益多元化的当下,静态文字与图片早已无法满足用户对沉浸式浏览体验的需求。视频以其动态画面、声音及文字相结合的特性…

【图像处理基石】什么是摄影的数码味?

“数码味”是一个摄影术语,通常指照片看起来不自然,有过度处理的痕迹,比如色彩过于鲜艳、对比度偏高、高光过曝、阴影死黑,或者有明显的锐化痕迹和噪点。这种现象在手机摄影中尤为常见,因为手机相机的自动算法往往会为…

报表控件stimulsoft教程:在报表、仪表板和 PDF 表单自动生成缩略图

了解缩略图的工作原理在使用Stimulsoft Demo、Stimulsoft Server和Stimulsoft Cloud时非常有用。例如,您可以在此处查看缩略图的实际效果 - 当侧边栏折叠时,将显示缩略图而不是资源列表。在本文中,我们将探讨 Stimulsoft 产品中报表、仪表板和…

变分自编码器(VAE)

1. 从自编码器(AE)到变分自编码器(VAE) 自编码器(AutoEncoder, AE) 基本结构: 自编码器是一种无监督学习模型,通常由两个部分组成: 编码器(Encoder)&…

ChatboxAI 搭载 GPT 与 DeepSeek,引领科研与知识库管理变革

文章摘要:本文深入探讨 ChatboxAI 在科研领域的应用优势。ChatboxAI 集成多模型,支持全平台,能高效管理科研知识,助力文献检索、实验设计与论文撰写,提升科研效率与质量,同时保障数据安全。其知识库功能可整…

【无刷电机FOC进阶基础准备】【04 clark变换、park变换、等幅值变换】

目录 clark变换park变换等幅值变换 其实我不太记得住什么是clark变换、park变换,我每次要用到这个名词的时候都会上网查一下,因为这就是两个名词而已,但是我能记住的是他们背后的含义。 经过【从零开始实现stm32无刷电机FOC】系列后应该对cla…

Sentinel的流控策略

在 Sentinel 中,流控策略(Flow Control Strategy)用于定义如何处理请求的流量,并决定在流量达到某个阈值时采取的行动。流控策略是实现系统稳定性和高可用性的核心机制,尤其在高并发环境中,确保服务不会因过…

Ubuntu Extension Manager 插件卸载

Ubuntu 上使用Extension Manager 安装插件,但目前无法在Extension Manager 中卸载。 卸载方式可以通过 gnome-extensions 命令进行卸载: Usage:gnome-extensions COMMAND [ARGS…]Commands:help Print helpversion Print versionenable Enabl…

深度学习中Embedding原理讲解

我们用最直白的方式来理解深度学习中 Embedding(嵌入) 的概念。 核心思想一句话: Embedding 就是把一些复杂、离散的东西(比如文字、类别、ID)转换成计算机更容易理解和计算的“数字密码”,这些“数字密码…

(3)Java+Playwright自动化测试-启动浏览器

1.简介 前边两章文章已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动两大浏览器。 接下来我们在Windows系统中启动浏览器即可,其他平台系统的浏览器类似的启动方法,照猫画虎就可以了。 但是在实践过程中&am…

使用OpenWebUI与DeepSeek交互

Open WebUI 是针对 LLM 用户友好的 WebUI,支持的 LLM 运行程序包括阿里百炼、 Ollama、OpenAI 兼容的 API。这里主要讲在Docker环境下安装与本地Ollame和百炼API Key配置 一、安装Docker 1. CentOS # 设置为阿里云的源 sudo yum install -y yum-utils sudo yum-config-mana…

Github 2025-06-25 C开源项目日报 Top9

根据Github Trendings的统计,今日(2025-06-25统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目9C++项目1raylib: 用于视频游戏编程的简单易用图形库 创建周期:3821 天开发语言:C协议类型:zlib LicenseStar数量:18556 个Fork数量:1…

【数据标注师】2D标注

目录 一、 **2D标注知识体系框架**二、 **五阶能力培养体系**▶ **阶段1:基础规则内化(1-2周)**▶ **阶段2:复杂场景处理技能**▶ **阶段3:专业工具 mastery**▶ **阶段4:领域深度专精▶ **阶段5&#xff1…

深入浅出Node.js后端开发

让我们来理解Node.js的核心——事件循环和异步编程模型。在Node.js中,所有的I/O操作都是非阻塞的,这意味着当一个请求开始等待I/O操作完成时(如读取文件或数据库操作),Node.js不会阻塞后续操作,而是继续执行…

C++11的内容

1.支持花括号初始化 void test1() {vector<string> v1 { "asd","asd","add" };vector<string> v2{ "asd","asd","add" };map<string, int> m1{ {"asd",1},{"asd",2},{&q…

AI代码助手实践指南

概述与发展趋势 核心理念 发展方向&#xff1a;从代码补全 → 代码生成 → 整个工程服务价值转换&#xff1a;从单纯写代码 → 需求驱动的代码生成功能扩展&#xff1a;超越编写层面&#xff0c;涵盖测试环境搭建等 核心价值点 低价值动作识别&#xff1a;debug、代码评审、…