Clay 的技术空间

用进废退 | 艺不压身

前言

初始化数据库

在 MySQL 执行 XXL-JOB GitHub 仓库中的 SQL 初始化脚本,初始化完成后一共有 8 张表

表名称描述
xxl_job_group 执行器信息表,用于维护任务执行器的信息
xxl_job_info 调度扩展信息表,用于存储调度任务的扩展信息,比如任务分组、任务名、机器的地址等
xxl_job_lock 任务调度锁表
xxl_job_log 日志表,用于存储任务调度的历史信息,例如调度结果、执行结果、调度入参等
xxl_job_log_report 日志报表,用于存储任务调度的日志报表,会在调度中心里的报表功能里使用到
xxl_job_logglue 任务的 GLUE 日志,用于存储 GLUE 日志的更新历史变化,支持 GLUE 版本的回溯功能
xxl_job_registry 执行器的注册表,用在维护在线的执行器与调度中心的地址信息
xxl_job_user 系统的用户表,可以用表中默认的用户名与密码进行登录
阅读全文 »

大纲

前言

什么是任务调度

任务调度就是我们常说的定时任务,定时任务是指在指定时间、指定的频率去执行任务(业务代码)。任务调度是日常开发中非常常见的一个业务场景,我们经常需要去运行一些的周期性、指定时间点等方式自动触发的异步业务逻辑。

集中式任务调度

集中式任务是与分布式任务恰好相反的概念,集中式任务就是单机任务,一个项目,一台机器,也就是我们常说的单体应用。对于集中式任务,也就是我们 Java 开发中常见的定时任务。

阅读全文 »

大纲

前言

在 Java 中,Fork/Join 框架(分支合并框架)是一种用于并行处理任务的强大工具,特别适用于那些可以递归地分解成更小任务的场景(如下图所示)。Fork/Join 框架基于 “工作窃取” 算法,允许空闲的线程从那些繁忙的线程那里窃取任务,以提高 CPU 的使用效率和程序的执行性能。

阅读全文 »

前言

为了实现不同环境构建的不同需求,这里使用到了 Maven 的 Profile 特性。因为 Profile 能够在构建时修改 POM 的一个子集,或者添加额外的配置元素。接下来将介绍 Maven 中对 Profile 的配置和激活。

阅读全文 »

前言

Java 中有 3 种主要的 I/O 模型:同步阻塞 I/O(BIO)、同步非阻塞 I/O(NIO)和异步非阻塞 I/O(AIO),除了这 3 种主要的 I/O 模型,还有多路复用 I/O 模型和信号驱动模型。它们的区别主要在于处理 I/O 操作时线程的行为方式,以及应用程序对于 I/O 完成时的处理方式。

I/O 模型介绍

I/O 模型的简介

  • 同步阻塞 I/O 模型(Blocking I/O,简称阻塞 I/O)是 Java 最早引入的模型之一,它的特点是在执行 I/O 操作时会阻塞当前线程,直到 I/O 操作完成才会继续执行后续代码。在同步阻塞 I/O 模型中,当一个线程调用读取操作时,如果没有数据可读,线程将一直阻塞在读取操作上,直到有数据到达为止。同样,当一个线程调用写入操作时,如果写缓冲区已满,线程将一直阻塞在写入操作上,直到有空间可用为止。同步阻塞 I/O 模型的优点是简单易用,但其缺点是效率较低,不适用高并发场景,因为线程在等待 I/O 操作完成时会被阻塞,无法处理其他任务。

  • 同步非阻塞 I/O 模型(Non-blocking I/O,简称非阻塞 I/O)是对同步阻塞 I/O 模型(BIO)的改进,从 Java 1.4 开始支持。在同步非阻塞 I/O 模型中,当一个线程调用读取操作时,如果没有数据可读,线程不会被阻塞,而是立即返回一个错误码或空值。同样,当一个线程调用写入操作时,如果写缓冲区已满,线程也不会被阻塞,而是立即返回一个错误码。通过不断地轮询 I/O 操作的状态,同步非阻塞 I/O 模型可以实现在等待 I/O 操作完成的同时处理其他任务。同步非阻塞 I/O 模型的优点是能够提高系统的并发性能,但其缺点是需要频繁地轮询 I/O 操作的状态,会造成 CPU 资源的浪费,而且实现相对复杂,需要一定的编程技巧。这种模型适用于需要处理多个连接但每个连接比较短(轻操作)的场景,如实时通讯系统、聊天服务器等。

  • 多路复用 I/O 模型(Multiplexing I/O)可以实现同时监控多个 I/O 操作的状态。Java 中的多路复用 I/O 一般是建立在同步非阻塞 I/O 模型(NIO)基础之上实现的,比如 Netty 网络编程框架。在多路复用 I/O 模型中,一个线程可以同时监听多个 I/O 操作的状态,当某个 I/O 操作就绪时,线程可以进行相应的读取或写入操作。通过这种方式,多路复用 I/O 模型可以在一个线程中处理多个 I/O 操作,提高系统的并发性能。多路复用 I/O 模型的优点是能够有效地减少线程的数量,降低系统资源的消耗,但其缺点是实现复杂度较高,需要一定的编程技巧。

  • 异步非阻塞 I/O 模型(Asynchronous I/O,简称异步 I/O)是最高级别的 I/O 模型之一,性能和吞吐量最高,从 Java 1.7 开始支持。它通过将 I/O 操作的结果通知给应用程序,来实现非阻塞的 I/O 操作。在异步非阻塞 I/O 模型中,应用程序发起一个 I/O 操作后,不需要等待操作完成,而是可以继续执行其他任务。当 I/O 操作完成后,操作系统会通知应用程序,应用程序再进行相应的处理。异步非阻塞 I/O 模型的优点是能够充分利用系统资源,提高系统的并发性能,但其缺点是需要操作系统的支持,在某些操作系统(如 Windows)上的支持不如 NIO 成熟,对于编程人员来说,实现相对复杂。这种模型适用于需要处理多个连接且每个连接比较长(重操作),并且要求高性能、高并发的场景,例如高性能服务器、流媒体服务器等。

阅读全文 »

大纲

JVM 简单介绍

JVM 内存结构

JVM 内存结构主要有三大块:栈、堆内存、方法区。堆内存是 JVM 中最大的一块。方法区存储类信息、静态变量、常量、常量池等数据,是线程共享的区域,为了与 Java 堆区分,方法区还有一个别名 Non-Heap (非堆)。栈又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。

阅读全文 »

SpringBoot 3 版本

2022 年 11 月 24 日,SpringBoot 3.0 正式发布了。此版本包含了 12 个月以来 151 个人的 5700 多次 Commit 的工作结晶。这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本。

新变化

  • 支持响应式编程
  • 支持 Spring Framework 6.0
  • 支持 GraalVM native images
  • Spring 自身与第三方包版本升级
  • 最低支持 JDK 17,最高支持 JDK 19
  • 从 Java EE API (Javax) 迁移到 Jakarta EE API
  • 自动配置的包位置变化
    • 旧版本: META-INF/spring.factories
    • 新版本: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
阅读全文 »

大纲

前言

性能指标

  • RT (Response Time):用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。
  • HPS (Hits Per Second):每秒点击的次数,单位是次 / 秒。
  • TPS (Transaction per Second):系统每秒处理交易 (事务) 的笔数,单位是笔 / 秒。
  • QPS (Query per Second):系统每秒处理查询的次数,单位是次 / 秒。
阅读全文 »

大纲

前言

本文主要介绍 Java 的五种代理实现方式,包括 JDK 动态代理、Cglib、ASM、Javassist、Byte Buddy,点击 下载完整的案例代码。

准备工作

先定义出一个接口和相应的实现类,方便后续使用代理类在方法中添加日志信息。

  • 接口
1
2
3
4
5
public interface IUserApi {

String queryUserInfo();

}
阅读全文 »

大纲

静态代理的介绍

静态代理是 Java 中的一种设计模式,用于为目标对象提供额外的功能或控制访问目标对象的操作。它的基本思想是通过创建一个代理类,代理类具有与目标对象相同的接口或方法,并在代理类的方法中调用目标对象的对应方法。代理类可以在调用目标对象方法的前后添加额外的逻辑,比如权限检查、日志记录、事务处理等。

阅读全文 »