AI网关

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 6.1 网关的演进历程 是什么在推动软件架构的演进呢?业务规模。业务从互联网、移动互联网以及即将到来的万物互联,其规模仍然在高速增长,也就意味着软件架构的复杂度也会越来越高,网关的特性也会越来越多。越来越复杂、越来越智能。 6.1.1 流量网关 代表软件是Nginx,将客户请求分配到不同的服务器上,从而实现流量负债均衡,避免单点故障,确保服务的稳定性和连续性。 6.1.2 ESB网关 ESB,企业服务总线,通过集中管理消息路由、转换和安全,实现服务的快速部署和高效运作。 6.1.3 微服务网关 微服务网关可以实现负载均衡、限流、熔断、降级、身份验证等功能,通过统一入口管理和优化各微服务间的交互。Spring Cloud Gateway是一个广泛应用的微服务网关。 6.1.4 云原生网关 云原生网关是伴随K8S的广泛应用而诞生的一种创新网关。既能有流量网关的特性来处理海量请求,又具备微服务网关的特性来做服务发现与服务治理,同时要求网关也具备弹性扩缩容能力解决容量调度问题。 6.1.5 AI网关 之前的几种类型网关处理的流量基本是以HTTP、RPC为主,多采用长连接,长连接采用request-response模式。AI采用的协议以SSE/Websocket为主,虽然也是长连接,但跟request-response模式相比,Server可以主动发送数据给Client,Websocket更是一种全双工协议,主要在语音类的实时通讯场景中使用。 AI场景对网关有新诉求,比如:多模型代理、智能路由、模型增强、安全防护、流式传输、无损变更等。 Higress网关已经在阿里云内部大规模生产落地,可以访问项目地址了解:https://higress.ai/ 6.1.6 API网关 从流量网关,再到AI网关,都是API网关在不同软件架构下的网关形态。HTTP/gRPC/Dubbo/Websocket都可以称之为API,MCP、A2A也可以称之为API。 6.2 AI网关的定义、特点与应用场景 AI网关是提供多模型流量调度,MCP和Agent管理,智能路由和AI治理的下一代网关。AI网关不仅完整继承了API网关的通用能力,如安全认证、路由转发、流量控制等,也演进出了大模型Fallback、大模型负载均衡、Token级别的精细化流量管控、语义化缓存、内容安全、联网搜索、MCP协议转化和管理、工具精选和搜索效果优化等面向AI场景的能力。 6.2.1 AI应用的流量特征 高延时 大带宽与流式传输 长连接 API驱动 6.2.2 AI网关的应用场景 1、模型服务提供商(MaaS)的接入层 2、AI应用的开发网关 3、企业内部的中央AI网关 4、MCP工具生态的统一入口 5、构建企业AI能力货币化的统一开放平台 6.3 AI网关的核心能力和最佳实践 6.3.1 核心能力 1、多模型代理 2、多模型回退/容灾 3、消费者认证 4、内容安全防护 5、Token限流 6、语义缓存 7、可观测性 8、MCP代理 9、工具的动态组装 10、工具的智能路由 6.3.2 最佳实践 AI网关的原子能力可以总结为面向LLM、Agent、MCP和AI开放平台四大类,这里总结了8类常见的实践,多模型代理、消费者认证、内容安全与防护、Token限流、语义缓存、多模型容灾、多模型可观测和AI开放平台。 1、多模型代理 需求场景: 文本、图像、音频、3D等多模态业务场景。 企业不同垂直领域,需要调用专用模型。 任务需要多个模型分工协作。 医疗机构,处理患者数据使用私有模型,其他和患者无关使用通用模型。 ...

DRF比Django的认证和权限高在哪里

Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。

JavaWeb开发进阶SpringMVC简介

Spring MVC,又称为Spring Web MVC,名字来源于Spring模块spring-webmvc,是一个基于Servlet API开发的Web框架。

Java官方笔记7接口

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 接口 接口只能包含:constants, method signatures(abstract), default methods, static methods, and nested types 方法体只存在于:default methods and static methods 接口不能实例化,只能被类实现,或者被其他接口继承(接口可以多继承)。 定义接口: public interface OperateCar { // constant declarations, if any // method signatures // An enum with values RIGHT, LEFT int turn(Direction direction, double radius, double startSpeed, double endSpeed); int changeLanes(Direction direction, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); int getRadarFront(double distanceToCar, double speedOfCar); int getRadarRear(double distanceToCar, double speedOfCar); ...... // more method signatures } 类实现接口: ...

JMeter逻辑控制器完整介绍

JMeter逻辑控制器可以对元件的执行逻辑进行控制,就像编程一样,实现业务需求。

Python数据模型与Python对象模型

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 数据模型==对象模型 Python官方文档说法是“Python数据模型”,大多数Python书籍作者说法是“Python对象模型”,它们是一个意思,表示“计算机编程语言中对象的属性”。这句话有点抽象,只要知道对象是Python对数据的抽象,在Python中万物皆对象就可以了。 官方文档严谨说法,Python程序中的所有数据都是用对象或对象之间的关系来表示的。 对象三要素 对象有三个要素:编号(identity)、类型(type)、值(value)。 identity 编号就是对象的内存地址,从创建后就不会改变。is运算符用来比较2个对象的编号。id()函数返回对象编号的整数表示。 identity也可以翻译为身份,对象身份。 type 类型决定了可以对对象做哪些操作,也定义了对象的可能值,比如int和bool类型的值就不一样。type()函数返回对象类型。很多人会误以为Python是弱类型语言,其实Python是强类型语言,这个误解的真实原因是,Python不需要编译,不需要提前知道变量的类型,在运行时才检查类型,这应该叫做动态语言。 JavaScript是弱类型语言,在Python中1+"2"会运行失败,在JavaScript中能运行成功。 类型在创建后也不会改变,虽然可以进行类型转换,但转换实际会产生新对象: a = 1 print(id(a)) print(id(str(a))) print(id(a)) 结果为: 140715000207008 2136059506160 140715000207008 value 对象三要素中唯一能改变的就只有值了。官网有一句正确的废话:允许改变值的对象是mutable(可变的),不允许改变值的对象是immutable(不可变的)。它的意义在于当不可变对象的值是对可变对象的引用时,该如何判断对象的可变性?结论是不可变对象仍然是不可变的,因为这个引用是不能变的,但是我们通常会认为这个不可变对象的值是可变的,尤其是对象容器。对象类型也会决定是否可变,比如numbers、strings、tuples是不可变的,dictionaries、lists是可变的。 对象容器 有些对象包含了对其他对象的引用,这叫做containers对象容器,比如tuples、lists、dictionaries。大多数情况下,我们说容器的值,说的是引用的对象的值,而不是引用编号。但讨论容器可变性时,则仅仅是指容器直接包含的引用编号。比如tuple是不可变的,如果它包含了对一个可变对象的引用后,当该可变对象改变时容器的值也会改变。 对象回收 对象不会被显式销毁,但是它们会被当做垃圾回收,只要不存在对象引用,这就是Python垃圾回收机制!垃圾回收机制比较复杂,比如循环引用,实际上已经没有使用了,但是还存在引用等,涉及到算法规则,等写完Python进阶,在写Python原理时做进一步研究。 Python垃圾回收机制不是银弹,不能解决所有问题,所以在引用外部资源,比如打开文件后,我们需要注意显式close,防止资源始终占用内存,无法释放,造成内存泄漏。close除了手动调用close()方法外,也可以使用with来自动close。 使用try...except可能会让对象继续存活。 类型决定一切 对象的类型几乎决定了对象的一切行为,甚至是对象编号,比如对于不可变类型: a = 1 b = 1 a和b可能会指向同一个值为1的对象,也可能会指向两个不同的值为1的对象,这取决于具体实现。 但是对于可变类型: c = [] d = [] c和d一定会指向两个不同的单独的空列表。 注意c = d = [] 则是将同一个对象赋值给 c 和 d。 小结 Python数据模型就是常说的对象模型,万物皆对象,有编号、类型、值三个要素。了解了对象模型后,Python另一个重要概念即将浮出水面,它就是数据结构。 参考资料: 《流畅的Python》 https://docs.python.org/3/reference/datamodel.html

SpringBoot官方笔记7IO

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Caching Spring Boot auto-configures the cache infrastructure as long as caching support is enabled by using the @EnableCaching annotation. import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @Component public class MyMathService { @Cacheable("piDecimals") public int computePiDecimal(int precision) { ... } } Before invoking computePiDecimal, the abstraction looks for an entry in the piDecimals cache that matches the i argument. If an entry is found, the content in the cache is immediately returned to the caller, and the method is not invoked. Otherwise, the method is invoked, and the cache is updated before returning the value. ...

tep0.9.5支持自定义扩展request

tep0.9.5更新了以下内容:

2026-01-10 · 2 分钟 · 398 字 · 测试开发刚哥 · 原创项目 · #Tep

teprunner重磅更新Git打通PyCharm与测试平台

经过Python测试交流群的小伙伴群策群力,teprunner添加了一个重要功能,把PyCharm中的代码,通过Git同步到测试平台中,生成测试用例。这样,teprunner就成了一个名副其实的pytest脚本在线管理平台。

测试流程,别再层层加码了

想当初,测试流程很纯粹,就是研发把代码写完了,功能交给测试,测试提bug,测完了上线,再发个测试报告,完事。