导读:hulk 是短视频研发部研发的基于 GDP2(Go Develop Platform)的 go 服务开发框架。它是⼀款⾯向业务的 Web 开发框架,提供了诸多开箱即⽤的组件和性能,能够⽤来疾速开发 Web 服务。同时,依靠于 hulk 框架并联合⼚内 / 业界优良的开发实际,初步构建了⼀个合乎业务应⽤场景的 go ⽣态体系。
全文 7330 字,预计浏览工夫 12 分钟。
===
一、产生背景
hulk 框架是在“难看视频”服务端的 go 服务化架构降级背景下产生的。
1.1 为什么要做架构降级?以后架构面临哪些问题?
难看视频初期因业务须要疾速、灵便的开发迭代,采⽤ PHP 作为开发语⾔实现后端服务,后期获得了⽐较好的开发迭代成果。但随着难看业务疾速倒退,服务端的项⽬ (接⼝、代码等) 急速收缩,类单体的 PHP 架构在多个⽅⾯遇到了瓶颈和问题,次要体现在以下⼏个⽅⾯:
1. 开发效率:对于主代码库,所有服务端同学都会在这同一个代码空间开发,此外还有依赖的第三方团队也会批改,频繁的批改 / 合并升高了开发效率,同时也加大了代码的保护老本和难度;
2. 上线效率:多用户开发同一代码库的另一个弊病就是上线期待,因为同一个时刻只能有一个分支上线(分级上线),导致相连的上线需要要排队期待。这也导致咱们的同学摸索出“搭车上线”的模式,尽管放慢了上线效率,但也加大了上线的危险,没有从根本上解决问题;
3. 运行效率:PHP 在开发效率和灵便度方面的确有肯定劣势,但当所撑持的业务达到几千万 DAU 及以上时,咱们必须要思考服务的运行效率和资源老本等问题。PHP 语言在多线程 / 多协程的反对上,弱于 Java、C/C++、Go 等语言,基于物理机部署的类单体服务部署架构,在资源利用率和服务扩缩容等方面也很难满足需要;
4.SRE 效率:在呈现稳定性问题时,咱们冀望可能做到疾速感知、疾速定位、疾速止损。目前基于 sia 的监控 / 报警,基于日志的问题定位形式间隔现实指标还有肯定的间隔:一是同学要奔走于各个平台 / 零碎获取问题线索,二是获取到的线索及信息维度很多时候也无奈满足疾速、精确定位问题的需要;
这些问题须要通过“4 化”,从总体业务架构、部署架构、基础设施等多方面去解决:
1.2 为什么不间接基于 GDP2?
难看的 go 服务化降级工作发展时,GDP2 还未正式公布,这也是其中一个因素。
1.3 hulk 与 gdp2 能⼒对照
下⾯从三个⽅⾯与 gdp2 做⼀个简略的对照,初步理解 hulk 的整体能⼒及与 gdp2 的⼀些差别。
1.3.1 web server 能⼒
hulk ⽬前次要服务于 web 应⽤,⾸先理解⼀下 hulk 的 web server 能⼒。
1.3.2 性能 / 组件
性能 / 组件的丰盛度及⾃身能⼒,很⼤水平上影响了框架对业务服务的⽀持能⼒。
1.3.3 框架周边及基础设施
框架从来不是“单打独⽃的”,它须要有周边⼯具和基础设施来⽀持。
NOTE:
1. 难看在做 go 化时,也调研了开源社区⾥⽐较优良的⼀些⼯具零碎和⽅案并引⼊,hulk 中默认增加了对这些基础设施的集成;
1.3.4 对照总结
本节次要站在 hulk 能力角度与 GDP2 做了一些方面的参考对照。以上对照,能够概括为 4 点:
1. 很多根底能⼒,hulk 是复⽤ gdp 的,如:bns、net、codec 等;
2. ⼀些通⽤ / 扩大组件,hulk 依照业务需要场景,进⾏⼆次封装和加强,如:httpserver、ral、redis、mysql 等;
3. 对于 gdp ⽬前没有⽀持的⼀些业务需要,进⾏开发集成,如:定时工作、配置中⼼、服务治理等;
4. 参考业界开源实际,引入了一些新的基础设施:如 prometheus+grafana 集群、sentry 集群、故障定位系统等;
GDP2 由几十个模块独特形成,因为工夫无限,可能个别性能点的对照有偏差。
===
二、理解 hulk
2.1 设计思路
2.2 框架结构
从性能上来看,hulk 的整体能力能够划分为四层:
2.2.1 根底组件
提供了绝大部分我的项目都应该须要的根底能力,也是其余下层性能组件很可能依赖的组件。hulk 框架通过这些根底组件,使下层利用能够无感的与基础设施进行集成:
- 日志组件:默认反对与 PHP 兼容的打印格局(用于配置 sia 监控和报警),同时也兼容 ftrace 接入的格局(日志查问和问题定位);
- 云原生监控:默认反对 prometheus,对所有接口申请、redis、ral 等近程调用进行多维度的 metrics 采集,并通过 grafana 展现;
- 配置核心:通过配置核心,能够实时下发并失效配置。目前反对 Apollo/iConf,反对性能包含 - 版本治理、热公布、灰度公布、权限治理、审核与审计等;
- 事件追踪 / 定位:借助 sentry,对于一些故障,咱们能够秒级感知。hulk 在异样信息中保留了比拟残缺的现场信息 - 如调用栈、request、集群和实例信息等,通过这些信息,能够间接定位问题的起因;
2.2.2 通用组件
这一层的组件能力是通用的,提供了一些管理控制和切面能力:
- ral 组件:hulk 的 ral 模块封装了 GDP2 的 ral 主体性能,同时,对 ral 进行了加强 - a) 提供了通过字符串而非文件来进行 ral 初始化和 ral 懒加载性能;b) 提供了多个 hook 能力,如 prometheus 的监控信息采集,熔断、降级等;
- 服务治理:框架的服务治理能力是基于 Sentinel(阿里开源的高可用流量防护组件)和配置核心来构建的,次要以流量为切入点,从限流、流量整形、熔断、降级等多个维度来帮助保障微服务的稳定性,并提供动态控制能力;
- 协程池:a) 能够主动调度海量协程,复用 goroutines,缩小 gc,b) 能够优雅解决 panic,避免程序解体 c) 提供了:工作提交、获取运行中的 goroutine 数量、封装了 WaitGroup 反对协程工作编排等性能;
- 事件告诉:框架与如流做了集成。用户将 robot token 配置在我的项目里,就能够间接应用 ruliu 组件向指定的如流群发送报警 / 通告。如流组件联合 sentry,能够让咱们第一工夫晓得程序出了问题并疾速定位到问题;
2.2.3 扩大组件
前两层性能对间接的业务解决逻辑参加较少,这一层的组件其能力多是为了解决某一类特定业务逻辑和场景,如 redis/mysql/ 定时工作等:
1.redis 组件:基于 GDP2 redis 模块的封装并作了性能增,提供了:
a) metrics hook,对所有的 redis 申请进行监控 (prometheus) 打点(latency/p99/qps/ 错误码散布等);
b) sentry hook,反对将 redis 谬误在记谬误日志同时发送到 sentry;
c) 降级 hook,反对按集群 / 实例 / 百分比维度降级 redis 拜访;
d) 熔断 hook,反对按集群 / 实例 / 错误率 / 慢申请率对依赖的服务进行熔断设置;
2.mysql 组件:mysql 组件是基于 GDP2 mysql 和 gorm\_adapter 的封装,在已有能力之上,进行了以下性能扩大:
a) 提供了 metrics hook,对所有的 mysql 申请进行监控 (prometheus) 打点(latency/p99/qps/ 错误码散布等);
b) 提供了 sentry hook,反对将 mysql 谬误在记谬误日志的同时发送到 sentry;
3. 分布式锁:hulk 提供了基于 redis 的分布式锁实现。其中 redis 连贯是基于 GDP2 的 redis 模块的革新,分布式锁性能是封装了开源我的项目 redsync;
4. 定时工作:反对两种定时工作模式;
a) 带分布式锁的运行形式:对于多实例部署的定时工作,如果工作不是幂等的,则须要应用分布式锁对工作的调度运行进行管制;
b) 不带分布式锁的运行形式:此模式下,如果部署了多实例,则所有实例上同一时刻的定时工作,会同时执行;
2.2.4 http server
hulk(目前只提供了 http server 能力)提供了很多通用且高效的 http middleware,并对外裸露了一些管理控制接口,在一些非凡状况下,能够通过这些治理接口,在运行时干涉服务的运行:
- logger\_middleware:用于记录 http 的申请、响应、耗时等信息,同时反对实时批改日志打印策略 - 如按 idc/ip/ 百分比 /uid/cuid 等维度打印;
- timer\_middleware:用于 http 申请的监控埋点,能够输入可用性、tp99、流量、平响、错误码等 metrics,维度包含服务级 /idc/instance 等;
- recover\_middleware:用于捕捉 http 申请链路中的 painc 事件,并可自定义 panic handler 逻辑,如通过联合 sentry 和如流,能够实时感知并定位 panic 事件;
- flow\_control\_middleware:接口限流组件,能够通过配置核心或治理接口,对接口按 idc/instance 维度进行限流;
- timeout\_middleware:通过该 middleware 或与配置核心联合应用,能够对接口按 idc 维度进行超时管制;
-
其余 middleware 能够查看 hulk 文档
(如 -internal\_user\_middleware、jager\_opentracing\_middleware、thirdparty\_auth\_middleware、b2logger\_middleware 等)
- 管理控制接口:如健康检查接口,服务治理 - 熔断、限流、降级接口,metrics 接口,线上实例性能调试接口等;
2.3 框架生态
通过近一年的建设,咱们初步构建了一个以 hulk 框架为核心的、合乎难看业务场景的 go 生态体系,包含:
- 规范目录标准:防止各个我的项目构造不对立,缩小我的项目保护难度和工作量;
- 代码生成器:基于 hulk 框架、规范目录标准、组件应用标准的代码生成器,目标是缩小通用模块 / 组件应用不标准,解决通用流程编码、解决不统一的问题;
- hklib:难看的通用 lib 库,提供了一些的通用性能(也蕴含了很多 PHP 转 go 过程中的一些 orp 通用 / 根底的函数 / 性能),也提供了 50+ 对中台服务的调用 client,缩小反复代码,晋升研发效率,晋升可维护性;
- 基础设施:prometheus+thanos 集群、sentry 服务、apollo 集群、pyroscope 性能剖析平台等;
- iconf:难看自研配置核心,能力在对齐开源的 Apollo 之外,还减少 / 加强了一些性能,如 -key 维度的公布、更平安的配置获取、更简洁的操作页面、类分级公布等;
- artemis:服务可视化与故障智能定位系统,能够在该零碎中看到服务的部署架构、服务外部调用链、多维度细粒度的近实时监控和要害日志。在产生可用性故障时,一些故障问题能够秒级的定位到起因和具体代码;
2.4 框架利用状况
目前短视频所有 go 服务都是基于 hulk 构建的,在资源、接口性能和可用性等方面都有一些阶段性产出和收益。
hulk 框架利用现状:
资源和性能收益:
资源和性能收益,很大一部分要归属于 PHP->Go 的技术栈切换;而框架为服务利用相应技术栈个性提供了便捷和高效的形式。
2.4 hulk 服务架构
下图形容了一个微服务(基于 hulk)的架构全景图:
- 框架中个各性能组件都是围绕业务各个场景和需要的,在业务逻辑中可能比拟便捷的应用相干性能组件;
- 这些组件在启用后,也会与相应的基础设施进行交互交融,独特撑持服务的高效、可控和稳固的运行;
hulk 组件初始化及与周边基础设施的集成,根本都能够通过环境变量 / 配置文件来实现。
===
三、框架能力与利用
上面咱们从日常开发遇到的一些痛点,来介绍框架的能力,并配以示例来阐明这些能力是如何缩小或解决痛点的。
3.1 如何晋升代码品质?
代码品质会间接或间接的产生以下影响:
- 代码品质会间接影响代码保护老本;
- 代码品质会影响程序出 bug 的概率;
- 代码品质会影响程序运行效率;
hulk 框架从以下三方面别离来晋升代码品质。
3.1.1 标准代码组织构造
升高我的项目保护老本,晋升研发效率。
- 通过规范目录标准 ,定义通用(http 服务) 的我的项目 layout,避免出现每人一种或多种 layout,最终我的项目构造“百花齐放”的景象;
- 通过代码生成器,帮忙开发者生成我的项目模板,对初始化流程,各目录 / 文件的应用进行潜在约定;
3.1.2 编码标准和动态查看
晋升代码可读性,缩小低级代码 bug
- 遵循百度 Go 编码标准 + 业务编码补充标准;
- 应用 GDP 的代码查看工具:go\_fmt、goc;
3.1.3 配套的压测和性能剖析平台
确定服务的压力边界,发现潜在的性能问题。
- 压测和性能测试平台(测试环境):nGrinder
- 程序性能剖析平台:pyroscope。能够通过 hulk 自集成的治理接口,实时关上或敞开线上实例的“continuous-prof”性能,定位线上性能问题:
3.2 如何晋升开发迭代速度?
- 如何让开发者专一于业务逻辑与实现?
- 如何让开发者疾速响应并实现产品需要?
hulk 框架为晋升迭代速度,提供了以下反对。
3.2.1 丰盛的实用组件 / 性能
晋升研发效率,防止试错,缩小出错。
- 程序加强组件:加强的 redis/mysql 性能,加强的 ral 调用等。例 - 下图中的 redis 监控,其监控指标是由 hulk redis 组件主动采集计算的:
- 优良的开源组件:sentry、prometheus+grafana、apollo、协程池等。例 -prometheus+grafana:hulk 框架默认反对 prometheus,能够对服务的可用性、QPS、耗时、错误码等 metrics 主动计算收集:
- 丰盛的 http middleware。
3.2.2 配置化、低代码反对
缩小代码的批改和上线,晋升需要的响应和实现速度。
- hulk 框架中大部分组件能够通过环境变量 / 配置文件来初始化;
- 业务逻辑中的可变数据与配置,能够通过 apollo/iconf 实时下发和失效,无需代码批改和长流程上线。例 - 能够通过开箱即用的配置核心性能,实时下发并失效配置:
3.3 如何疾速感知并定位问题?
- 开发者如何疾速感知服务中的问题,重大问题如何实时感知?
- 开发者如何能从监控、日志、报警中取得具体的问题信息,以疾速定位问题?
hulk 为晋升 SRE 效率,从以下几个方面提供反对。
3.3.1 欠缺的事件追踪定位与通告能力
可能实时追踪开发者自定义的谬误并通告
- 实时事件追踪组件:sentry。hulk 提供了开箱即用的 sentry 组件性能,能够像打印日志一样应用,sentry 中的信息蕴含代码调用栈、上下文、自定义要害信息等:
- 通告组件:ruliu。一行 token 配置就能够开启如流性能,能够将一些须要立刻关注的信息实时打到如流群里,同时还能够和 sentry 联合,实现异样问题实时感知和定位:
3.3.2 prometheus+sia 监控反对
通过 prometheus 与 noah 的互补,反对多维度全方位监控,可能取得更多的服务稳定性相干信息
- prometheus 为开发者提供灵便的多维度的业务监控信息;
- sia 能够为开发者提供基于日志的采集的服务稳固指标和容器、网络等资源维度监控信息;
3.3.3 ftrace 日志查问与剖析性能
hulk 默认反对 ftrace 平台的日志格局
- 通过 ftrace,能够便捷高效的查问用户维度的日志信息;
- 通过 pdo2 命令,能够检索查问自定义规定的日志信息;
3.4 基于 hulk 的服务可视化和故障智能定位系统
artemis 是咱们基于 hulk 研发的一款服务可视化与故障智能定位追踪零碎,它集服务部署架构可视化、近实时多维度监控、要害日志、服务调用链等多方面信息,能够疾速、高效、精准的发现和定位稳定性问题。
该零碎目前已接入难看 / 全民 / 度咔等多个后端服务,极大减速了故障定位效率。在一些故障场景,能够秒级定位问题,给出问题的代码行。
3.4.1 服务部署架构
通过实例列表,能够获取服务的 idc 列表、instance 列表和详情,并提供了便捷高效的调试入口和登录指令:
3.4.2 近实时多维度监控
artemis 提供的近实时监控,可能提供更多维度信息,这些维度是 sia 和 prometheus 无奈提供的,如:
- 某个 URI 上面的某个上游(或上游实例)RAL 的 QPS、耗时、可用性;
- 某个服务实例实例的 URI 或 RAL 的监控信息;
3.4.3 要害日志
因为与 hulk 的深度集成,在业务代码中打印 warning 级别以上的日志时,artemis 能拿到更多的日志信息,如 - 各维度信息、调用栈、上下文等:
3.4.4 服务调用链
在 hulk 框架的帮助下,artemis 还能够获取到 URI 及 URI 所依赖的 RAL 调用信息,由此能够构建出申请调用链,并实时展现调用链上的相干 metrics 信息:
不同色彩的链路代表不同的可用性:红色 - 1 个 9 及以下,黄色 - 2 个 9,蓝色 - 3 个 9,灰色 - 4 个 9。通过服务调用链,能够十分直观的看到服务里,哪个接口有问题,还能够看到哪些上游影响了这个接口的可用性。
3.4.5 应用案例
通过与报警零碎的联动,能够在产生报警的第一工夫,在 artemis 零碎中找到受影响的服务及 URI,确定是否是上游引起,谬误是什么,哪一行代码报了错等,以下是一个 artemis 的理论利用示例。
===
四、总结
===========
hulk 尽管是⼀个新的 go 语⾔ web 框架,但不是反复造轮,⽽是站在⼚内和开源软件的根底上,联合业务理论开发、部 署、运⾏、运维环境,对这些开源框架和⼯具进⾏取⻓补短、⼆次开发,最终切合实际的业务使⽤场景。同时,围绕 hulk 初步构建起的 go 生态,为服务在开发、部署、运行、运维等各个阶段都提供了无力反对。
最初,心愿短视频研发部在 go 服务化架构降级 / 研发框架上的⼀些实际、⽅案和教训,可能给有雷同架构降级需要、在 go 项⽬实际中遇到问题的其余业务线同学⼀些帮忙和参考。
招聘信息:
短视频研发部,负责难看视频、全民小视频以及多款翻新 APP 的孵化研发工作。是公司级策略产品,承当百度系产品矩阵短视频内容供应工作,重点反对百度搜寻和信息流视频化,肩负百度内容生态视频化转型使命。仅用两年的工夫就实现用户规模从零到亿级增长,日活数千万。领有百亿级流量,亿级数据量,丰盛离奇和全面的产品玩法,多类型的技术零碎和当先的技术架构。
欢送退出短视频研发部,社招,实习,校招都要哦
简历投递邮箱:geektalk@baidu.com(投递备注【短视频】)
举荐浏览:
|千亿级模型在离线一致性保障计划详解
|如何疾速定位程序 Core?
|百度 BaikalDB 在同程艺龙的胜利利用实际分析
———- END ———-
百度 Geek 说
百度官网技术公众号上线啦!
技术干货 · 行业资讯 · 线上沙龙 · 行业大会
招聘信息 · 内推信息 · 技术书籍 · 百度周边
欢送各位同学关注