Java : 2026 年 SpringBoot, Quarkus, Solon ?
生态/团队协作( Spring Boot )、云原生与效率( Quarkus )、国内轻量与快( Solon )。
xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。
生态/团队协作( Spring Boot )、云原生与效率( Quarkus )、国内轻量与快( Solon )。
Spring Boot4.1.0 的首个里程碑版本提供了缺陷修复、文档改进、依赖升级和新功能,例如:新的 除了缺陷修复、文档改进和依赖升级,Spring Boot 4.0.2,即第二个维护版本,还提供了一个值得注意的更改,即从 Spring Security7.1.0 的首个里程碑版本提供了缺陷修复、依赖升级和新功能,例如:在 Spring Integration7.1.0 的首个里程碑版本提供了缺陷修复、文档改进、依赖升级和新功能,例如:新的 Spring Modulith2.1.0 的首个里程碑版本提供了缺陷修复、依赖升级和改进,例如:在集成测试运行后重置 Spring AI2.0.0 的第二个里程碑版本提供了缺陷修复、文档改进、依赖升级和许多新功能,例如:在 Spring Batch6.0.2,即第二个维护版本,提供了缺陷修复、文档改进、依赖升级和一个新功能,引入了两个新类 Spring AMQP4.1.0 的首个里程碑版本提供了缺陷修复、依赖升级和新功能,例如:新的 原文链接: https://www.infoq.com/news/2026/01/spring-news-roundup-jan19-2026/Spring Boot
@AutoConfigureWebServer注解用于在支持@SpringBootTest注解的特定类和随机端口下启动 Web 服务器;以及通过 Spring AMQP 和 Spring Kafka 中定义的配置 bean 的自动配置,改进了可观测性和指标支持。关于该版本的更多细节可在发布说明中找到。spring-boot-jetty模块中移除了对org.eclipse.jetty.ee11:jetty-ee11-servlets模块的依赖,因为它未被使用并被确定为不必要。关于该版本的更多细节可在发布说明中找到。Spring Security
PasswordEncoder接口中定义的encode()方法添加了空值契约;以及使用 Spring FrameworkDefaultParameterNameDiscoverer类中定义的getSharedInstance()方法,而不是创建该类的单独自定义实例。关于该版本的更多细节可在发布说明中找到。Spring Integration
spring-integration-cloudevents和spring-integration-grpc模块分别支持CloudEvents转换和gRPC协议;以及新的GrpcInboundGateway和GrpcOutboundGateway类,作为 gRPC 客户端调用的入站和出站网关。关于该版本的更多细节可在发布说明和这个新功能页面中找到。Spring Modulith
TimeMachine类实例中的位移的能力;以及spring.modulith.test.on-no-changes属性的两个新属性值execute-all和execute-none,提供了在未检测到更改时跳过所有测试的能力。关于该版本的更多细节可在发布说明中找到。Spring AI
McpServerAutoConfiguration类中添加了新的接口McpSyncServerCustomizer和McpAsyncServerCustomizer,解决了非 web 应用程序环境中 MCP 自动配置的问题;以及添加了来自Amazon S3、Amazon Bedrock Knowledge Base和Infinispan的向量存储后端。关于该版本的更多细节,包括重大变更,可在发布说明中找到。Spring Batch
ZonedDateTimeToStringConverter和OffsetDateTimeToStringConverter,以支持JobParameters类的类型。关于该版本的更多细节可在发布说明中找到。Spring AMQP
AmqpMessageListenerContainer类实现了一个类似于RabbitAmqpListenerContainer类的容器;以及新的@EnableAmqp注解用于导入AmqpDefaultConfiguration类的实例,带有方便的基础设施 bean。关于该版本的更多细节可在发布说明和这个新功能页面中找到。
下面我直接给你一版企业级、可落地、讲人话但不降维的解释,适合技术人员、产品经理、运维、老板都能看懂的版本。 Spring Boot 是一个 用于快速构建 Java 企业级后端服务的应用框架,它的核心目标只有一个: 说得更直白一点: 在 Spring Boot 出现之前,Java 后端开发长期存在几个致命痛点: Spring Boot 的本质价值就是: 很多人只会背功能点,但你要的是底层逻辑。 Spring Boot 有三大设计思想: 👉 结果就是: Spring Boot 会在启动时: 你不用“声明”,只要“使用”。 这点对 云服务器 / Docker / CDN 回源架构 非常关键。 👉 本质是一条 “确定性启动链路”,没有魔法,只有规则。 Spring Boot 默认使用: 优点是: 下面这张表,直接给你结论: 👉 一句实话: 结合实际企业场景: 它不是“写页面的”,它是“扛业务的”。 **Spring Boot ≠ 新技术 如果你后面要继续往 微服务、云原生、CDN 回源、高并发 方向走, 需要的话,我可以 下一步直接帮你讲:Spring Boot + 高防 CDN / 网关架构是怎么配合的。一句话先定性 💡
用最少的配置,最快的速度,把一个“能上线、能扛事”的后端系统跑起来。
它是 Java 后端开发的“工业化流水线”,不是玩具,也不是教学框架。一、Spring Boot 到底解决了什么问题?🧠
👉 把“工程复杂度”前移给框架,把“业务专注度”还给开发者
二、Spring Boot 的核心思想(不是功能)⚙️
1️⃣ 约定大于配置
配置量暴跌,开发效率暴涨2️⃣ 自动装配(Auto Configuration)
3️⃣ 内嵌式运行模型
jar 文件即可启动整个服务三、Spring Boot 的运行原理(通俗但不失严谨)🔍
启动流程(逻辑级)
启动主类
↓
加载配置文件
↓
扫描依赖与注解
↓
自动装配组件
↓
启动内嵌 Web 容器
↓
对外提供 HTTP 服务四、核心结构拆解(你真正会用到的部分)🧱
1️⃣ 启动入口(示意)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}解释(逐句说人话):
@SpringBootApplication
👉 项目总开关,包含配置、扫描、自动装配SpringApplication.run()
👉 启动整个应用上下文,包括 Web 服务2️⃣ 配置文件体系(核心竞争力)
application.yml 或 application.properties五、为什么企业项目几乎都选 Spring Boot?📊
维度 Spring Boot 表现 开发效率 <span style="color:red">极高</span> 学习成本 中等(但回报极高) 生产稳定性 <span style="color:red">企业级</span> 云原生适配 <span style="color:red">天然友好</span> 运维成本 明显降低 生态成熟度 <span style="color:red">极成熟</span>
现在还不用 Spring Boot 的 Java 项目,要么是老系统,要么是技术债。六、Spring Boot 在真实业务中的典型用途 🚀
七、和传统 Spring 的本质区别(关键认知)⚠️
对比点 传统 Spring Spring Boot 配置方式 大量 XML <span style="color:red">自动 + 极少配置</span> 启动方式 外部容器 <span style="color:red">内嵌启动</span> 上手难度 高 <span style="color:red">明显降低</span> 交付方式 繁琐 <span style="color:red">一个包即可</span> 八、一句给技术负责人的底线判断 🧭
**如果你的系统是“长期运行、可扩展、要上生产、要配合云/CDN/容器”的——
不用 Spring Boot,本身就是一种风险。**最后一句总结(拍板用)✅
Spring Boot = Java 后端的“企业级默认答案”**
Spring Boot 不是选择题,是前置条件。
一、系统概述 #智慧景区#剧场演绎管理系统满足剧场、剧院#票务管理业务需求,集成场地管理、剧目管理、在线售票、数据分析等多项功能,优化票务管理流程,提升观众购票体验,帮助#剧场、#剧院管理人员高效处理从演出安排到财务结算的各个环节,从而提高运营效率和服务质量。 二、产品优势 1、功能全面覆盖:涵盖场地管理(如刷目管理、产品管理、订单管理、窗口售票)、数据报表及小程序移动端等多模块,满足剧场运营全流程需求。 2、操作便捷高效:通过技术手段(如实时座位图、电子验票)简化传统繁琐操作,提升管理效率与用户体验。 3、数据驱动决策:借助数据分析能力,帮助剧场实现精细化运营与科学决策,优化资源分配与市场策略。 4、灵活适配性强:支持线上线下融合、多验票方式等,适应不同规模剧场与多样化业务场景需求。 5、实时座位管理:提供直观的座位图显示,支持即时更新座位状态,确保座位信息准确无误,提升座位分配效率与观众体验。 6、多渠道售票:支持线上与线下相结合的多元化售票方式,方便观众随时随地购票,拓宽销售渠道。 7、数据分析与报告:能够生成详细的销售报告,帮助管理者分析票房趋势、观众偏好等数据,为营销策略与排期优化提供数据支撑。 8、高效的检票与入场管理:支持通过人脸识别、电子票或二维码等多种方式快速完成检票,大幅提升入场效率,减少排队时间与人工成本。 三、系统介绍 四、后台部分功能设置展示 1、场地管理 #智慧景区#剧场演绎管理系统的场地管理功能,通过数字化手段集中管理所有剧场、舞台及座位的静态信息与实时状态,并可视化其使用档期。该功能支持与演出计划的快速排期绑定,动态监控场地设备与安全,从而实现对场地资源的高效调度与优化利用,确保演出活动顺利进行,全面提升场地运营效率。 1.1、座位配置 #智慧景区#剧场演绎管理系统的座位配置功能,通过可视化图形界面,对剧场座位进行数字化建模与灵活管理。可快速设置每个座位的类型、价格、视野属性及状态(如可售、维修、锁定)。该功能实现了座位资源与票务销售的精准联动,能根据演出需求动态调整座席布局与销售策略,从而最大化提升场地利用率和票房价值。 1.2、座位信息编辑 2、剧目管理 #智慧景区#剧场演绎管理机系统-剧目管理功能是演绎运营的核心,负责对全部演出剧目进行数字化生命周期管理。它集中维护剧目基本信息、剧本、演职人员、服化道需求及多媒体素材;支持剧目的创建、版本更新与归档。 2.1.剧目场次配置 #智慧景区#剧场演绎管理系统-剧目场次配置功能是演出计划的核心,它支持对选定剧目进行批量、快速的场次排定。操作者可灵活设置每场演出的具体时间、所用场地(厅台)、票价体系及开售状态。系统能自动校验并规避时间与场地冲突,并实时同步至票务与营销模块,确保演出计划高效、准确地落地执行。 3、剧目产品管理 #智慧景区#剧场演绎管理系统-剧目产品管理功能实现对演艺产品从创建、上架、排期到退出的全生命周期管理。核心是建立统一的数字化剧目库,详细记录剧目介绍、演职人员、票务价格、座位模板等核心信息。 3.1.剧目产品配置 #智慧景区#剧场演绎管理系统-剧目产品配置功能是演艺管理的核心,在此模块中,运营人员可快速创建新剧目,完整定义其基础信息、演出时长与特色标签;并灵活完成核心设置:包括绑定适用的演出场地、排定演出场次、制定多级票价策略,以及关联所需的演员、设备等资源。该功能实现了从剧目创意到市场售卖的一键式产品封装,为后续的票务销售与财务核算提供准确的数据基石。 3.2.产品价格配置 #智慧景区#剧场演绎管理系统-产品价格配置功能支持对演出票、套票等产品进行灵活定价。可基于场次、座位区域设定基础价格,并能针对特定渠道、节假日或促销活动设置浮动折扣与优惠规则。系统实现价格策略的自动化执行与实时同步,确保线上线下价格统一,同时动态调整库存,有效支撑收益管理及精准营销活动。 4、窗口售票 #智慧景区#剧场演绎管理系统-窗口售票功能与线上渠道数据实时互通,确保票务库存精准一致。售票员可快速查询场次、选座、出票,并灵活处理退改签。系统支持多种支付方式,并自动核销票务状态。所有操作记录清晰可溯,有效杜绝超卖错卖,在提升前台效率的同时,也为财务管理提供准确数据基础。 4.1.观影人实名信息编辑 5、订单管理 #智慧景区#剧场演绎管理系统-订单管理功能是系统的业务核心,它实现对票务订单从生成到履约完结的全生命周期管理。该功能统一处理来自各渠道的订单,自动化完成座位的锁定与释放、支持多种在线支付与核销,并实时更新订单状态(如待支付、已出票、已检、已取消)。同时,它提供订单查询、退改签审核及财务对账数据,确保每一笔交易流程清晰、高效可控。 五、往届回顾 六、下篇预告:#智慧文旅#酒店管理系统,集成房态、房价、订单,打造无缝运营体验 #智慧文旅#酒店管理系统可以帮助酒店和民宿经营者高效管理日常运营,为游客提供线上线下预订、付费和售后服务。包括基础信息管理、房态管理、订单管理、客户管理、统计分析、住宿设置、房价设置、门店管理等系统功能。 七、软件结构 本软件采用的是uniapp+JAVA语言开发,编码规范完全按照阿里巴巴编码规范













移动端:采用 uni-app 方案,一份代码多终端适配,同时支持 APP、小程序、H5;
前端采用Vue、Element UI。
后端采用Spring Boot多模块架构、Spring Security、Redis & Jwt。
权限认证使用Jwt,支持多终端认证系统。
Kite 是一个高效的轻量级 ORM 框架,基于 Kotlin 编写,开箱即用,内置分页查询、增删改查等常用功能,支持多表操作。它支持 PostgreSQL、MySQL、Derby 等多种数据库,旨在通过简化数据库操作,减少代码量,提升开发效率。 详细的使用文档请参考: Kite 的源码托管在 GitHub 和 Gitee 上,您可以在以下地址查看和贡献: Kite 是一个功能强大、易于使用的 ORM 框架,它通过全自动映射和简洁的 API,大大简化了数据库操作的开发工作。无论是在 Kotlin 项目还是 Java 项目中,都能提供高效、便捷的数据库访问体验。 如果您正在寻找一个轻量级、高性能的 ORM 框架,Kite 绝对值得一试!Kite:Kotlin/Java 通用的全自动 ORM 框架
框架特点
使用方法(Spring Boot 集成示例)
Maven 中央仓库: kite-spring-boot-starter
<dependency>
<groupId>io.github.tangllty</groupId>
<artifactId>kite-spring-boot-starter</artifactId>
<version>${kite.version}</version>
</dependency>implementation("io.github.tangllty:kite-spring-boot-starter:${kite.version}")使用 MySQL 演示
create table account (
id bigint not null auto_increment,
username varchar(32) default '',
password varchar(32) default '',
balance decimal(10,2) default '0.00',
create_time datetime default null,
update_time datetime default null,
primary key (`id`)
);
insert into account (username, password, create_time, balance) values
('admin', 'admin123', '2020-01-01 12:00:00', 1000.10),
('user', 'user123', '2024-05-02 8:30:00', 101.00),
('guest', 'guest123', '2022-03-03 15:00:00', 10.00),
('tang', 'tang123', '2019-06-01 21:30:30', 1.88),
('jeo', 'jeo123', '2024-07-01 5:59:59', 0.10);application.yml 文件中配置数据库连接信息spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/kite-test
username: root
password: passwordaccount 表创建模型类import com.tang.kite.annotation.id.Id;
import com.tang.kite.annotation.id.IdType;
import java.math.BigDecimal;
import java.time.LocalDateTime;
public class Account {
@Id(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private BigDecimal balance;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// Getters and Setters
}import com.tang.kite.annotation.id.Id
import com.tang.kite.annotation.id.IdType
import java.math.BigDecimal
import java.time.LocalDateTime
class Account (
@Id(type = IdType.AUTO)
var id: Long? = null,
var username: String? = null,
var password: String? = null,
var balance: BigDecimal? = null,
var createTime: LocalDateTime? = null,
var updateTime: LocalDateTime? = null
)BaseMapper 接口创建 Mapper 接口import com.tang.kite.mapper.BaseMapper;
import com.tang.kite.spring.annotation.Mapper;
@Mapper
public interface AccountMapper extends BaseMapper<Account> {
}import com.tang.kite.mapper.BaseMapper
import com.tang.kite.spring.annotation.Mapper
@Mapper
interface AccountMapper : BaseMapper<Account>@MapperScan 注解import com.tang.kite.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.tang.application.mapper")
@SpringBootApplication
public class KiteApplication {
public static void main(String[] args) {
SpringApplication.run(KiteApplication.class, args);
}
}import com.tang.kite.spring.annotation.MapperScan
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@MapperScan(["com.tang.application.mapper"])
@SpringBootApplication
class KiteApplication
fun main(args: Array<String>) {
runApplication<KiteApplication>(*args)
}import com.tang.demo.mapper.AccountMapper;
import com.tang.kite.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.tang.application.mapper")
@SpringBootApplication
public class KiteApplication {
public static void main(String[] args) {
var context = SpringApplication.run(KiteApplication.class, args);
var accountMapper = context.getBean(AccountMapper.class);
var accounts = accountMapper.select();
accounts.forEach(System.out::println);
}
}import com.tang.demo.mapper.AccountMapper
import com.tang.kite.spring.annotation.MapperScan
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@MapperScan(["com.tang.application.mapper"])
@SpringBootApplication
class KiteApplication
fun main(args: Array<String>) {
val context = runApplication<KiteApplication>(*args)
val accountMapper = context.getBean(AccountMapper::class.java)
val accounts = accountMapper.select()
accounts.forEach { println(it) }
}文档与社区
官方文档
源码
总结
使用 springboot 集成 micrometer 实现自定义 prometheus 指标。
假如在多实例的商城系统中存在一个用于统计商品查看次数的指标,名为 item_view_count ,label:item_id 、instance_id 。
当服务重启时,按照 micrometer 的默认行为,这个指标会被置为 0 。
对于这个行为我想到了两种方案。
各位都是如何处理这个问题呢?
使用 springboot 集成 micrometer 实现自定义 prometheus 指标。
假如在多实例的商城系统中存在一个用于统计商品查看次数的指标,名为 item_view_count ,label:item_id 、instance_id 。
当服务重启时,按照 micrometer 的默认行为,这个指标会被置为 0 。
对于这个行为我想到了两种方案。
各位都是如何处理这个问题呢?
使用 Spring Boot 4.0 和 GraalVM Native
通过企业微信(WeCom),将系统消息稳定、合规地推送到用户的微信中接收。
整体消息流转路径如下:
最终效果是: 用户在微信中收到消息,但技术通道使用的是企业微信。
为什么选择企业微信?
相比微信公众号,企业微信具备天然的系统通知优势:
无缝触达:消息最终可到达 微信 App(需关注插件)。
主动推送:支持无限制的主动消息推送,适合通知。
稳定合规:官方允许的系统消息通道,不涉及内容风控。
简单易用:无需复杂的模板消息申请,开发接口清晰。
有什么需要的或者想法可以提,交流一下
谁都可以注册企业微信,无需认证,按说明注册并使用微信扫二维码完成管理员绑定
选择我的企业,点击微信插件,使用手机扫码关注
添加 logo 和应用名称以及可见范围,选择一个部门或者自己都行,创建应用
创建完成后会进入当前页面,点击查看可以看 Secret
点击发送,可前往企业微信查看消息
点击查看,保存好,不要泄露,至关重要
在配置可信 IP 之前,我们需要先设置可信域名
可信域名需要校验域名,点击 申请校验域名 获得认证信息
下载文件放置到一个网站的根目录下,我这里放置到了自己在 cloudflare 的 Workers 和 Pages 博客上 https://mazepeng.com/
当文件可以访问到的时候就可以设置可信域名了
现在推送消息的服务必须有可信 IP,如何获得自己的 IP 呢
访问 https://ifconfig.me/ 或者直接百度 IP 就可以看到自己的公网 IP 了
点击应用管理,点击应用,拉倒最下面,配置可信 IP
支持 docker 部署和本地应用部署,这里我就介绍一下 docker 部署
docker run -d \
--name push-server \
-p 8000:8000 \
-e PUSH_AUTH_KEY="替换为自己的key" \
-e PUSH_WECOM_APP_KEY="你的应用AppKey" \
-e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
-e PUSH_WECOM_AGENT_ID="1000001" \
qingzhoudev/push-server:latest
#安全设置,默认值为下方值,需要修改添加环境变量修改
docker run -d \
--name push-server \
-p 8000:8000 \
-e PUSH_AUTH_KEY="替换为自己的key" \
-e PUSH_WECOM_APP_KEY="你的应用AppKey" \
-e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
-e PUSH_WECOM_AGENT_ID="1000001" \
-e PUSH_SECURITY_BLOCK_MINUTES="30" \
-e PUSH_SECURITY_FAIL_WINDOW_MINUTES="5" \
-e PUSH_SECURITY_MAX_FAILS="5" \
-e PUSH_SECURITY_RATE_LIMIT_CAPACITY="10" \
-e PUSH_SECURITY_RATE_LIMIT_QPS="1" \
qingzhoudev/push-server:latest
替换后直接 docker 启动
services: push-server: qingzhoudev/push-server:latest container_name: push-server ports: - "8000:8000" volumes: - ./application-prod.yml:/app/config/application-prod.yml:ro restart: unless-stopped application-prod.yml 文件
push: auth: key: "CHANGE_ME" security: block-minutes: 30 fail-window-minutes: 5 max-fails: 5 rate-limit-capacity: 10 rate-limit-qps: 1 wecom: app-key: "CHANGE_ME" app-secret: "CHANGE_ME" agent-id: 1000001 webhook-url: server: port: 8000 和正常接收微信消息一样,没有什么区别
curl -X POST http://localhost:8000/api/v1/push \
-H "X-API-Key: 替换为自己的key" \
-H "Content-Type: application/json" \
-d '{
"target": "ZhangSan|LiSi",
"type": "TEXT",
"content": "系统通知:您的任务已构建完成。"
}'
curl -X POST http://localhost:8000/api/v1/push \
-H "X-API-Key: 替换为自己的key" \
-H "Content-Type: application/json" \
-d '{
"target": "MaZePeng",
"type": "TEXT_CARD",
"title": "测试Push Server",
"content": "我是 Push Server,这是我作为服务端的第一条消息",
"url": "https://www.mazepeng.com"
}'
curl -X POST http://localhost:8000/api/v1/push \
-H "X-API-Key: 替换为自己的key" \
-H "Content-Type: application/json" \
-d '{
"target": "MaZePeng",
"type": "NEWS",
"articles": [
{
"title": "测试 Article",
"description": "我是描述",
"url": "https://www.mazepeng.com",
"picUrl": "https://mazepeng.com/img/bg/a_larger_image_of_the_homepage.jpg"
}
]
}' 类型有:
因为有时候离开工位之后不确定电脑有没有锁屏
所以拿站里的佬友的公益站配合 claudecode 撸了一个用于手机控制 mac 远程锁屏的小工具。
因为现在手头没服务器,所以需要佬友自己部署一下。
附上 github 链接:
从 这里好像没有讨论 java 技术的 继续讨论。
在前段时间公司要自己搞个电商平台,首选开发语言用 java, 架子用 springboot,我作为研发负责人。
在立项初期我准备上 cloud, 但是老板没同意,说后面再迭代,我因为刚来这家公司我也就没好说什么,单体就单体呗。
在后面的开发过程中产品提出要增加一个供应商服务端,两端会有频繁的数据交互,我思考了半天有几个方案,要么是谷歌的 grpc, 要么是阿里的 dubbo, 或者是 openfeign, 不过 grpc 要写 protobuf,dubbo 以前用的 2.8 版本遇到兼容性问题现在好多年不用而且时间给的少我怕来不及,openfeign 又没脱离 cloud 依赖,需要引入一堆 maven 依赖,思来想去总不能直接 http 吧,这不胶水架构了么。
最后吧,还是用了胶水架构,不过是好用一点的,这就是 HTTP Interface 啦,因为当时是我负责搭建架子的,所以我采用了基于 jdk17 的 boot3.5, 正好是基于 Spring Framework 6 的。
这个东西用起来门槛非常低,只需要一个配置:
@Configuration @RequiredArgsConstructor @Slf4j public class HttpInterfaceConfig {
private final TenantPropagator tenantPropagator;
@Value("${service.auth.secret-key}") private String secretKey;
private WebClient.Builder createWebClientBuilder(String baseUrl) {
return WebClient.builder()
.baseUrl(baseUrl)
.filter(this::addAuthHeaders) // 添加认证过滤器
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
}
/**
* 为每次请求动态添加认证头
*/ private Mono<ClientResponse> addAuthHeaders(ClientRequest request, ExchangeFunction next) {
// 每次请求时动态生成时间戳、随机数和签名 long timestamp = System.currentTimeMillis();
String nonce = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
String signature = HmacSignUtils.generateTimestampSignature(timestamp, nonce, secretKey);
log.debug("🔐 动态生成认证头 - timestamp: {}, nonce: {}, signature: {}",
timestamp, nonce, signature);
// 创建新的请求,添加认证头 ClientRequest newRequest = ClientRequest.from(request)
.header("X-Internal-Service", "true")
.header("X-Service-Timestamp", String.valueOf(timestamp))
.header("X-Service-Nonce", nonce)
.header("X-Service-Signature", signature)
.build();
return next.exchange(newRequest);
}
@Bean public OperationPlatFormApiClient operationPlatformApiClient(
@Value("${service.operationPlatform.url}") String baseUrl) {
log.info("=== operationPlatformApiClient 配置信息 ===");
log.info("baseUrl: {}", baseUrl);
log.info("secretKey: {}", secretKey != null ? "已配置" : "未配置");
// 创建基础的 WebClient Builder
WebClient.Builder webClientBuilder = createWebClientBuilder(baseUrl);
// 传播租户信息
webClientBuilder = tenantPropagator.propagateTenant(webClientBuilder);
WebClient webClient = webClientBuilder.build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builderFor(adapter)
.build();
OperationPlatFormApiClient client = factory.createClient(OperationPlatFormApiClient.class);
log.info("✅ operationPlatformApiClient 创建成功");
return client;
}
@Bean public SupplierApiClient supplierApiClient(
@Value("${service.supplier.url}") String baseUrl) {
log.info("=== SupplierApiClient 配置信息 ===");
log.info("baseUrl: {}", baseUrl);
log.info("secretKey: {}", secretKey != null ? "已配置" : "未配置");
// 创建基础的 WebClient Builder
WebClient.Builder webClientBuilder = createWebClientBuilder(baseUrl);
// 传播租户信息
webClientBuilder = tenantPropagator.propagateTenant(webClientBuilder);
WebClient webClient = webClientBuilder.build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory
.builderFor(adapter)
.build();
SupplierApiClient client = factory.createClient(SupplierApiClient.class);
log.info("✅ SupplierApiClient 创建成功");
return client;
}
@Bean public CrowdsourcingApiClient crowdsourcingApiClient(
@Value("${service.crowdsourcing.url}") String baseUrl) {
log.info("=== CrowdsourcingApiClient 配置信息 ===");
log.info("baseUrl: {}", baseUrl);
// 创建基础的 WebClient Builder
WebClient.Builder webClientBuilder = createWebClientBuilder(baseUrl);
// 传播租户信息
webClientBuilder = tenantPropagator.propagateTenant(webClientBuilder);
WebClient webClient = webClientBuilder.build();
WebClientAdapter adapter = WebClientAdapter.create(webClient);
return HttpServiceProxyFactory
.builderFor(adapter)
.build()
.createClient(CrowdsourcingApiClient.class);
}
}
就可以了,然后就能像写 openfeign 那样:
@Resource private SupplierApiClient supplierApiClient;
@PostMapping("/createSupplier") @Operation(summary = "新增供应商用户") public Mono<CommonResult<Integer>> createSupplier(@Valid @RequestBody SuppLierUsersVO reqVO) {
return ReactiveApiHandler.processReactive(supplierApiClient.createAccount(reqVO), "创建供应商账户");
}
要使用它只需要有 spring-webflux 就可以了,好像是 Spring Framework 6 自带的。
ps:
这东西有个坑,就是你的客户端里的接口越多,启动的时候就越慢,所以一般推荐做个懒加载,不然你客户端写上百个接口,启动就要占用你一分钟的时间。
随着 Spring Boot 在微服务架构中的广泛应用,其暴露的安全漏洞也呈指数级增长。传统的手工测试在面对成百上千个端点时显得力不从心,而自动化工具往往缺乏对 Spring Boot 特有漏洞的深度支持。
SpringBootVul-GUI 的出现,填补了 Spring Boot 专项安全工具的空白,成为红队工程师和安全研究人员的效率倍增神器!
SpringBootVul-GUI 是一款半自动化 Spring Boot 漏洞检测与利用工具,内置目前 Spring Boot 所有漏洞。它以图形化界面为核心,集成了目前主流的 Spring Boot 漏洞检测模块,实现了从信息收集到漏洞利用的一站式工作流。
• 全面性: 覆盖 20 + 种 Spring Boot 漏洞类型,从配置泄露到高危 RCE
• 半自动化: 人工决策与自动化检测结合,平衡效率与准确性
• 风险分级: 明确标注高危操作,避免误用导致服务瘫痪
• 持续更新: 开发者保持对新型漏洞的快速响应 GitHub - wh1t3zer/SpringBootVul-GUI: 一个半自动化 springboot 打点工具,内置目前 springboot 所有漏洞
之前用的 dc,现在试试这个,纯搬运,如果佬友有更好的推荐,可以进行分享一下,觉得有用的可以给个赞
地址