# small-common **Repository Path**: small-template/small-common ## Basic Information - **Project Name**: small-common - **Description**: 微服务通用服务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-29 - **Last Updated**: 2026-01-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # small-common 一个面向 Spring Boot 应用的通用二方包集合(Maven 多模块工程),提供:API 基础模型、国际化、线程池封装、缓存组件、事件(本地/分布式)以及 Dubbo 插件(Provider/Consumer)。 ## 模块一览 | 模块 | 作用 | 自动装配入口/加载方式 | |---|---|---| | `api-common` | API 基础模型、返回体、异常码、链路上下文、序列化与工具 | 无自动装配(按需引用) | | `i18n-common` | 国际化资源扫描、MessageSource、LocaleResolver、Header 语言切换 | Spring `@Configuration`(需被业务工程扫描/引入) | | `thread-pool-common` | 统一线程池封装、任务提交前后扩展点、默认线程池工具 | `META-INF/spring.factories`: `com.zh.thread.config.ThreadPoolAutoConfiguration` | | `cache-common` | 本地缓存(Guava)+ 分布式缓存(Redis)与二级缓存抽象 | `AutoConfiguration.imports`: `com.zh.cache.config.CacheAutoConfiguration` | | `event-common` | 本地事件总线 + RocketMQ 分布式事件总线 | `AutoConfiguration.imports`: `com.zh.event.config.EventAutoConfiguration` | | `lock-common` | 统一锁管理(本地锁 + Redisson 分布式锁) | 无自动装配(按需引用;业务侧提供 RedissonClient) | | `dubbo-plugin-*` | Dubbo Provider/Consumer 插件与通用配置 | `AutoConfiguration.imports`: `DubboProviderAutoConfiguration` / `DubboConsumerAutoConfiguration` | | `demo-common/*` | 演示工程(示例 Controller/Handler/启动类) | 仅用于演示,不建议依赖到业务 | ## 快速开始(依赖引入) 业务工程按需引入模块依赖(示例): ```xml com.zh event-common 1.0-SNAPSHOT ``` ## api-common **用途** - API 基础 DTO:请求/响应抽象(REST/RPC)、分页参数、客户端信息等 - 通用异常与错误码:`ResponseCode`(支持国际化脚本)、通用枚举 - 线程链路上下文:`TraceContext`(ThreadLocal traceId) - 序列化与工具:`ProtoStuffSerializerUtils`、日期工具等 **核心类** - `TraceContext`:[TraceContext.java](file:///Users/zhanghang/code/gitee/small-template/small-common/api-common/src/main/java/com/zh/api/context/TraceContext.java) - `ResponseCode`:[ResponseCode.java](file:///Users/zhanghang/code/gitee/small-template/small-common/api-common/src/main/java/com/zh/api/bean/ResponseCode.java) - `RestResponse`:[RestResponse.java](file:///Users/zhanghang/code/gitee/small-template/small-common/api-common/src/main/java/com/zh/api/rest/dto/RestResponse.java) - `RPCResponse`:[RPCResponse.java](file:///Users/zhanghang/code/gitee/small-template/small-common/api-common/src/main/java/com/zh/api/rpc/dto/RPCResponse.java) - `ProtoStuffSerializerUtils`:[ProtoStuffSerializerUtils.java](file:///Users/zhanghang/code/gitee/small-template/small-common/api-common/src/main/java/com/zh/api/utils/serializer/ProtoStuffSerializerUtils.java) **使用示例** ```java import com.zh.api.context.TraceContext; import com.zh.api.rest.dto.RestResponse; public class Demo { public RestResponse ping() { TraceContext.setTraceId("trace-xxx"); return RestResponse.success("ok"); } } ``` ## i18n-common **用途** - 统一国际化消息获取:扫描 classpath 下 `small-message-*.properties` 并构造 `MessageSource` - 统一语言切换:基于 Header 的 `LocaleChangeInterceptor`(`Accept-Language` 或 `Lang`) - 兼容错误码脚本模式:`ResponseCode` 使用 `|key|` 组合脚本取国际化文本 **关键实现** - MVC 配置与拦截器注册:[I18nConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/i18n-common/src/main/java/com/zh/i18n/config/I18nConfiguration.java) - 国际化工具类(扫描资源、缓存、静态取值):[I18nMessageUtil.java](file:///Users/zhanghang/code/gitee/small-template/small-common/i18n-common/src/main/java/com/zh/i18n/utils/I18nMessageUtil.java) - Header 语言拦截器:[HeaderLocaleChangeInterceptor.java](file:///Users/zhanghang/code/gitee/small-template/small-common/i18n-common/src/main/java/com/zh/i18n/handler/HeaderLocaleChangeInterceptor.java) **配置项** - `i18n.default.language`:默认语言(默认 `zh`) **使用方式** - 方式 A:业务工程扫描到 `com.zh.i18n.config.I18nConfiguration`(例如主启动类 `@SpringBootApplication(scanBasePackages=...)` 覆盖到该包) - 方式 B:业务工程显式 `@Import(I18nConfiguration.class)` 运行期从 Header 指定语言: - `Accept-Language: en` - 或 `Lang: en` 代码内获取消息: ```java import com.zh.i18n.utils.I18nMessageUtil; String msg = I18nMessageUtil.getMessage("test.welcome"); ``` ## thread-pool-common **用途** - 统一线程池封装:支持默认线程池、创建自定义线程池 - 任务上下文扩展点:提交前/执行前/完成后钩子(可用于 traceId、用户上下文透传等) **自动装配入口** - Spring Boot 通过 `spring.factories` 加载:[ThreadPoolAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/thread-pool-common/src/main/java/com/zh/thread/config/ThreadPoolAutoConfiguration.java) **配置项(绑定到 `thread-pool.*`)** - `thread-pool.corePoolSize`(默认 10) - `thread-pool.maximumPoolSize`(默认 20) - `thread-pool.keepAliveTime`(默认 60) - `thread-pool.unit`(默认 `SECONDS`) - `thread-pool.workQueueSize`(默认 100) - `thread-pool.customName`(默认 `default-thread-pool`) **使用示例** 使用默认线程池工具类提交任务: ```java import com.zh.thread.pool.DefaultThreadPoolUtil; DefaultThreadPoolUtil.execute(() -> { // do something }); ``` 创建自定义线程池: ```java import com.zh.thread.config.ThreadPoolConf; import com.zh.thread.factory.ThreadPoolFactory; ThreadPoolConf conf = new ThreadPoolConf(); conf.setCorePoolSize(4); conf.setMaximumPoolSize(8); conf.setCustomName("biz-pool"); ThreadPoolFactory.create(conf).executeTask(() -> {}); ``` 扩展点(线程包装器): - 抽象定义:[AbstractThreadWrapper.java](file:///Users/zhanghang/code/gitee/small-template/small-common/thread-pool-common/src/main/java/com/zh/thread/wrapper/AbstractThreadWrapper.java) - 通过 SPI 文件 `META-INF/services/com.zh.thread.wrapper.AbstractThreadWrapper` 注册实现类后,执行任务会自动触发包装器生命周期。 ## cache-common **用途** - 本地缓存(Guava):`LocalCacheService` - 分布式缓存(Redis):`DistributedCacheService`(默认实现 `RedisCacheService`) - 二级缓存抽象:`AbstractCacheService` 统一“本地 -> 分布式 -> 回源 -> 回写”的读路径 **自动装配入口** - [CacheAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/cache-common/src/main/java/com/zh/cache/config/CacheAutoConfiguration.java) - 默认配置文件会被加载:`classpath:cache-application.properties` **配置项(常用)** - 本地缓存 - `local.cache.type`:本地缓存实现(默认 `guava`) - `local.cache.maxSize`:最大缓存数量(默认 1000) - `local.cache.expire`:过期时间(默认 30) - `local.cache.expireUnit`:过期单位(默认 `SECONDS`) - `local.cache.enable`:是否开启本地二级缓存(`AbstractCacheService` 使用,默认 `false`) - 分布式缓存 - `distributed.cache.type`:分布式缓存实现(默认 `redis`) - `distributed.cache.timeout`:分布式缓存 TTL(`AbstractCacheService` 使用,默认 3600 秒) - Redis 连接(默认值在 `cache-application.properties`,生产请覆盖) - `spring.redis.host` / `spring.redis.port` / `spring.redis.password` / `spring.redis.database` 等 **使用建议** - 直接注入 `DistributedCacheService` / `LocalCacheService` 作为通用能力 - 业务侧建议继承 `AbstractCacheService`,只关注 key 规划与回源逻辑 ## event-common **用途** - 本地事件:进程内发布订阅(同步/异步),用于同进程解耦 - 分布式事件:基于 RocketMQ 发布/消费,跨服务传播领域事件 **自动装配入口** - [EventAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/config/EventAutoConfiguration.java) - 默认配置文件会被加载:`classpath:event-application.properties` ### 本地事件(Local) 核心组件: - 本地事件总线与管理器:[LocalEventBus.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/local/LocalEventBus.java)、[LocalEventBusManager.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/local/LocalEventBusManager.java) - 自动装配:[LocalEventAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/config/LocalEventAutoConfiguration.java) 接入方式: - 定义事件模型(继承 `LocalDomainEvent`) - 实现 `LocalEventHandler`(Spring Bean),会自动注册到 `LocalEventHub` - 通过 `LocalEventBusManager` 发送(同步/异步/返回结果) ### 分布式事件(Distribute / RocketMQ) 核心组件: - 事件总线(发送):[DistributeEventBus.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/distribute/DistributeEventBus.java) - 消费者(默认):[DistributeDomainEventConsumer.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/distribute/consumer/DistributeDomainEventConsumer.java) - 处理器接口与分发中心:[DistributeEventHandler.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/distribute/handler/DistributeEventHandler.java)、[DistributeEventHub.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/distribute/DistributeEventHub.java) - 自动装配:[DistributeEventAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/src/main/java/com/zh/event/config/DistributeEventAutoConfiguration.java) 外部依赖与版本要求: - 使用 `org.apache.rocketmq:rocketmq-spring-boot-starter` 作为客户端封装,当前版本在 [`event-common/pom.xml`](file:///Users/zhanghang/code/gitee/small-template/small-common/event-common/pom.xml#L14-L34) 中定义为 `2.2.2`,对应 RocketMQ 4.x 客户端。 - 建议安装/使用 RocketMQ 4.x 系列服务端(如 4.9.x);若使用 RocketMQ 5.x,请确保以兼容 4.x 协议的方式部署(保留 NameServer + Broker),本组件暂未启用 `rocketmq-v5-client-spring-boot-starter`。 - 若业务工程已直接依赖 RocketMQ 相关 starter/client,请通过 Maven `dependencyManagement` 统一版本,避免 `rocketmq-spring-boot-starter` 版本不一致导致的类冲突。 - 运行分布式事件至少需要可用的 NameServer 与 Broker(默认 NameServer 端口 9876);`rocketmq.name-server` 必须能被业务应用访问到。 **配置项(常用)** - `rocketmq.name-server`:RocketMQ NameServer 地址(默认 `localhost:9876`,生产需覆盖) - `rocketmq.producer.group`:Producer Group(业务侧建议显式配置,用于发送端实例化与链路追踪等能力) - `domain.event.topic`:分布式事件 topic(默认 `domain_event_topic`) - `domain.event.tags`:消费者 tag 过滤(默认 `*`) - `domain.event.groupId`:消费者组(默认 `${spring.application.name}`;未读取到默认配置时会回退到 `default_event_group`) - `domain.event.consumer`:是否启用默认消费者 Bean(默认 `true`) - `domain.event.bus`:是否启用发送(当前实现未按该开关做条件化,业务可自行控制是否调用总线) **使用示例(生产侧建议)** 1) 定义事件(继承 `DistributeDomainEvent`) 2) 编写处理器(实现 `DistributeEventHandler`,交给 Spring 管理) 3) 注入 `DistributeEventBus` 并发布事件 演示代码可参考: - 发布:[DistributeEventController.java](file:///Users/zhanghang/code/gitee/small-template/small-common/demo-common/event-demo-common/src/main/java/com/zh/event/controller/DistributeEventController.java) - 处理器:[DistributeUserEventHandler.java](file:///Users/zhanghang/code/gitee/small-template/small-common/demo-common/event-demo-common/src/main/java/com/zh/event/handler/DistributeUserEventHandler.java) ## dubbo-plugin(provider / consumer / common) **用途** - Provider:扫描接口/服务并发布到注册中心 - Consumer:按接口生成 Dubbo 代理并注入到 Spring - common:统一 Dubbo 配置绑定与上下文持有(如 trace/locale) **自动装配入口** - Consumer:[DubboConsumerAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/dubbo-plugin/dubbo-plugin-consumer/src/main/java/com/zh/dubbo/consumer/DubboConsumerAutoConfiguration.java) - Provider:[DubboProviderAutoConfiguration.java](file:///Users/zhanghang/code/gitee/small-template/small-common/dubbo-plugin/dubbo-plugin-provider/src/main/java/com/zh/dubbo/config/DubboProviderAutoConfiguration.java) - 配置绑定:[DubboProperties.java](file:///Users/zhanghang/code/gitee/small-template/small-common/dubbo-plugin/dubbo-plugin-common/src/main/java/com/zh/dubbo/common/DubboProperties.java)(`dubbo.*`) **默认配置文件** - Consumer:`classpath:dubbo-consumer-application.properties`(配置了 `dubbo.registry.address=nacos://localhost:8848` 等) - Provider:`classpath:dubbo-provider-application.properties`(配置了 `dubbo.provider.scan-packages`、协议端口等) **Consumer 使用示例(推荐:注册为 Spring Bean)** ```java import com.zh.dubbo.consumer.ServiceSubscriber; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DubboConsumerConfig { private final ServiceSubscriber subscriber; public DubboConsumerConfig(ServiceSubscriber subscriber) { this.subscriber = subscriber; } @Bean public com.zh.api.facade.ProviderDemoService providerDemoService() { return subscriber.consumer(com.zh.api.facade.ProviderDemoService.class) .group("DEFAULT_GROUP") .version("1.0.0") .subscribe(); } } ``` **Provider 侧说明** - Provider 侧会读取 `dubbo.provider.scan-packages` 扫描要发布的接口包,并由发布器在 Spring 上下文刷新后发布服务。 更完整的设计说明可参考仓库内文档: - [dubbo-设计文档.md](file:///Users/zhanghang/code/gitee/small-template/small-common/dubbo-plugin/dubbo-设计文档.md) ## lock-common **用途** - 本地锁:进程内互斥,适用于单实例或单 JVM 场景 - 分布式锁:基于 Redisson(Redis)实现跨实例互斥 外部依赖与接入要求: - 分布式锁提供通用接口:[DistributedLockClient.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/distribute/DistributedLockClient.java)、[DistributedLock.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/distribute/DistributedLock.java) - Redisson 为默认实现:[RedissonLockUtil.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/distribute/RedissonLockUtil.java),业务侧需提供 `org.redisson.api.RedissonClient`;本模块不主动自动装配 RedissonClient。 - `lock-common` 内置 Redisson 依赖版本:`3.17.6`(如业务侧已引入 Redisson,请统一版本,避免冲突) **本地锁(local)** - 锁工厂:[LocalLockFactory.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/local/LocalLockFactory.java) 使用示例: ```java import com.zh.lock.local.LocalLockFactory; import java.util.concurrent.locks.Lock; LocalLockFactory factory = new LocalLockFactory(); Lock lock = factory.getLock("order:123"); lock.lock(); try { // critical section } finally { lock.unlock(); } ``` **分布式锁(distribute)** - 通用接口:[DistributedLockClient.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/distribute/DistributedLockClient.java) - Redisson 实现:[RedissonLockUtil.java](file:///Users/zhanghang/code/gitee/small-template/small-common/lock-common/src/main/java/com/zh/lock/distribute/RedissonLockUtil.java) 使用示例(业务侧需自行提供 `RedissonClient`): ```java import com.zh.lock.distribute.RedissonLockUtil; import org.redisson.api.RedissonClient; import java.util.concurrent.TimeUnit; RedissonClient redissonClient = null; RedissonLockUtil lockUtil = new RedissonLockUtil(redissonClient); lockUtil.runWithLock("order:123", 1, 10, TimeUnit.SECONDS, () -> { // critical section }); ```