- 云原生
- 网络
- 微服务
【免费下载链接】linkerd
Old repo for Linkerd 1.x. See the linkerd2 repo for Linkerd 2.x.
导读
本文以 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-runnpm 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 jsESLint 直接对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=falseautoWatch开启后,Karma 会监听basePath下的文件变更并自动重新执行测试;singleRun=false使进程保持常驻,直到手动终止(如Ctrl+C)。这与karma.conf.js中默认autoWatch: false、singleRun: true形成对照——默认值面向一次执行,命令行参数用于覆盖为监听模式。
六、Handlebars 模板预编译流程
README.md 指出,为了“轻微的速度提升”(a slight speed boost),前端将 Handlebars 模板预先编译为纯 JS,运行时不再解析模板源码。
模板的存放与编译规则如下:
- 新增模板:将模板文件放入
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 片段; - 重新编译:执行
# 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列为可加载模块——测试环境下同样依赖这份编译产物。
七、源码层面的纵深理解:面板数据从哪来
理解测试与模块约定后,有必要串起“前端如何取数”这条链路,便于开发者修改测试或新增面板时心中有数:
- 指标聚合:js/src/metrics_collector.js 以
admin/metrics.json?tree=1为数据源,按固定间隔轮询(仪表盘中的UPDATE_INTERVAL为 1000ms,见 js/src/dashboard.js),对计数器计算相邻两次的delta增量,并检测新出现的 client 以触发addedClients事件; - 仪表盘组装:js/src/dashboard.js 将收集器分发给
ProcInfo(进程信息:版本、uptime、线程数、内存、GC)、RequestTotals(当前请求、Pending、进出连接数)以及 router 级别的服务/客户端仪表盘; - 图形绘制:成功率时间序列图基于 SmoothieChart 的 canvas 实现(js/src/success_rate_graph.js),并以 100% 参考线、99.99~100.001 的默认 Y 轴范围保证纯成功曲线不贴顶;
- 格式化工具: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 |
| 静态检查 JS | cd 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.
相关推荐
Streama前端单元测试:Jasmine与Karma配置指南
Streama前端单元测试:Jasmine与Karma配置指南 Streama作为一款自托管流媒体服务器(Self hosted streaming media
后端音视频视频requirejs模块化测试框架集成:Jasmine与Mocha实战
requirejs模块化测试框架集成:Jasmine与Mocha实战 你是否在RequireJS项目中遇到过模块化测试的困境?当代码拆分为数十个AMD模块后,传
前端MEAN.JS前端测试框架:Karma与Jasmine完整使用指南
MEAN.JS前端测试框架:Karma与Jasmine完整使用指南 MEAN.JS是一个基于MongoDB、Express、AngularJS和Node.js的
后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考