- 博客(86)
- 问答 (1)
- 收藏
- 关注
原创 Spring AI Alibaba入门
Spring AI Alibaba 是构建 Agent 智能体应用最简单的方式,基于 Spring AI 框架构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践。配置项方法类型必需默认值说明Agent 名称String✅Agent 标识LLM 模型ChatModel✅使用的模型系统提示词String❌定义角色指令String❌额外指令工具列表❌可用工具检查点保存器❌状态保存最大迭代次数int❌10防止无限循环最大执行时间。
2025-12-26 15:37:42
854
原创 Spring AI @ToolParam 扩展注解改造实践
在使用 Spring AI 框架开发 MCP(Model Context Protocol)服务器时,我们发现框架提供的@ToolParam注解虽然能够描述参数的基本信息(描述和是否必填),但缺少示例值和默认值的支持。这对于 AI 模型理解参数格式和生成正确的调用参数来说,是一个不小的遗憾。本文将详细介绍如何在不修改 Spring AI 框架源码的前提下,通过扩展注解和自定义 Schema 生成器的方式,为工具参数添加example和支持。优点完全独立,不依赖框架修改易于维护和升级可以灵活扩展。
2025-12-26 15:22:56
942
原创 Nacos MCP Router
router模式:默认模式,通过MCP Server推荐、安装及代理其他MCP Server的功能,帮助用户更方便的使用MCP Server服务。proxy模式:使用环境变量MODE=proxy指定,通过简单配置可以把sse、stdio协议MCP Server转换为streamableHTTP协议MCP Server。在router 模式下,Nacos MCP Router 作为一个标准MCP Server,提供MCP Server推荐、分发、安装及代理其他MCP Server的功能。
2025-09-06 15:07:06
1032
原创 Streamable HTTP
之前在博客中使用Spring AI搭建了使用sse通信模式的mcp server ,然而sse通信模式在实际的开发应用中会遇到不少问题,由于工作繁忙一直没有去升级协议,这两天Spring AI发布快照1.1.0-SNAPSHOT,其中就有对新协议Streamable HTTP的支持,今天笔者来学习一下。/sse当 SSE 连接断开时,所有会话状态丢失,客户端必须重新建立连接并初始化整个会话。例如,正在执行的大型文档分析任务会因 WiFi 不稳定而完全中断,迫使用户重新开始整个过程。
2025-09-03 18:05:49
1642
原创 使用nacos3+higress实现存量api转换为mcp
摘要:本文详细介绍了Nacos 3.0和Higress的安装配置过程。首先在Windows环境下安装Nacos Server并配置MySQL数据源,然后通过Docker Desktop部署Higress和Redis。接着配置Higress连接Redis并启用MCP功能,将Nacos服务集成到Higress中。最后通过一个图书管理服务的Spring Boot示例项目,演示了如何将服务注册到Nacos,并在Higress中配置REST API为MCP Tools,实现协议转换和接口调用。文章提供了完整的配置示例
2025-09-02 16:05:11
1174
原创 在window上部署es9.0.1+kibana9.0.1
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。文件,elasticsearch8.x以上版本是自动开启安全认证的。进入config目录,修改。
2025-08-19 16:44:36
385
原创 解决spring ai 在底层调度mcp工具时线程复用导致token同时复用的问题
场景: mcp客户端有服务端只建立一个连接,每次调用mcp工具时都会在大模型处理完参数后将token,traceId塞到参数中带过来。问题:spring ai 执行工具时,使用Reactor 包中的BoundedElasticScheduler调度器,在任务处理完后线程并未销毁,而是放入线程池中,后面复用时就导致线程中还是用的原来的上下文导致,token错误。
2025-07-26 11:22:57
438
原创 使用Spring AI 进行MCP开发
由于我的server都是发一个http请求所以创建一个BaseServcie。(2)在mcp客户端头部携带token请求时,将token塞到本地线程中。这是用来注册tool的,下面是我在实际开发的一个例子。(1)创建本地线程类。
2025-06-25 14:31:51
597
原创 邮件限流器
在之前的开发中开发了一个发邮件的工具类,在客户实际的操作下出现了smtp服务器返回错误消息限制发送速度的问题,所以新的需求出现了,让用户自己去控制发送邮件的速度。这篇文章来写一个邮件限流器。
2025-06-11 17:56:19
253
原创 使用javaMail写一个邮件工具类
*** SMTP配置 实体类*/@Data/*** 主键*//*** 公司ID*//*** 部门ID*//*** 账号名称*//*** SMTP服务器地址*//*** SMTP端口*//*** 邮箱账号*//*** SMTP密码(授权码)*//*** 发件人显示名称*//*** 是否开启SSL/TLS 0-开启 1-关闭*//*** 是否默认配置 0-是 1-否*//**
2025-05-19 10:02:47
1424
原创 大模型相关学习(本地部署deepseek)
检索(Retrieval)的详细过程准备外部知识库:外部知识库可能来自本地的文件、搜索引擎结果、API 等。通过 Embedding(嵌入)模型,对知识文件进行解析:Embedding 的主要作用是将自然语言转化为机器理解的高维向量,并且通过这一过程捕获到文本背后的语义信息(比如不同文本之间的相似关系)。通过 Embedding(嵌入)模型,对用户的提问进行处理:用户的输入同样会经过嵌入(Embedding)处理,生成一个高维向量。拿用户的提问去匹配本地知识库。
2025-02-19 18:32:37
1107
原创 EasyExcel的简单使用
关键是写一个监听器,实现AnalysisEventListener, 每解析一行数据会调用invoke方法返回解析的数据, 当全部解析完成后会调用doAfterAllAnalysed方法. 我们重写invoke方法和doAfterAllAnalysed方法即可.将Java对象中指定的属性, 插入到Eexcel表格中的指定列(在Excel表格中进行列排序), 使用index属性指定列顺序.上面的写已经提到了转换器, 读也是一样. 将Excel文件中的字符串枚举值转换成要存入db的整数类型的枚举.
2025-02-17 16:27:28
1664
原创 枚举类的常用方法
举类(enum)在 Java 中是一种特殊的类,除了可以定义自己的字段、方法和构造函数外,还自带了一些内置方法。这些方法是由编译器自动生成的,可以直接使用。
2025-01-08 17:30:56
1150
原创 SpringBoot使用Validation校验参数
虽然Bean Validation和Hibernate Validator已经提供了非常丰富的校验注解,但是在实际业务中,难免会碰到一些现有注解不足以校验的情况;这时,我们可以考虑自定义Validation注解。第一步:创建自定义注解/*** 自定义校验注解* 提示:* 1、message、contains、payload是必须要写的* 2、还需要什么方法可根据自己的实际业务需求,自行添加定义即可* 注:当没有指定默认值时,那么在使用此注解时,就必须输入对应的属性值*/
2024-12-25 16:22:55
1392
原创 参数校验国际化改造
(1)创建Resource Bundle(2)在Resource Bundle下创建各国的properties(3)在properties以key-value的形式定义响应消息(4)在入参处使用key作为message(5)配置MessageConfig// 设置消息资源文件的基路径(注意这里的messages是创建Resource Bundle时设置的base name)//可以设置多个BaseName// 设置默认编码@Bean。
2024-12-09 11:34:23
1025
原创 Spring Data Elasticsearch
接口的继承所有方法@Api(tags = "增删改查(文档)")@Autowired@ApiOperation("添加单个文档")blog.setTitle("Spring Data ElasticSearch学习教程" + id);blog.setContent("这是添加单个文档的实例" + id);@ApiOperation("添加多个文档")i
2024-12-03 16:15:04
2398
原创 Redis 实战篇
在这个方案中,他确实可以使用对应路径的拦截,同时刷新登录token令牌的存活时间,但是现在这个拦截器他只是拦截需要被拦截的路径,假设当前用户访问了一些不需要拦截的路径,那么这个拦截器就不会生效,所以此时令牌刷新的动作实际上就不会执行,所以这个方案他是存在问题的。
2024-06-17 16:07:38
1514
原创 java面试题
给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮。缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。bitmap(位图):相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或1。误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多的内存消耗。缺点:消耗内存,可能会发生不一致的问题。优点:内存占用较少,没有多余key。
2024-06-11 15:59:15
1219
原创 在gateway网关中使用feign远程调用
由于 gateway 采用 spring-boot-starter-webflux 异步的 web 组件,该组件和 spring-boot-starter-web 有较大区别,我们的 openFeign 对 spring-boot-starter-web 比较契合,而对于 前者则需要做一些适配。因为 gateway 是异步,而 FeignClient 是同步请求,同步请求在 gateway 中是不被允许的。所以我们需要采取异步的方式发送请求,这使得我们在调用微服务请求时需要做一个包装。
2024-06-06 18:55:49
1362
原创 搭建gateway网关
Order(-1)@Component@Override// 1.获取请求参数// 2.获取authorization参数// 3.校验// 放行// 4.拦截// 4.1.禁止访问,设置状态码// 4.2.结束处理过滤器的执行顺序:请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter。
2024-06-03 14:15:31
1944
原创 SDK开发
理想情况:开发者只需关心调用哪些接口,传递哪些参数就跟调用自己写的代码一样简单。开发starter的好处:开发者引入之后,可以直接在application.yml中写配置,自动创建客户端。
2024-05-31 12:56:48
876
原创 API签名认证
定义:API签名认证是一种安全机制,通过为每个请求生成一个唯一的签名值来验证其合法性。作用身份验证:验证请求发送者的身份是否合法。防止篡改:确保请求在传输过程中没有被篡改。防止重放攻击:防止攻击者重复发送之前截获的合法请求。
2024-05-30 18:35:56
626
原创 Hutool
综上所述,Hutool是一个功能强大、简单易用、灵活可选的Java工具库,能够帮助开发者更高效地完成Java开发工作。,旨在简化Java开发中的各种常见操作。
2024-05-30 17:35:13
381
原创 mySql从入门到入土
net start mysql // 启动mysql服务net stop mysql // 停止mysql服务mysql -uroot -p1234//登录MYSQL(-u为用户名-p为密码)//登录参数mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)exit //退出mysqlquit //退出mysql· 2.MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
2024-05-19 18:48:52
1477
原创 java多线程
首先,什么是线程安全问题呢?线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。下面通过一个取钱的案例给同学们演示一下。案例需求如下场景:小明和小红是一对夫妻,他们有一个共享账户,余额是10万元,小红和小明同时来取钱,并且2人各自都在取钱10万元,可能出现什么问题呢?如下图所示,小明和小红假设都是一个线程,本类每个线程都应该执行完三步操作,才算是完成的取钱的操作。但是真实执行过程可能是下面这样子的。
2024-05-18 17:14:39
879
原创 用户授权(控制用户访问资源权限)
本项目是基于角色分配权限,如果要删除用户的权限可以给用户换角色,那么新角色下的权限就是用户的权限;如果不换用户的角色可以删除角色下的权限即删除角色权限关系表相应记录,这样操作是将角色下的权限删除,属于该角色的用户都将删除此权限。一个例子:用户A和用户B都是教学机构,他们都拥有“我的课程”权限,但是两个用户所查询到的数据是不一样的。细粒度授权涉及到不同的业务逻辑,通常在service层实现,根据不同的用户进行校验,根据不同的参数查询不同的数据或操作不同的数据。
2024-05-18 10:45:12
1307
原创 Spring Security框架下jwt令牌的使用
这个过程就是无状态认证。拿到了jwt令牌下一步就要携带令牌去访问资源服务中的资源,本项目各个微服务就是资源服务,比如:内容管理服务,客户端申请到jwt令牌,携带jwt去内容管理服务查询课程信息,此时内容管理服务要对jwt进行校验,只有jwt合法才可以继续访问。令牌采用JWT格式即可解决上边的问题,用户认证通过后会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。
2024-05-16 16:35:50
1805
原创 OAuth2
在前边我们提到微信扫码认证,这是一种第三方认证的方式,这种认证方式是基于OAuth2协议实现,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。
2024-05-15 08:30:42
1218
原创 Spring Security 认证研究
认证功能几乎是每个项目都要具备的功能,并且它与业务无关,市面上有很多认证框架,如:Apache Shiro、CAS、Spring Security等。由于本项目基于Spring Cloud技术构建,Spring Security是spring家族的一份子且和Spring Cloud集成的很好,所以本项目选用Spring Security作为认证服务的技术框架。Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是一个专注于为 Java 应用程序提供身份验证和授权的框架。
2024-05-14 23:24:19
1101
原创 微服务熔断降级
微服务中难免存在服务之间的远程调用,比如:内容管理服务远程调用媒资服务的上传文件接口,当微服务运行不正常会导致无法正常调用微服务,此时会出现异常,如果这种异常不去处理可能导致雪崩效应。微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务可能导致其它服务也死掉,比如:服务B调用服务A,由于A服务异常导致B服务响应缓慢,最后B、C等服务都不可用,像这样由一个服务所引起的一连串的多个服务无法提供服务即是微服务的雪崩效应,如下图:如何解决由于微服务异常引起的雪崩效应呢?
2024-05-14 10:04:30
690
空空如也
在实现通讯录功能时,保存的联系人信息无法从文件中读入内存
2022-12-04
实现单链表的逆置时出现的问题
2022-06-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1