工程项目里有很多小问题看起来零散:接口限流、上传并发控制、日志文件不输出、业务 ID 生成、字符串大小写和字符集。它们不一定值得单独成体系,但很适合沉淀成一张工程备忘清单。
限流先区分速率和并发
限流至少分两类:
- 速率限制:例如每秒最多 5 次。
- 并发限制:例如同一时间最多 4 个上传任务。
Guava RateLimiter 适合做速率限制:
RateLimiter limiter = RateLimiter.create(5.0);
if (limiter.tryAcquire()) {
// 执行业务逻辑
}
如果要限制“同时进行中的任务数量”,更适合用信号量:
Semaphore semaphore = new Semaphore(4);
if (semaphore.tryAcquire()) {
try {
upload();
} finally {
semaphore.release();
}
}
不要把这两类问题混在一起。
日志配置要兼顾 main 和 Spring Boot
有时直接运行 main 方法时,日志没有输出到文件。这通常和日志配置文件命名、加载路径和运行方式有关。
经验上:
- Spring Boot 项目常用
logback-spring.xml。 - 普通 main 或非 Spring Boot 场景更容易识别
logback.xml。 - 配置要确认 appender、rolling policy、日志目录和级别。
如果一个工具既会被 Spring Boot 调用,又会被 main 方法单独跑,最好明确日志配置加载方式,避免排障时看不到文件日志。
ID 生成关注三个特性
业务 ID 常见要求:
- 唯一性。
- 趋势递增或可排序。
- 不容易被猜到。
Snowflake 适合分布式趋势递增 ID,但它不是万能方案。要关注:
- 机器 ID 分配。
- 时钟回拨。
- 数据中心标识。
- 是否暴露业务增长量。
如果只是数据库主键,自增 ID 也许足够;如果是对外订单号,可能要再做混淆或独立编号。
Locale 处理大小写要小心
字符串大小写转换不要随手用默认 Locale。某些语言环境下,大小写规则可能和英语不同,导致 key、枚举、协议字段出现异常。
更稳的写法:
String normalized = value.toLowerCase(Locale.ROOT);
这类问题不常见,但一旦遇到会很隐蔽。
文件和字符集问题要留检查点
文件上传、PrintWriter 乱码、byte 数组和 String 转换,核心都是编码边界:
- 输入是什么编码。
- 输出是什么编码。
- HTTP Header 是否声明 charset。
- 文件内容和文件名是否分别处理。
- 日志里是否能看到原始字节或转码前后内容。
不要把乱码问题只归因于“中文不支持”,先把编码链路画出来。
实用结论
Java 工程杂项不杂,背后都是边界问题:限流区分速率和并发,日志区分运行入口,ID 区分内部和外部,大小写区分默认 Locale 和协议语义。把这些小坑沉淀成清单,后续项目会少走很多弯路。
正文完




