TODAY Infrastructure

April 9, 2026 · View on GitHub

Logo A Java library for applications software infrastructure.

Java17 Apache License 2.0 Deploy Codecov Coveralls CI Codacy Badge Coverage Status Coverage Status FOSSA Status

概述

该项目起源于 2017 年。主要用于构建高性能 Web 应用程序和普通应用程序的 Java 库。

主要目的

主要为了学习技术,顺便给自己的博客网站 https://taketoday.cn 提供基础框架(其实写的博客网站也是为了学习练习技术)。博客也开源了:https://github.com/TAKETODAY/today-blog

点击查看背景

背景

起源于大学的时候学习编程,后来用 Java Servlet 做了一个博客网站。在开发过程中发现有很多重复代码, 我觉得这样的代码很不优雅,尽管那个时候刚学编程不久,于是在我学习 Struts2 的时候自己尝试着写了一个类似的 通过 XML 配置干掉了大量的重复代码的程序。于是初代的 infra-web 诞生并开源。

后面学习了 Java 注解 又实现了通过注解配置的版本 today-web 注解版

today-web 注解版 刚出来时也正在学 Spring 感觉没有 IoC 容器感觉不是很方便。在网上看到很多自己写 什么 Mini Spring 之类,所以我大胆决定我也要写一个。有这个决心是因为我把 today-web 都写出来了, 再写个 IoC 应该不难吧。刚开始参考了各种 mini-spring,该说不说现在看来正是那个时候参考了他们的代码才导致我有些认知错误。在2021年6月-2021年12月期间 又去深入看 Spring 源码才纠正过来。事实证明写一个这样的东西确实不难,只是要优雅的话还是要点东西的。我自认为我的代码还是优雅的。不信? 我的B站直播间欢迎你 。(在2021年开始直播写这个库,后面工作比较忙了就没怎么直播,后面有时间就会直播)。

刚开始写的时候(大概是2018年,我也是看的Git提交记录哈哈)有点无从下手,所以我去参考上文说到的各类 Mini Spring。 就这样又开启了一轮学习。 学习如何扫描类文件、学习Java注解、Java字节码、动态代理、重新认识接口、一些设计模式、学习使用Git、渐渐明白了单元测试的重要性 等。随着学习的深入框架经历了数次重构,自己也对依赖注入有了自己的看法。慢慢的我发现我居然能看得明白 Spring 源码了。 感觉Spring真心强大。

如果你问我怎么学习编程,我觉得造轮子是比较好的方式。自己还有很多要学的东西。比如分布式方面的知识,所以今后你定会看到诸如 today-rpc, today-distributed-* 等项目诞生。

现状

学习维护一个项目,这是一个长久的过程。

在 2021 年随着学习的深入我觉得 Spring 功能强大,设计良好,自己虽然也能设计一些类似的功能,但是始终觉得靠我一个人的力量是不能设计 这么多完善的,于是我打算换种方式学习:移植。再转向到了现在这种学习方式:维护(通过维护学习新东西)。移植也不是一个简单的过程,不是单纯的 复制粘贴,我要结合之前的代码把 Spring 的代码适配到我原有的工程体系中,加之之前我的很多模块都是单独的 Git 仓库,我还要将他们合并到一个仓库。

我是一个模块一个模块的开始,一个模块我会学到很多东西。 这个过程持续了 2 年多(可以从 Git 提交记录看到)。后续的 Spring 主分支更新我也一直在同步(BUG 修复,新功能)。 在这期间我发现了 Spring 的一些问题,针对其中的一部分我还给 Spring 提交过多次优化改进的 PR。

这个库目前只有我在自己的生产环境使用,移植的模块是根据我自己的一些项目使用情况来的,例如没有移植 JMS, Messaging, R2dbc, Web Flux。 有些是我觉得没必要封装有的功能是我还没使用上。

截止: f72a88a9e72f86a28b96a4e46dc684a20ad8762f

cloc ./

   11926 text files.
   11400 unique files.                                          
     958 files ignored.

github.com/AlDanial/cloc v 2.04  T=27.43 s (415.6 files/s, 61331.5 lines/s)
----------------------------------------------------------------------------------------
Language                              files          blank        comment           code
----------------------------------------------------------------------------------------
Java                                   9570         221822         455007         889459
AsciiDoc                                355          11685            844          39546
XML                                     675           3005           3541          20370
Text                                     68           1858              0           7997
Gradle                                  233           1050            357           5169
XSD                                      17            277            223           4118
SQL                                      54             49             52           2227
JSON                                     34              1              0           2219
HTML                                     34            400            210           1999
YAML                                     61            102             14            985
Properties                              210             93            560            897
Markdown                                  4            232              4            894
SVG                                       2              2             17            617
DTD                                       3            156            548            521
Bourne Shell                              3             84            354            311
AspectJ                                   9            102            449            266
Bourne Again Shell                        1             37             58            229
diff                                      5             47            176            221
DOS Batch                                 3             63              6            212
Groovy                                   16             54              4            126
Maven                                     5             17             35            121
XSLT                                      8             23              1             94
Freemarker Template                       5              4              4             37
JSP                                       4              3              0             35
CSS                                       6              3              0             15
JavaScript                                7              1              0             12
Protocol Buffers                          1              2              0             11
INI                                       1              5              0              8
Mustache                                  1              0              0              8
Python                                    1              1              0              4
Velocity Template Language                4              0              0              4
----------------------------------------------------------------------------------------
SUM:                                  11400         241178         462464         978732
----------------------------------------------------------------------------------------

🛠️ 安装

Gradle

推荐方式:buildSrc/build.gradle

plugins {
  id 'java-gradle-plugin'
}

repositories {
  mavenLocal()
  maven { url = "https://central.sonatype.com/repository/maven-snapshots/" }
  mavenCentral()
  gradlePluginPortal()
}

dependencies {
  implementation(platform("cn.taketoday:infra-bom:$infraVersion"))
  implementation "cn.taketoday:infra-gradle-plugin"
  
}

以上配置在 IDEA 里有代码提示。下面的配置则没有。

一般项目:settings.gradle

buildscript {
  repositories {
    mavenLocal()
    maven { url = "https://central.sonatype.com/repository/maven-snapshots/" }
    mavenCentral()
  }

  dependencies {
    classpath "cn.taketoday:infra-gradle-plugin:$infraVersion"
  }
}

以上两种配置用一种即可。

子模块 build.gradle

使用了上面的任何一种配置之后子模块就可以使用 apply plugin: 'infra.application' 来引入 Gradle 插件

apply plugin: "java"
apply plugin: 'infra.application'

repositories {
  mavenLocal()
  maven { url "https://central.sonatype.com/repository/maven-snapshots/" }
  maven { url "https://maven.aliyun.com/repository/public" }
  mavenCentral()
}

dependencies {
  implementation 'cn.taketoday:infra-starter-netty-server'
  implementation 'cn.taketoday:infra-starter-webmvc'
}

具体工程可以参见 infra-samples

Maven

<dependency>
  <groupId>cn.taketoday</groupId>
  <artifactId>infra-starter-webmvc</artifactId>
  <version>${infraVersion}</version>
</dependency>

<dependency>
  <groupId>cn.taketoday</groupId>
  <artifactId>infra-starter-netty-server</artifactId>
  <version>${infraVersion}</version>
</dependency>

开始

@Slf4j
@RestController
@InfraApplication
public class DemoApplication {

  public static void main(String[] args) {
    Application.run(DemoApplication.class, args);
  }

  @GET("/index")
  public String index() {
    return "Hello";
  }

  @GET("/body/{name}/{age}")
  public Body body(String name, int age) {
    return new Body(name, age);
  }

  @GET("/publish-event")
  public void index(String name, @Autowired ApplicationEventPublisher publisher) {
    publisher.publishEvent(new MyEvent(name));
  }

  @GET("/request-context")
  public String context(RequestContext context) {
    String requestURL = context.getRequestURL();
    String queryString = context.getQueryString();
    System.out.println(requestURL);
    System.out.println(queryString);

    return queryString;
  }

  record Body(String name, int age) {

  }

  @Configuration
  static class AppConfig {

    @EventListener(MyEvent.class)
    public void event(MyEvent event) {
      log.info("event :{}", event);
    }
  }

  record MyEvent(String name) {
    
  }

  @ExceptionHandler(Throwable.class)
  public void throwable(Throwable throwable) {
    throwable.printStackTrace();
  }

}

⚡ 性能表现

TODAY 框架在真实业务场景(带缓存的分页查询API)下,使用 wrk 工具进行了全面的压力测试。测试环境:Mac mini M4 Pro,48GB 内存,Java 25。

低并发 · 极致响应

模拟常规流量(10个并发连接),框架展现出微秒级的响应能力:

指标数值
平均延迟88.39 微秒 (µs)
P99 延迟136 微秒 (µs)
吞吐量 (QPS)116,481
测试命令wrk -t2 -c10 -d30s --latency

99.9% 的请求在 0.2 毫秒内完成,无任何连接错误。

高并发 · 超高吞吐

模拟极端流量(5000个并发连接),框架依然保持稳定:

运行模式QPS (吞吐量)平均延迟P99 延迟测试参数
传统 JVM155,2931.44 ms~5 ms-t20 -c5000 -d1m
Native Image145,5991.57 ms~6 ms-t20 -c5000 -d1m

在 5000 并发、百万级请求的压力下,平均延迟仍控制在 1.5 毫秒左右,错误率极低(<0.1%)。

性能解读

  • 低延迟极限:在常规负载下,请求可在 <0.1 毫秒 内完成,适合延迟敏感型应用(如游戏、实时通信)。
  • 高吞吐能力:单节点可支撑 15万+ QPS,轻松应对流量洪峰。
  • 双模式可选
    • JVM 模式:峰值性能略高,适合长期运行的服务。
    • Native Image 模式:启动时间 < 0.1 秒,内存占用 < 50 MB,同时仍保持 14.6万 QPS 的强劲性能,是 Serverless、边缘计算、容器化部署的理想选择。

如何复现测试?

# 克隆示例项目
git clone https://github.com/TAKETODAY/today-blog
cd today-blog

# 启动应用(JVM 模式)
./gradlew :blog-api:infraRun

# 低并发延迟测试
wrk -t2 -c10 -d30s --latency http://127.0.0.1:8080/api/articles?size=1

# 高并发吞吐测试
wrk -t20 -c5000 -d1m http://127.0.0.1:8080/api/articles?size=1

🙏 鸣谢

本项目的诞生离不开以下项目:

📄 开源协议

使用 Apache License 2.0 开源协议

  • Spring Framework & Spring Boot: 项目部分模块的设计思想与代码实现,源于对 Spring 生态的深度研究与现代化重构。我们严格遵守其 Apache License 2.0许可证,并在源码文件中保留了所有原始版权声明。
  • ASM Bytecode Manipulation Framework: 用于核心的字节码操作,遵循其BSD-3-Clause许可证。

由衷感谢上述团队和社区的开创性工作。本项目的所有修改与创新部分,均在上述原始许可证的条款下开源。

详细的法律声明,请参阅根目录的 NOTICE 文件。

如果这个项目对你有帮助,请给我们一个 ⭐️!你的认可是我们持续前进的动力。

FOSSA Status