干货 | 提前在开发阶段暴露代码问题,携程Alchemy代码质量平台

SqlAlchemy使用教程(一) 原理与环境搭建 本文介绍了sqlalchemy 的原理,架构,什么是ORM, 常用术语如metadata, session 等,SqlAlchemy主要版本及特性,最后讲述了如何搭建编程环境。 阅读详情

作者简介

Lyan,携程资深后端开发工程师,负责自动化测试框架及平台类工具开发,关注Devops、研发效能领域。

一、背景

随着敏捷开发,DevOps开发模式的流行,代码质量分析作为研发质量保证体系的重要组成部分,不仅能有效的降低因频繁迭代带来的故障风险,而且对整个工程团队的效能提升有着巨大的价值。

携程很久以前就已经开始进行DevOps的建设,通过Gitlab CI/CD在开发提交代码触发的流水线pipeline中引入静态扫描、单元测试、集成测试等流程,在开发过程中打造了一套闭环的代码质量保障体系。其中,在静态代码分析阶段引入了SonarQube,并且通过对原有SonarQube代码规范库中的规范进行筛选和扩展,形成了自己的代码规范库。但是在实际应用过程中,我们发现仍然有一些问题需要优化解决:

  • 在开发过程中,代码规范只能通过开发人员自我约束,缺少统一的平台对各应用代码的潜在风险问题统一进行分析,且问题难以定位到开发人员进行治理。

  • 代码单元测试通过率和代码覆盖率都很高,但仍然存在一些在单元测试阶段应被发现的问题未暴露出来,导致上线后出现bug,单元测试用例的质量缺乏有效性及可靠性保证。

  • 随着项目的发展,开发人员为了避免影响已有功能,在开发过程中大量复制粘贴,导致出现很多难以维护的重复代码,且程序逻辑结构过于复杂,修改逻辑牵一发而动全身,可维护性差。

  • 代码中充斥着大量的sql拼接,以及一些不规范的写法导致潜在的问题,需要对此类代码进行治理。

二、平台介绍

Alchemy平台是一个代码质量分析平台,提供Infer分析、代码分析、自定义扫描、代码搜索等功能,其中代码质量分析内容包含代码行,sonar问题, infer问题,UT规则,重复代码以及圈复杂度等。用户可以根据自己的需求在平台上进行扫描项配置,并查看应用的代码质量分析结果。

为了及时获得对提交代码变更的质量反馈,作为DevOps中重要的一环,Alchemy平台与Gitlab CI/CD相结合,将静态代码分析提前至开发提交或合并代码阶段。开发人员提交代码至Gitlab,触发流水线相关任务执行,任务执行完成之后可以对某些指标(如增量代码引入的空指针)设置红线进行卡点,如果指标在指定范围内,允许合并代码并发布,如果指标超过了红线设置范围,则不允许合并代码,开发人员修复问题后再次提交代码进行流水线的集成发布。扫描分析结果可以在Gitlab或者Alchemy平台上展示,帮助开发人员在快速迭代的同时保证代码质量。

05e661f773c9fd0ddafa278f2f9b7ea6.png

静态代码扫描流程

三、系统架构

Alchemy平台包含Alchemy-client、Alchemy-service和Alchemy-web。其中,Alchemy-client为扫描脚本,包含Infer分析,UT扫描,重复代码扫描、自定义扫描等功能,集成到Docker镜像中,Alchemy-service提供数据存储、分析等后台服务,且依赖代码搜索服务CodeSearch-Service实现代码搜索功能,Alchemy-web负责页面交互。

开发人员提交代码,触发Gitlab CI/CD中静态代码分析job在GitRunner中执行,执行时先从Docker仓库下载镜像,启动容器后执行Alchemy-client脚本,脚本会根据平台配置来执行相应的扫描任务,扫描完成后,将结果上传至Alchemy-service,存储到mongodb数据库,最终在前端页面展示分析结果。

fe8c02ae7838b6afb6a0a4b46edd9eaf.png

Alchemy架构图

四、功能

4.1 Infer分析

Infer是Facebook出品的一个静态分析工具,可以分析Java、Objective-c或者C代码,报告潜在的问题,包括空指针,资源泄漏等。Alchemy平台将Infer引入代码静态分析阶段,目前已支持全量和增量分析两种模式。

全量模式需分析应用仓库中的所有代码,能分析出所有代码引入的潜在问题,对于代码量较大的应用,由于需要分析所有代码文件,扫描时间比较长,在一定程度上影响开发发布进度,且对未修改的代码进行了非必要的重复分析,在代码修改量较少的情况下造成资源浪费。因此,我们尝试加入缓存机制,并引入了增量分析模式,增量模式需要获取本次提交修改的文件,在分析阶段只针对这些改动文件进行分析,能大大节省分析时间。Infer分析流程如下:

9f61e239b2c82927e81f6ee95889d2f3.png

Infer分析流程图

在分析过程中,首先判断是否为第一次分析,如果没有分析历史记录,则系统默认采用全量模式,否则需判断Infer扫描配置,若配置为全量模式,则分析此代码工程的全部文件,若配置为增量模式,需获取此次提交修改的文件列表,编译过程完成之后,在分析阶段指定文件列表进行分析。获取到分析出的问题列表后,判断问题所在的行是否为修改行,如果是,则记录为本次修改导致的新增问题,否则为历史遗留的全量问题。

在实际应用中,针对封装的判空方法,通过添加@TrueOnNull或@FalseOnNull注解,可识别对象的判空操作。但对于第三方包的判空方法,如CollectionUtils.isEmpty(), 由于未添加注解,即使添加判空方法,仍会被误识别为空引用。因此,Alchemy平台加入了忽略操作,针对此类问题进行二次确认,避免重复误判。

4ff9db380a2d24d3f6109faed79e5036.png

Infer误判结果

4.2 UT规则扫描

单元测试是DevOps流程中一个非常重要的环节,我们可以利用通过率和代码覆盖率等指标来衡量单元测试用例的完整程度,却很难保证用例的有效性。阿里巴巴java开发手册规定,单元测试不允许使用System.out来进行人肉验证,必须使用断言assert来验证。

在实际的开发过程中,开发人员把主要的时间用在写业务逻辑代码上,在编写单元测试用例时,往往容易忽略对结果的验证,虽然通过率和代码覆盖率很高,但上线后仍然出现未对接口结果进行验证而导致严重问题的情况。无效的单元测试用例包含以下几种:

  • 空函数:函数体为空;

  • 空断言:用例中实现了对被测接口的调用逻辑,但未对接口返回结果进行验证;

  • 伪断言:用例中使用类似assertTrue(True)的假断言。

通过扫描空断言、空函数、伪断言等问题,能判断该用例是否对代码逻辑进行必要的验证。Alchemy平台支持单元测试用例的有效性验证,目前,平台支持Java、Kotlin、Groovy和Nodejs,同时也支持全量和增量2种扫描结果,全量结果即为所有测试用例中不满足规则的用例,增量结果为本次提交修改的测试用例中不满足规则的用例。

7cb7287342d2cc99ddc9b864524603d4.png

UT扫描流程

对单个单元测试文件的扫描流程如图。首先根据文件后缀判断语言类型,然后根据不同语言类型规则获取该文件中的用例信息,包含case名称、起止行、作者、最近修改时间、函数内容等,针对函数内容,先判断用例是否有断言,如果有,则判断是否为伪断言,如果未断言或者被判为伪断言,还需进一步根据用例的起止行,结合本次提交的改动信息,分析该用例是否为增量改动的用例,如果是则标记为增量问题,最后将结果推送给gitlab,在合并代码或发布时根据红线配置进行卡点。扫描结果如图所示。

28ac947d6c240b67706b9f21c8e7ba49.png

UT扫描结果

4.3 重复代码扫描

重复代码即为重复或近似的代码,在开发过程中,开发人员为了避免影响现有功能,使用复制粘贴快速完成开发任务,导致出现大量的重复代码。重复代码不仅让代码量大增,造成编译速度慢,而且占用大量存储空间,如果想要修改其中一段代码逻辑,则需要同时修改多个地方,容易遗漏,可维护性差。

当前市面上有很多代码检测工具,如Simian,PMD-CPD,CloneDR等,由于在实现算法上有所不同,不同工具所能检测的重复代码类型也不尽相同。我们利用PMD-CPD扫描代码仓库,可以检测出单文件或多个文件中除了空格、注释、换行以及变量名以外内容完全一致的代码段信息,这些信息包含文件路径、代码段内容、起止行以及作者信息,详情结果如图所示。

9f11ac5aaed1da1217ea78f001212ece.png

重复代码详情结果

4.4 自定义规则扫描

Alchemy支持对自定义规则的扫描,通过配置自定义正则表达式和扫描范围,识别代码文件中满足配置规则的代码段,可用于扫描代码中的拼接SQL,敏感词等,并且可将不合规的代码定位到相关开发人员。

423ffcad0e82a4fffc1331896895a104.png

自定义扫描流程

单个文件扫描流程如图,首先判断文件是否在扫描范围内,若不在则直接跳转扫描下一个文件,否则读取文件内容,同时根据文件类型获取对应的自定义规则,匹配满足规则的代码段信息,包含代码段内容、严重程度、起止行、作者等。在某些场景下,需要设置子规则进行二次匹配,比如扫描update未指定where条件的sql语句,可先根据规则找到update语句,然后根据子规则判断是否带where条件,最终记录二次匹配的结果。

4.5 代码分析

使用不同工具统计的代码质量指标可能分散在不同的平台,对这些指标进行全面分析的过程中难免会有所遗漏,特别是对于未设置发布卡点的指标,开发人员可能并不会关注它们,导致代码存在大量的潜在问题未被分析治理。

Alchemy代码分析模块可以对代码不同维度的指标进行统计分析,包括代码行、单元测试、infer问题、Sonar问题、重复代码、圈复杂度等。用户可以在代码分析页面查看各维度问题分布情况,从而对项目的整体风险指标进行更全面的分析,可以根据问题的严重程度设置优先级进行针对性的治理。

69621104c9626200cc4f3b25d3ee8843.png

代码分析结果

4.6 代码搜索

在开发过程中,对于一些公共操作如中间件的使用方式,开发人员可能需要四处寻找接入文档。Alchemy提供代码搜索功能,可以帮助开发人员根据关键词来查找收录项目中的代码使用示例,用户可以根据项目仓库、代码语言以及作者等条件进行细分查询。在编码过程中,命名规范是一个容易被忽视的问题,使用Alchemy的变量命名功能,用户可以根据不同语言,搜索中英文关键词来获取推荐的规范命名参考,能极大地提高开发效率。

4f0c6bcee691e0c65b4eb24e666a9bc1.png

代码搜索结果

五、结束语

在本文中,我们介绍了Alchemy平台提供的代码静态分析,代码探索以及通过与Gitlab CI/CD集成带来的持续集成能力,可以在开发阶段暴露出更多的代码潜在问题和风险,并及时反馈给相关人员。目前携程酒店已接入项目800+,且在开发提交代码和发布阶段将分析的潜在问题接入了卡点流程。在后续的工作中,我们将从以下几个方向进行进一步的优化:

  • 在代码分析层面支持更多语言;

  • 开发IDE插件,在编码阶段实时扫描代码;

  • 继续深挖代码风险指标,并引入评估机制。

【推荐阅读】

9275bee74ee06367c87b069cbae721d4.jpeg

 “携程技术”公众号

  分享,交流,成长

SQLAlchemy基础教程 Python DB-API DB-API 操作数据库流程 Connection 对象 Cursor 对象 DB-API 操作 PostgreSQL 启动 PostgreSQL 创建数据库 test 使用 Python 交互 PostgreSQL 什么是 ORM Python 的 ORM 框架 SQLAlchemy 架构 一个简单实例 SQLAlchemy 使用 连接数据库 描述表结构... 阅读详情

相关推荐

【SpringBoot香樟转转】debugDay01

在学黑马程序员的苍穹外卖项目,刚开始学,想用maven编译一下代码,结果报错,找不到符号。本着先理解原则,看着能找到这个变量呀。

m0_72696598的博客 1737

alchemy php,js中sqlalchemy的实例详解

sqlalchemy的返回类型有大都有两种,一种是Model对象,一种是Query集合(只查询部分字段)。针对这两种返回结果,都是来自同一中类型 sqlalchemy.orm.query.Query所以针对Query做相应处理,让他返回一个dictclass AlchemyJsonEncoder(json.JSONEncoder):def default(self, obj):# 判断是否是Qu...

weixin_30423205的博客 194

遥感图像融合实战:5分钟搞懂全色与多光谱图像如何提升分辨率(附Python代码)

本文通过实战案例,详细解析了如何利用全色锐化技术融合全色与多光谱遥感图像,以提升图像分辨率。文章深入浅出地介绍了核心概念、环境配置、经典GS融合算法的Python代码实现,并对比了不同算法的优劣,最后提供了效果评估方法与实战陷阱分析,帮助读者快速掌握遥感图像融合的关键技术。

weixin_29041195的博客 394

whenwords未来路线图:即将到来的本地化与高级功能预览

whenwords作为一款轻量级的相对时间格式化库,目前已实现基础的英文时间转换功能。根据项目规划,未来版本将重点围绕本地化支持与功能扩展两大方向进行升级,为开发者提供更全面的时间处理解决方案。 ## 🌍 多语言本地化支持:打破语言壁垒 当前v0.1版本仅支持英文输出([SPEC.md](https://link.gitcode.com/i/80b793f62ced9e9f8dea9d460

gitblog_00085的博客 414

Win10系统安装Ubuntu虚拟机,这回真的是零基础!(结尾附NS3的配置)

Win10系统安装Ubuntu虚拟机(结尾附NS3的配置) 序幕 本人现在还在念大二,有一门很有趣而且老师讲得也不错的课程《计算机网络原理》。这周老师布置了一个实验《NS3网络模拟》,为了详细记录本次实验过程,顺便也便于自己复习,就写了这篇博客,希望能够对你有帮助! NS3是什么呢?实际上就是一门算法,和计算机网络有关的。不过在我们日常使用的Windows系统上去做这个实验是行不通的,这个实验一定要在Linux系统上进行模拟才能玩的下去,作为一名 Windows选手对此表示不爽但是没办法,为了实验也只

灼热之翼的博客 7382

Cadence——原理图相关教程

包含创建文件,原理图,元器件,规则检查,PDF与BOM清单输出,各类PCB网表

haonanyayaya的博客 1万+

革新编程体验:Alchemy - 源代码智能增强工具

革新编程体验:Alchemy - 源代码智能增强工具 alchemy给flink开发的web系统。支持页面上定义udf,进行sql和jar任务的提交;支持source、sink、job的管理;可以管理openshift上的flink集群项目地址:https://gitcode.com/gh_mirrors/alchem/alchemy 在软件开发的世界中,提高效率和减少错误是永恒的主题。今天,我...

gitblog_00039的博客 333

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

sqlalchemy在pythonweb中开发的使用(基于tornado的基础上)

一、关于SQLAlchemy的安装 pip install SQLAlchemy安装 如果上面的方式安装不成功的情况可以使用下面的方法 百度下载window或者linux下面对应的sqlalchemy的版本下载地址 解压下载的压缩包 进去该目录下使用python setup.py install 测试安装是否成功 二、开发基本的配置(以tornado开发为参考) 1、新建一个包取名为models

水痕 2664

金融科技风险管理实践之监管评级全解

内部审计是公司治理的四大基石之一。因此,建议银行以问题与结果为导向,推动科技风险分级分类管理,重点防范重大中断、重大事件,并进一步加强科技风险评估与监测,加强对重要管理流程、重要系统、网络等重点管控环节的评估监测,对于评估发现的问题,及时完善管理手段,举一反三解决问题,提高风险管理的有效性。投入更多审计资源,加大对重点机构、薄弱环节、重要领域的审计力度,如:加强对境外机构的审计,加强网络安全、数据安全、业务连续性等高风险领域审计,加强数字化转型过程中的风险审计,以高水平安全,为数字金融高质量发展保驾护航。

银行信息系统应用架构详解 450

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

关于Alchemy的使用-备忘

今天无意间发现了一篇文章说到了使用Alchemy来让flash的as代码调用C代码的功能接口的方法,目的是为了能在flash环境下使用C的东西,另外一个角度来说可以更好的发挥C语言的强大能力和效率了; 我学习Alchemy是被客户逼的,客户的AIR项目中涉及到大量的数值计算,以至于用AS3写出来后没法运行:长时间不响应。后来将这段计算量大的代码用VB写了,用swf调exe才算结束。但设置有些不便,客户吹毛求疵。不得不寻找新的解决方法。感谢QQ群里的一些达人,我开始关注并了解 Alchemy,最后解决了这个棘

txiejun的专栏 2210

WPF高级 | WPF 与数据库交互:连接、查询与数据更新

WPF高级 | WPF 与数据库交互:连接、查询与数据更新,在现代应用程序开发中,数据的存储和管理至关重要。Windows Presentation Foundation(WPF)作为一款强大的图形界面开发框架,常常需要与数据库进行交互,以实现数据的持久化存储、读取和更新。本文将深入探讨 WPF 与数据库交互的各个方面,包括数据库连接的建立、数据查询的执行以及数据更新的操作,并通过丰富的代码示例和详细的概念解释,帮助读者掌握这一关键技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

SQLALchemy框架(一)

SQLALchemy的介绍 SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 SQLAlchemy对象关系映射器提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联。它包括一个透明地同步对象及其相关行之间状态的所有变化的系统,称为 工作单元 ,以及根据用户定义的类及其定义的彼此之间的关系表达数据库查询的系统。 可以让我们使用类和对象的方式操作数据库,从而从繁琐的 sql 语句中解脱出来。 ORM 就是 Object Re

冰点契约的博客 421

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SQLAlchemy框架用法详解

介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DBAPI之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 1 pip3 install sqlalchemy 什么是ORM? ORM就是运用面向对象的知识,将数据库中...

weixin_30909575的博客 200

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SQLAlchemy框架详解

概述:SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果 1. 快速使用 (1)创建模型类生成数据表 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String Bas.

weixin_42289273的博客 1415

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

flask ORM之SQLAlchemy基本架构实战

环境: python:3.6+ python框架:flask orm框架:SQLAlchemy 功能描述: 1.实现对象关系映射,每次初始化时,动态更新表结构 2.实现中英文表数据插入 3.实现查询数据并返回json格式 ORM概述: 1.ORM,对象关系映射,即Object Relational Mapping的简称 ...

u011089760的博客 1722

vue项目中代码暴露问题

vue项目中代码的暴露问题 由于vue使用的不够熟练,所以在使用的过程中还是存在好多细小的问题,近日碰到的会做个整理,给自己备用 我这里是在使用apicloud的过程中,直接通过script来引入vue包,所碰到的问题,如果是前后分离可能有更好的方式 html页面代码 诸如此类的mustache语法的方式来展示变量内容,会出现代码暴露的情况 也就是说在页面还没有完成渲染的时候,{{}}会直接暴露...

baidu_41604826的博客 1235

1f12可以查看最终的静态html页面,和JavaScript源代码 ,那自己写js源码不就泄露了吗 2由JavaScript代码暴露,重新认识”前端“和”后端“

1f12可以查看最终的静态html页面,而JavaScript就是运行在最终静态html页面上的,那么自己写的JavaScript方法不就泄露了吗? 答案:是的。 2因此,有些时候,自己在写程序时,某些功能不知道通过JavaScript怎么实现,怎么办? 与其去问百度,不如找一个具有这样功能的网站,通过f12查看他JavaScript源代码,copy过来就OK。  

Ideality_hunter的专栏 5028

源代码泄露

一般代码大规模泄露的原因有三种:一个是内部员工泄密,一个是网络入侵窃密,另外一个因为泄露的是共享源代码计划中的代码,不排除是参与该计划的组织失密造成的。

mark90_cheng的博客 6288

源代码泄漏

摘自:https://lddp.github.io/2018/05/10/WEB-%E6%BA%90%E7%A0%81%E6%B3%84%E6%BC%8F/ 0x1 .git源码泄露 当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了 比如某个网站存在.git文件泄露,可以: http://www.baidu.com/.git 利用方式: github上的githack

daqiangdetianxia的博客 2287

提早暴露问题,做好层与层之间的责任划分

最近处理一个关于短信的问题,debug过程中有遇到一些障碍和弯路。问题是手机应该收到一条语音信箱的短信,但是一直没有收到。Modem已经上报了短信的PDU,但是framework解析之后进行dispatch失败了。对PDU的decode和dispatch都是Google AOSP的,第一感觉应该是framework应该没有问题,应该是PDU的格式不符合spec造成的,使用工具解析PDU后并没有发现...

diangangqin的博客 506

Alchemy初识1

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33786077的博客 162

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 42

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 225

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 330
上一篇: 干货 | Islands Architecture(孤岛架构)在携程新版首页的实践
下一篇: 干货 | 浅谈携程大住宿研发效能提升实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值