☰
Linkerd Admin UI 前端开发指南:RequireJS 模块体系、Jasmine/Karma 测试与 Handlebars 模板预编译
2026/10/13 1:59:26 网站建设 项目流程
  • 云原生
  • 网络
  • 微服务

【免费下载链接】linkerd

Old repo for Linkerd 1.x. See the linkerd2 repo for Linkerd 2.x.

项目地址:https://gitcode.com/gh_mirrors/li/linkerd
点击查看免费下载

导读

本文以 Linkerd 1.x 管理控制台(Admin UI)前端资源目录下的开发说明文档为主体,系统讲解该控制台前端的工程结构、模块加载方案、测试与代码检查工具链,以及模板预编译流程。读完本文,你将掌握如何在 Linkerd 仓库中搭建前端开发环境、运行 Jasmine/Karma 单元测试与 ESLint 检查、以监听模式自动重跑用例,以及新增页面模板并重新生成编译后模板文件的完整操作路径。

一、背景:Linkerd 管理控制台的前端资源位于何处

Linkerd 1.x 是围绕路由器(Router)构建的 Service Mesh 数据平面,其运行时会通过独立的 admin HTTP 服务对外提供监控面板。该面板的静态资源并不散落在各模块中,而是统一收拢在admin模块的 Java/Scala 资源目录下:

admin/src/main/resources/io/buoyant/admin/ ├── css/ # 样式与字体(bootstrap.min.css、dashboard.css 等) ├── js/ │ ├── lib/ # 第三方 vendor 库(jquery、lodash、require.js、smoothie 等) │ ├── src/ # 应用业务代码(admin.js、dashboard.js 等) │ ├── spec/ # Jasmine 测试与 fixtures │ └── template/ # Handlebars 模板与编译产物 ├── karma.conf.js # Karma 测试运行器配置 ├── package.json # 前端构建依赖与 npm scripts └── README.md # 前端开发说明(本文主体来源)

从服务端看,这些资源由 Admin.scala 中的Handler挂载到/admin/files/路径,通过ResourceHandler.fromDirectoryOrJar提供访问:开发模式下直接从本地目录admin/src/main/resources/io/buoyant/admin读取,打包后则从 jar 内资源读取;响应再经 StaticFilter.scala 按扩展名设置正确的Content-Type(css/js/html/json/png/svg 等)。因此,前端开发者只需在这个目录下工作,改动即可被本地服务直接拾取,无需重新打包。

二、JavaScript 工程约定:RequireJS 模块化与目录职责

按 README.md 的约定,整个前端采用 RequireJS 作为模块加载器,并明确了三个目录的职责划分:

  • 模块配置:位于/js/main-*.js。Linkerd 仓库中同时存在 js/main-linkerd.js 与js/main-namerd.js,分别对应 Linkerd 路由器面板与 Namerd 命名服务面板的入口;
  • 应用代码:位于/js/src,存放业务模块;
  • 第三方库:位于/js/lib,存放 vendor 代码(不参与业务修改)。

以 js/main-linkerd.js 为例,入口先通过require.config声明模块路径与 shim 依赖,将jQuery、lodash、handlebars.runtime、bootstrap、Smoothie等别名映射到lib/下的具体文件,并声明bootstrap依赖jQuery、导出$/_等全局符号。

随后入口按“穷人路由”(poor man's routing)方式根据window.location.pathname分发页面(js/main-linkerd.js):

路径后缀初始化逻辑
/(结尾为斜杠)加载adminPage.initialize()获取路由器配置,启动仪表盘dashboardInitializer
/delegator进入 DTab 委托树可视化页(linkerdDtabPlayground)
/namerd启动 Namerd 命名空间页
/logging启动日志级别配置页
/services以 service 视角启动服务仪表盘
其他仅执行通用初始化

其中 js/src/admin.js 承担两个关键职责:从 URL 查询参数router=<label>解析当前选中的路由器,并请求config.json获取全部路由器列表,动态渲染顶部下拉菜单。多路由器聚合视图通过特殊的all标签实现,用户可切换视角按单一路由器或全局查看监控数据。

三、测试基础设施:Jasmine 断言 + Karma 运行器

按 README.md 的说明,测试采用Jasmine编写、由Karma驱动执行。仓库中的实际依赖与配置与此完全对应:

  • package.json 中声明的 devDependencies 包括jasmine、karma、karma-jasmine、karma-cli、karma-requirejs、karma-phantomjs-launcher、karma-mocha-reporter、requirejs、eslint等,并内置两条 npm scripts:"test": "karma start --single-run"与"eslint": "eslint js";
  • karma.conf.js 使用jasmine+requirejs双框架,basePath指向./js,浏览器选用 PhantomJS,singleRun默认为true,监听端口 9876,reporter 采用 mocha 风格输出。

值得关注的是 Karma 与 RequireJS 的配合方式(karma.conf.js):配置中刻意不加载js/main-*.js应用入口,因为测试环境不希望真正启动整个应用;而是加载spec/test-main.js作为引导,并将spec/*.js、spec/fixtures/*.js、src/*.js、template/compiled_templates.js、lib/*.js声明为included: false的模块,由 RequireJS 按需异步拉取。

js/spec/test-main.js 则完成“测试模块发现”工作:扫描window.__karma__.files中所有匹配/(spec|test)\.js$/i的文件,将其归一化为 RequireJS 模块名,并复用与main-linkerd.js一致的路径/shims 配置,最后通过callback: window.__karma__.start启动 Jasmine。

仓库中的测试用例覆盖了核心监控模块,例如 js/spec/MetricsCollectorSpec.js 针对 js/src/metrics_collector.js 验证了三个行为:监听器注册后能在指标更新时收到增量(delta)与全量数据、反注册后不再收到通知。类似的 spec 文件还包括BarChartSpec.js、RouterClientsSpec.js、RouterServicesSpec.js、RouterSummarySpec.js、UtilsSpec.js等。

四、本地开发环境搭建

若要在本地运行测试或 ESLint,第一步是安装前端依赖。按 README.md 的指引,在仓库根目录下执行:

cd admin/src/main/resources/io/buoyant/admin npm install

该命令会依据package.json安装上述全部开发依赖(建议同时参考package-lock.json锁定版本)。npm install只需执行一次,后续命令均复用该依赖环境。

五、运行测试与代码检查

5.1 运行单元测试

cd admin/src/main/resources/io/buoyant/admin npm test # 等价于 karma start --single-run

npm test实际展开为karma start --single-run,Karma 会启动 PhantomJS 浏览器、加载 RequireJS 引导与全部 spec,执行完所有用例后自动退出并输出结果。singleRun: true意味着这是一次性 CI 友好执行,适合提交代码前快速验证。

5.2 运行 ESLint

cd admin/src/main/resources/io/buoyant/admin npm run eslint # 等价于 eslint js

ESLint 直接对js目录(含src、spec、lib等)进行静态检查。package.json中额外引入了eslint-plugin-jasmine(识别 Jasmine 全局 API)与eslint-plugin-requirejs(校验 AMD 模块写法),说明代码规范同时约束了测试代码与模块化写法。

5.3 开发时的自动重跑模式

README.md 特别推荐:在编写 JS 时,让测试在文件变更后自动重跑会显著提升迭代效率。命令为:

karma start --autoWatch=true --singleRun=false

autoWatch开启后,Karma 会监听basePath下的文件变更并自动重新执行测试;singleRun=false使进程保持常驻,直到手动终止(如Ctrl+C)。这与karma.conf.js中默认autoWatch: false、singleRun: true形成对照——默认值面向一次执行,命令行参数用于覆盖为监听模式。

六、Handlebars 模板预编译流程

README.md 指出,为了“轻微的速度提升”(a slight speed boost),前端将 Handlebars 模板预先编译为纯 JS,运行时不再解析模板源码。

模板的存放与编译规则如下:

  1. 新增模板:将模板文件放入js/template/目录。仓库中现存 20 余个.handlebars文件,例如router_summary.handlebars、router_client.handlebars、barchart.handlebars、process_info.handlebars、request_totals.handlebars、delegator.handlebars、logging_row.handlebars等,另有latencies.partial.handlebars、metric.partial.handlebars、rate_metric.partial.handlebars这类 partial 片段;
  2. 重新编译:执行
# npm install if needed handlebars -a js/template/ > js/template/compiled_templates.js

该命令将js/template/下所有模板与 partial 以 AMD 模块形式(-a表示输出为 RequireJS 可加载的 define 包装)合并写入 js/template/compiled_templates.js,供src下的业务模块通过define(['template/compiled_templates'], ...)引用。

应用侧的使用方式在源码中清晰可见,例如 js/src/process_info.js 直接取templates.process_info渲染进程信息栏,js/src/request_totals.js 使用templates.request_totals渲染请求统计,而 js/src/bar_chart.js 则用templates.barchart生成成功率横向条形图。这也解释了为何 karma.conf.js 必须把template/compiled_templates.js列为可加载模块——测试环境下同样依赖这份编译产物。

七、源码层面的纵深理解:面板数据从哪来

理解测试与模块约定后,有必要串起“前端如何取数”这条链路,便于开发者修改测试或新增面板时心中有数:

  1. 指标聚合:js/src/metrics_collector.js 以admin/metrics.json?tree=1为数据源,按固定间隔轮询(仪表盘中的UPDATE_INTERVAL为 1000ms,见 js/src/dashboard.js),对计数器计算相邻两次的delta增量,并检测新出现的 client 以触发addedClients事件;
  2. 仪表盘组装:js/src/dashboard.js 将收集器分发给ProcInfo(进程信息:版本、uptime、线程数、内存、GC)、RequestTotals(当前请求、Pending、进出连接数)以及 router 级别的服务/客户端仪表盘;
  3. 图形绘制:成功率时间序列图基于 SmoothieChart 的 canvas 实现(js/src/success_rate_graph.js),并以 100% 参考线、99.99~100.001 的默认 Y 轴范围保证纯成功曲线不贴顶;
  4. 格式化工具:js/src/utils.js 提供MsToStringConverter(毫秒转可读时长)、BytesToStringConverter(字节转 KB/MB/GB)、SuccessRate(成功率计算与sr-good/sr-poor/sr-bad分级着色)等通用工具,这些工具类也是UtilsSpec.js的主要测试对象。

这些模块均位于admin/src/main/resources/io/buoyant/admin/js/src/下,与测试js/spec/一一对应,是理解面板行为与扩展测试的最佳参照。

八、实践清单速览

任务命令(仓库根目录下)说明
安装前端依赖cd admin/src/main/resources/io/buoyant/admin && npm install一次性执行
跑一次单元测试cd admin/src/main/resources/io/buoyant/admin && npm test即karma start --single-run
静态检查 JScd admin/src/main/resources/io/buoyant/admin && npm run eslint即eslint js
监听模式自动重跑karma start --autoWatch=true --singleRun=false文件变更即重跑,常驻进程
新增模板后重新编译handlebars -a js/template/ > js/template/compiled_templates.js新模板须放入js/template/
本地查看面板启动 Linkerd 后访问 admin 服务(默认http://<host>:9990或 TLS 下的 https)静态资源由/admin/files/提供

以上流程完全基于当前仓库 admin/src/main/resources/io/buoyant/admin/README.md 及同目录下的package.json、karma.conf.js、js/main-linkerd.js、js/spec/test-main.js等真实文件整理,开发者在修改面板前端时可按此路径快速进入迭代循环。

  • 云原生
  • 网络
  • 微服务

【免费下载链接】linkerd

Old repo for Linkerd 1.x. See the linkerd2 repo for Linkerd 2.x.

项目地址:https://gitcode.com/gh_mirrors/li/linkerd
点击查看免费下载
上一篇:Apache Storm 非 JVM 语言支持指南:用 Multi-Lang 协议实现 Shell Spout / Bolt 与跨语言 DSL
下一篇:3分钟搞懂Coze Studio智能体知识库更新:增量索引与全量重建方案对比

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询