微服务架构革新:百度Jarvis2.0与云原生技术的力量

news2024/12/29 10:23:01

作者 | 商业广告平台团队

导读

从十几个模块到上千个微服务,百度如何构建业界最复杂的微服务系统?Jarvis平台,十年磨一剑,集服务治理、配置管理、链路追踪于一体,打造云原生控制中心。Jarvis2.0,多运行时架构的先驱,实现微服务治理的全新突破。节省耗时、提升效率,Jarvis2.0在60+产品线中部署4w+实例,节省人力与资源。技术爱好者,点击深入了解,一探究竟!

全文6160字,预计阅读时间16分钟。

01 业务背景介绍

随着云计算和微服务架构的飞速发展,百度Jarvis2.0的诞生标志着一个新时代的到来。作为业界领先的广告技术平台,百度商业产品矩阵通过效果广告和展示广告两大类,以及基木鱼、观星盘等营销工具,为广告主提供了一个强大的营销生态系统。这些工具不仅帮助客户精准传达营销诉求,更是在广告检索系统中架起了一座桥梁,实现营销目标的高效达成。

在广告存量竞争日趋激烈的今天,百度的商业产品不断演进,以小步快跑的方式,加速新功能的孵化与上线。这种快速迭代的需求,推动了商业平台采用统一的微服务架构,微服务模型采用“应用粒度”描述(类似Dubbo3.0 / SpringCloud / ServiceMesh)。遵循“高内聚低耦合”的设计原则,从最初的十几个模块扩展到1K+微服务,构建了一个庞大而复杂的服务网络。经过十多年的演变,商业平台的微服务架构成为了业界最复杂的微服务系统之一

图片

图片

商业平台系统复杂度的主要驱动力来自业务产品的演化和组织的演化,其理论依据就是康威定律。

然而,随着微服务数量的激增,如何保证系统的高效运行和稳定性成为了一个巨大挑战。为此,百度基础技术团队研发了Jarvis——一个面向复杂业务系统的应用托管平台。Jarvis不仅提供了分布式服务框架和统一配置管理,还包括了分布式链路跟踪、容量规划、高可用性及数据化运营等微服务治理能力。作为内部开发平台,Jarvis致力于简化业务研发人员的操作流程,降低他们对基础设施的认知负担,使他们能够更加专注于创新和业务发展。

按照“平台工程”社区主要贡献者和Humanitec的产品负责人Luca Galante的说法,平台工程是一门设计和构建工具链与工作流的学科。这些工具链和工作流可以为云原生时代的软件工程组织提供自助服务功能。Jarvis 平台就是平台工程的一种经典实践。

Jarvis2.0的推出,更是将百度的微服务治理推向了新的高度,整合了微服务治理生态,定义了一套适合百度商业Web技术栈的治理方案,为云原生技术的发展注入了新的力量。

02 云原生进阶的目标

Jarvis平台提供贯穿微服务生命周期(开发、测试、部署、运维)的自助服务工具,通过屏蔽基础技术栈的复杂性,高效支持业务发展。十年微服务治理经验沉淀,我们形成了完整的治理生态,蕴含在10+ 治理组件(JVMTI 探针、Launcher、蜂鸟、流量录制、日志采集、应用诊断等)和10+ Starter(ConfigStarter、StarlightStarter、JdbcStarter、AcutatorStarter、RedisStarter 等)。

图片

△商业平台治理生态发展史

尽管现有的组件在解决特定问题上有所成就,但它们往往缺乏统一的标准和语言无关的实现,导致控制能力分散,使用体验不连贯,效率提升空间巨大。当 Kubernetes统一了容器编排管理系统之后,这些纯技术性的底层问题,便开始有了被广泛认可和采纳的基础设施层面的解决方案。Kubernetes容器编排效率和容器虚拟化方面的卓越表现,也能让发布效率问题得到更优雅的解决。因此我们在探索一种全新的架构,旨在整合云原生的先进技术与现有的治理组件,以提升治理效率,让业务团队能够快速享受到云原生带来的红利。

这一架构升级的目标是双重的:

  1. 业务尽可能不改动原有代码的前提下完成上云;

  2. 进一步提升治理效率,解决当前问题:

  • 应用全版本发布慢

    • 平均耗时30分钟+,95分位值100分钟+,核心服务上线45-60分钟。

    • 容器隔离性差,经常出现资源被其他业务容器抢占(特别是磁盘IO)导致的线上问题。

  • 发布态治理操作慢

    • 线上切流只能走配置上线,止损慢。

    • 调优单个指参数(修改数据库连接池参数、日志级别等)耗时长(30min+/次)。

    • 全链路灰度只能通过增加机器来物理隔离,效率低、资源浪费大。

  • 监控迭代效率低、业务自定义难

    • 监控探针升级频繁,数万个Pod线上推全需1-2月。

    • Argus 3.0易用性差、高阶功能缺失且已不再迭代。

在公司全栈上云的背景下,2023年Jarvis团队协同EKS、智能监控、ENS以及iRegistry团队,实现了Jarvis应用的Kubernetes部署,通过定义一套开放式的微服务控制面标准协议,打造云原生控制中心,实现了微服务治理组件的统一管理和调度,提升了平台的运维发布治理效率。

  • 弹性容器服务(Elastic Kubernetes Service,简称EKS)是公司云原生化的平台载体,通过 Kubernates、OpenKruise 等新架构提供云原生基础设施。

  • 智能监控平台(Intelligent Monitoring)是针对云原生场景构建的新一代Prometheus+Grafana监控服务。

  • 弹性名字服务(ElasticNamingService,简称ENS),云原生时代的名字服务,与EKS天然融合。

  • 镜像仓库(iRegistry),分布式全托管的镜像制品管理服务。

图片

△Jarvis2.0产品功能图

03 商业平台多运行时落地实践

商业平台研发部的云原生微服务托管平台Jarvis2.0整合微服务治理生态,从控制面和数据面、部署面三个角度,定义了一套适合当前百度商业 Web技术栈的微服务治理方案。

我们首次引入了多运行时架构,所谓的多运行时(Multi-Runtime)架构,其实是借鉴了 Service Mesh的思路,不同之处在于Service Mesh引入了Sidecar 模式重点解决服务间通讯需求,但是Multi-Runtime架构则提出将各种各样的分布式能力全部外移到独立Runtime,最后和应用Runtime共同组成微服务,形成所谓的“Multi-Runtime” (多运行时)架构。

Jarvis2.0通过定义一套开放式的微服务控制面标准协议,实现数据面的统一管理和调度。数据面,则展现出生态的多元化,例如多语言的Proxyless、跨语言的Envoy代理、JVMTI agent等技术各施所长。一套CRD治理标准协议,下发多套治理数据面,从而将原来分散、割裂的基础组件通过合理的架构组装在一起,来满足多元化的微服务场景。

图片

包括以下3个核心部分:

  • 运行时Moonlight(数据面):运用Multi-runtime的架构设计,Sidecar边车部署。以统一标准、易扩展、非侵入方式整合Starlight、环境变量、诊断、Launcher、探针、安全、Debug等10+组件,实现启动管理、监控、诊断、动态调优、安全管控等治理能力。

  • 部署面:结合镜像分层自动构建、OpenKruise Cloneset原地升级、KubeVela OAM引擎应用编排能力,支持业务应用原地升级、多集群一体化部署编排和灰度发布;结合OpenKruise Sidecarset的组件管理能力,实现Moonlight等 Sidecar的自动注入、原地升级和灰度发布。

  • 控制面Gravity:遵循云原生Service Mesh动态通信控制协议xDS,提供统一的控制面标准协议,实现请求内容路由、流量权重路由、路由标识全链路传递、路由控制秒级生效的动态路由和参数调优、诊断、集群日志检索的指令下发。

3.1 运行时 Moonlight(数据面)

图片

△运行时 Moonlight架构图

图片

△运行时动态治理

Moonlight伴生方式部署在每个应用容器上,因此对启动时间和内存消耗极其苛刻。我们最终采用了GraalVM Native Image技术,使用SpringBoot Native编译Moonlight,使Moonlight完全脱离了JDK运行,5秒内启动,仅占用128M 内存。

包含以下核心通路:

  • 探针植入通路:支持探针动态植入、卸载、热升级。Native化后,标准的 JVMTI能力和反射难以使用,需要非常特殊的适配,属于业界首创。

  • 动态治理通路:以xDS Client为中心监听治理信息,面向应用进程提供统一治理信息获取通路。关键能力如下:

    • 流量染色:扩展探针无侵入Tracing能力,跨进程、跨线程传递流量标识,全链路染色。

    • 限流熔断:利用探针实现织入式限流、熔断。

    • 参数调优:支持日志级别、数据库连接池调优,并能快速扩展其他调优能力。

    • 配置热升级:结合Kubernetes部署机制和 Java动态代理特性,秒级更新配置。

    • 应用诊断:以旁路方式,按需诊断应用。集成大量的开源可插拔工具,JVM监控命令(Jstack、Jinfo、Jstat、JMAPHISTO等)Arthas、性能火焰图、系统环境工具(lsof、env等)。

  • 静态治理通路:基于Launcher组件,实现 Jar 包自动替换,随业务重启生效。

  • 监控报警通路:涵盖Metrics、Tracing、Log等数据类型,满足异构语言和场景的监控数据汇总分析与异常报警需求。

    • Metrics通路为微服务提供开箱既用报表和报警,支持分平台配置和算法推荐阈值。

    • Tracing通路日处理70+亿条调用数据(峰值流量40w/min),支持在百亿条数据中10s 内检索出单个请求路径。

3.2 部署面

部署面承担了业务应用和Moonlight Sidecar的高效部署工作,能够支持超大规模集群的一体化管理、灰度升级和原地发布、组件自动注入。

部署面比较复杂,这里大致介绍下其中两项关键技术。

  • 镜像自动化分层构建

基于Jib实现SpringBoot应用 / 静态网页应用 / Node应用 / Go应用,自动构建 Docker镜像,避免RD同学编写维护Docker file,开箱即用。Jarvis平台用户开发完代码后,直接通过iPipe发布版本自动构建Docker镜像,并自动推送到 iRegistry仓库。另外,对fat-jar进行分层构建Docker镜像,能够大幅减少镜像拉取耗时,相比在Opera平台的全量拉取,耗时缩短75%。(业务代码升级一般仅classes 层发送变动,上线是仅需要拉取classes层即可,classes层一般10K左右,1s内即可拉取完成。)

图片

△fat-jar解压文件目录

图片

△jarvis应用镜像分层方案

  • 多集群一体化灰度发布

基于阿里巴巴和微软共同开源的云原生应用规范模型OAM,对应用模型进行了抽象,借助K8S+OpenKruise CloneSet\Rollout +KubeVela OAM完成集群的多集群一体化管理、灰度发布和原地升级。

Jarvis用户仅需要设置平台暴露的业务参数(应用版本、配置版本、实例数、资源套餐、外网权限、AFS 等),然后 Jarvis借助OAM模型描述 出应用信息、部署目标集群、上线工作流步骤。一键发起app上线时,Kubevela会根据App OAM模型的定义,按照工作流步骤,自动将App部署到目标K8s 集群。(差异化集中配置,工作流分发配置到集群)

图片

△部署面架构图

图片

△部署关注点分离

3.3 控制面 Gravity

Gravity集注册中心、配置中心和控制面于一体。与Istio非常类似,控制平面和Moonlight Sidecar的交互均采用业界流行的xDS协议。它能实现低延迟、高时效、自动保活的注册发现能力,同时支持10w+容器的无损上下线、请求内容路由、流量权重路由、路由标识全链路传递、路由控制秒级生效,比zk注册同步,更快更稳更强。

值得一提的是,xDS原生数据模型对非服务通讯控制的定义比较薄弱。我们复用xDS相关内容并实现了一套易用丰富完备的控制协议,实现各标准组件执行行为的动态可调控,支持限流、熔断、日志级别、超时、参数调优、应用诊断等控制命令。

图片

△Gravity+Starlight框架

图片

△xDS协议扩展出控制能力

  • 无损上下线:Gravity与BaikalDB深度定制,对业务进行分组轮询缓存,内部统一事件通知总线,定向长轮询通知机制,确保秒级服务发现。

  • 异常节点自动剔除:(client发起剔除)starlight自动统计调用质量,动态剔除有问题的远程节点;(server主动剔除)一旦服务自身状态健康检查持续有问题,自动停止心跳等待异常恢复;(控制面主动剔除)Gravity全局统计僵尸节点,自动清理掉。

  • 灰度发布:借助探针,跨进程、跨线程传递Trace信息时携带定制的路由标识;Starlight RPC框架识别路由标识接住xDS通信协议全流程自动调整流量行为。

  • 无侵入动态治理:Gravity扩展出MDS\DDS协议覆盖控制需求(比如业务字段限流和熔断、日志检索命令等),管控Moonlight操纵多运行时自动治理,借助探针运行时织入熔断限流或者修改框架参数,实现业务无感治理。

04 项目收益

Jarvis2.0覆盖了商业平台、闪投、CRM、品牌广告、手机百度、文心一言、小度云平台、健康商城等60+产品线的3K+个Web后端服务,部署了4w+实例(200w+CPU核)。上线节省耗时2.14PD/天;核心治理功能使用2K次,节省人力30PD+/天。

上云收益显著,主要体现在上云效率、治理效率和稳定性、扩展性四个方面:

  • 接近零成本上云

Springboot应用 \ 静态网页应用 \ Node应用等自动生成Docker 镜像,无需代码改造;开箱即用Promethus+Grafana云原生监控(200+监控报表、9+基础报警)。

  • 部署治理效率数倍提升

  • 稳定性显著提升

线上推全治理组件(数万个 Pod) 从1-2月降到1天;线上切流从3-5pd+降低到3-5s。异常点摘除从30分钟+降低到3-5s。依靠灰度,XSTP线下环境全新搭建从40分钟降到20分钟,节省人力1.6PD/天。熔断限流只需界面操作,无需代码改动或者上线重启。单个指标调优(数据库连接池、日志级别)从120分钟+降到3-5s。

  • 覆盖多语言 Web 无状态应用

不再局限Java语言,统一对Web无状态应用(SpringBoot应用 / 静态网页应用 / Node应用 / Go应用)提供一揽子的微服务治理全家桶,支持业务低成本的使用内容路由、可观测性、流量染色、熔断限流等治理能力。

——————END——————

推荐阅读

技术路线速通!用飞桨让京剧人物照片动起来

无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力

Tensor 索引的使用指南及学习心得

百度智能云将大模型引入网络故障定位的智能运维实践

彻底解决网络哈希冲突,百度百舸的高性能网络 HPN 落地实践

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

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

相关文章

大型分布式B2B2C多用户商城7.0企业版源码分享【java语言、方便二次开发】

项目介绍 项目基于SpringBoot开发,运营端和商户端采用ElementVue,买家使用采用VueIviewnuxt服务端渲染。使用到的中间件有Redis、RabbitMQ、ElasticSearch、FastDFS、Mongodb等。主要功能包括有运营管理、商品管理、订单管理、售后管理、会员管理、财务…

【PyQt5】一文向您详细介绍 QRadioButton() 的作用

【PyQt5】一文向您详细介绍 QRadioButton() 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕&am…

windows下安装gcc和make

目录 引言 第一种:自定义安装 下载和安装MinGw 将bin目录添加进环境变量 拷贝mingw-get.exe改名为make.exe 查看gcc和make命令是否安装成功 测试make和makefile 第二种:免安装,解压可用 下载mingw64 配置环境变量 拷贝mingw-get.e…

链码简介及MATLAB提取彩色图像链码

一、链码 链码(又称为freeman code)是一种通过带有给定方向的单位长度的线段序列来描述轮廓边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。在二维图像中,链码可以表示为一系列的方向码,每个…

基于遗传算法的BP神经网络+代码解析

嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。 基于遗传算法的BP神经网络代码解析 自己在2024年年初开始时,因为某些原因,了解到了基于遗传算法的神经网络。之前,对遗传算法并…

韦东山瑞士军刀项目自学之复习OS中断相关知识

和STM32无关,单纯是为了秋招复习一下中断的流程,其中涉及到内核态与用户态之间的转换,以及系统调用等等

开源免费软件一键瘦身你的Windows系统-Win11Debloat

开源免费软件一键瘦身你的Windows系统-Win11Debloat 前言 随着 Windows 11 的发布,许多用户发现系统中预装了大量的应用和功能,这些应用和功能可能会影响系统的性能和用户体验。为了帮助用户优化他们的 Windows 11 系统,可以使用一个名为 W…

VBA代码解决方案第十六讲:如何引用工作表(引用工作表的方式)

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

Mybatis的写增删改查的方法

一、Mybatis环境配置: 环境的配置我在前面的文章里有详细写https://blog.csdn.net/daibadetianshi/article/details/140698718?spm1001.2014.3001.5501https://blog.csdn.net/daibadetianshi/article/details/140698718?spm1001.2014.3001.5501 二、方法之用注解…

探索有赞小程序:揭秘其强大的组件库功能!

有赞小程序组件库是针对有赞小程序开发者提供的一套组件,它提供了丰富的功能和样式,方便开发者快速搭建和定制各种有赞小程序页面。下面将从四个方面对有赞小程序组件库的功能做详细的阐述。 1、UI组件 可实时在线编辑的设计工具——即时设计https://a…

【C++】C++11之右值引用

目录 一、前言 二、概念 2.1 左值和左值引用 2.2 右值和右值引用 三、左值引用与右值引用的区别 四、应用场景 4.1 左值引用的短板(将亡值) 4.2 右值引用的意义(移动语义) 五、右值引用引用左值 六、万能引用和完美转发…

从零开始手写STL库:HashTable

从零开始手写STL库–HashTable的实现 Gihub链接:miniSTL 文章目录 从零开始手写STL库–HashTable的实现HashTable是什么HashTable需要包含什么函数基础成员部分基础函数部分可用函数部分 其他函数总结 HashTable是什么 HashTable在STL中直接出现的情况并不多&…

宝塔部署springboot vue ruoyi前后端分离项目,分离lib、resources

1、“文件”中创建好相关项目目录,并将项目相关文件传到对应目录 例如:项目名称/ #项目总目录 api/ #存放jar项目的Java项目文件 manage/ #vue管理后端界面 …

计网面试题

OSI七层模型 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP四层模型 应用层,传输层,网络层,网络层接口 HTTP(超文本传输协议)…

C语言典型例题20

《C程序设计教程(第四版)——谭浩强》 例题2.8 有两个整形变量a和b,将他们两个的值进行互换 代码: //《C程序设计教程(第四版)——谭浩强》 //例题2.8 有两个整形变量a和b,将他们两个的值进行…

【通俗理解】牛顿第三定律与生命反应——超越物自在主义的探讨

【通俗理解】牛顿第三定律与生命反应——超越物自在主义的探讨 牛顿第三定律与生命的类比 你可以把牛顿第三定律比作一个“即时回应器”,它表明作用力和反作用力总是同时、同量且反向发生。而生命则像是一个“策略玩家”,它不仅回应,还能操纵…

flutter存储日志文件代码

如题所示,我需要将flutter运行得到的相关日志信息存储成文件,可以按时间或者文件大小,将日志文件拆分存储成多个日志文件。在项目中我已实现这个功能,因为觉得有用,所以单独简化出来放在一个demo中。 这里给出我整理出…

掌握分布式系统的38个核心概念

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…

day11 Stream流、File、方法递归、字符集、IO流(巨多API)

目录 1.Stream流 1.1认识Stream流 1.2Stream流处理数据的步骤 1.3获取Stream流 1.3.1获取集合的Stream流 1.3.2获取数组的Stream流 1.4Stream提供的常用方法 1.5终结、收集Stream流 1.5.1终结方法 1.5.2收集方法 2.可变参数 2.1可变参数是什么 2.2可变参数的特点和…