# spring-ultron
**Repository Path**: brucewuu/spring-ultron
## Basic Information
- **Project Name**: spring-ultron
- **Description**: 在基于Spring boot/cloud的微服务项目中,要创建若干module,每个module都要依赖Redis、mybatis和一些基础工具类等等,本项目就是为了简化Spring boot的配置,在自己项目中提炼出来的公共服务配置和工具,简化大型项目的开发依赖; 无论是基于Spring boot的单体应用架构还是基于Spring Cloud的微服务应用架构,均提供模块化支持。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2019-11-12
- **Last Updated**: 2025-06-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 前言
在基于Spring boot/cloud的微服务项目中,要创建若干module,每个module都要依赖Redis、mybatis和一些基础工具类等等,本项目就是为了简化Spring boot的配置,在自己项目中提炼出来的公共服务配置和工具,简化大型项目的开发依赖;
无论是基于Spring boot的单体应用架构还是基于Spring Cloud的微服务应用架构,均提供模块化支持。
### Ultron
本项目命名SpringUltron,灵感来自复仇者联盟2:奥创纪元,奥创是一个强大的人工智能机器人,希望本项目越来越强大,基于更多的自动化配置和抽象,能在项目开发中节约更多的时间;
按功能拆分了N多模块,可以按需依赖,减少打包代码
[](https://996.icu)
[](http://www.apache.org/licenses/ "Feel free to contribute.")
## 项目结构
```shell
*├── spring-ultron 项目父级目录
├── spring-ultron-dependencies 依赖版本统一管理
├── spring-ultron-projects 核心模块工程
├── ultron-boot Spring boot脚手架,servlet/reactive全局异常捕获、基于aop的注解API日志打印(支持配置文件配置日志开关,日志内容等)、WebClient http客户端封装
├── ultron-cloud Spring cloud脚手架(基于Spring Cloud Alibaba)
├── ultron-core 核心库(请求统一返回体、常用错误代码、自定义业务异常、Jackson序列化/反序列化配置、常用工具类等)
├── ultron-logging logback 的日志扩展;支持输出到ELK;链路追踪
├── ultron-crypto 对称及非对称加密解密工具,实现了:AES、DES、RSA、国密SM2、SM4等;以及各种秘钥生成工具
├── ultron-mybatis mybatis plus自动化配置、分页工具等
├── ultron-qrcode 二维码生成、美化、识别
├── ultron-redis Redis自动化配置、操作客户端;基于Redis的Spring Cache配置
├── ultron-redis-lock 基于Redis的分布式锁
├── ultron-caffeine 基于Caffeine的Spring Cache配置(默认定义了四个不同过期时间的缓存空间)
├── ultron-captcha 图形验证码生成和校验
├── ultron-http 基于OKhttp3封装的http客户端,Fluent语法风格,使用非常简便
├── ultron-openfeign openfeign集成sentinel限流,熔断降级
├── ultron-security Spring Security通用配置,支持jwt登录鉴权,RBAC权限控制
├── ultron-swagger Swagger文档自动化配置(可在配置文件中开启/关闭,支持http basic认证)
├── ultron-xxl-job xxl-job集成
├── ultron-wechat 微信开发工具包
```
## 使用步骤
### 第一步,下载本项目
git clone https://github.com/brucewuu520/spring-ultron.git
### 第二步,编译安装本项目
mvn clean install --项目会编译安装到本地maven仓库
### 第三步,在自己的工程按需添加依赖库
1、在项目parent pom.xml中添加:
2.0.0
1.8
org.springultron
spring-ultron-dependencies
${spring-ultron.version}
pom
import
2、核心库(请求统一返回体、常用错误代码、自定义业务异常、Jackson序列化/反序列化配置、常用工具类等)
org.springultron
ultron-core
统一返回体使用示例:
@GetMapping("/test")
public ApiResult> test() {
Test test = new Test();
return ApiResult.success(test); // or return ApiResult.fail(ResultCode.PARAM_VALID_FAILED);
}
自定义异常使用:
@GetMapping("/test")
public ApiResult> test() {
if (true) {
ApiResult.throwFail(ResultCode.API_EXCEPTION);
}
return ApiResult.apiException(new ServiceException("操作异常"));
}
自定义错误状态码枚举类实现IResultCode接口,即可使用 ApiResult.fail(IResultCode)返回错误信息
Jackson配置序列化和反序列化支持java8 Time
3、ultron-crypto 对称及非对称加密/解密/签名/验签工具,实现了:AES、DES、RSA、国密SM2、SM4等;以及各种秘钥生成工具
org.springultron
ultron-crypto
部分加解密算法实现(如:国密SM2、SM4)需添加BC库依赖:
org.bouncycastle
bcprov-jdk15on
${bouncycastle.version}
使用示例见单元测试
4、mybatis plus自动化配置、分页工具等
org.springultron
ultron-mybatis
分页工具使用示例:
PageQuery query = new PageQuery();
query.setCurrent(1);
query.setSize(10);
String[] asces = new String[] {"sort", "order"};
query.setAscs(asces);
IPage page = PageUtils.getPage(query);
5、Redis自动化配置、操作客户端
org.springultron
ultron-redis
Redis操作客户端使用示例:
@Autowired
private RedisClient redisClient;
redisClient.setString("key", "value", Duration.ofSeconds(120))
Object obj = new Object();
redisClient.set("key", obj, Duration.ofSeconds(120))
...
Redis反应式客户端使用:
添加依赖:
org.springframework.boot
spring-boot-starter-webflux
@Autowired
private ReactiveRedisClient reactiveRedisClient;
Mono result = reactiveRedisClient.setString("key", "value", Duration.ofSeconds(120))
Object obj = new Object();
Mono result = reactiveRedisClient.set("key", obj, Duration.ofSeconds(120))
Spring cache 扩展cache name 支持 # 号分隔 cache name 和 超时 ttl(默认单位秒)。使用示例:
@Cacheable(value = "user_cache#30m", key = "#id")
public String findUserById(Serializable id) {
log.info("selectById");
return "selectById:" + id;
}
6、Spring boot脚手架,servlet/全局异常捕获、基于aop的注解API日志打印(支持配置文件配置日志开关,日志内容等)、WebClient http客户端封装
org.springultron
ultron-boot
请求日志使用示例(不支持reactive运行环境):
@ApiLog(description = "用户登录")
@GetMapping("/login")
public ApiResult> login() {
UserDTO userDTO = new UserDTO();
...
return ApiResult.success(userDTO, "登录成功");
}
请求日志配置(配置文件添加):
ultron:
log:
enable: true # 开启ApiLog打印
level: headers # 打印包括请求头 none/body
WebClient http客户端使用示例:
需添加依赖:
org.springframework.boot
spring-boot-starter-webflux
使用示例:
Map params = Maps.newHashMap(3);
params.put("id", 108);
params.put("name", "张三");
params.put("age", 23);
Mono mono = WebClientUtil.postJSON("https://xxx", params, JSONObject.class)
异步任务线程池配置:
ultron:
async:
core-pool-size: 3 # 核心线程数,默认:3
max-pool-size: 300 # 线程池最大数量,默认:300
queue-capacity: 30000 # 线程池队列容量,默认:30000
keep-alive-seconds: 300 # 空闲线程存活时间,默认:300秒
7、Spring cloud脚手架(基于Spring cloud Hoxton、Spring cloud alibaba 2.2.0)
org.springultron
ultron-cloud
默认集成了sentinel熔断限流,支持传统servlet和reactive,统一配置熔断/限流的异常返回值
负载均衡的http客户端使用(基于ReactorLoadBalancerExchangeFilterFunction的反应式负载均衡器,性能比RestTemplate要好得多):
添加依赖:
org.springframework.boot
spring-boot-starter-webflux
@Autowire
private WebClient lbWebClient;
8、Swagger 接口文档
org.springultron
ultron-swagger
文档配置(配置文件中添加):
swagger:
enable: true # 默认
title: xxx服务
description: xxx服务接口文档
contact-user: brucewuu
contact-email: xxx@xxx.com
contact-url: xxx
authorization:
enabled: true
name: BearerToken
header-name: Authorization
knife4j:
production: false
basic:
enable: true
username: admin
password: 123456
9、Spring Security通用配置,支持jwt登录鉴权,RBAC权限控制
org.springultron
ultron-security
10、ultron-http 使用示例
org.springultron
ultron-http
使用示例(同步):
JSONObject result = HttpRequest.get("https://xxx")
.query("name1", "value1")
.query("name2", "value2")
.log()
.execute()
.asObject(JSONObject.class);
Map params = Maps.newHashMap(3);
params.put("id", 108);
params.put("name", "张三");
params.put("age", 23);
Map result = HttpRequest.post("https://xxx")
.bodyValue(params)
.log()
.execute()
.asMap();
异步示例:
HttpRequest.get("https://xxx")
.query("name1", "value1")
.query("name2", "value2")
.async()
.success(responseSpec -> {
JSONObject result = responseSpec.asObject(JSONObject.class);
})
.fail(((request, e) -> {
log.error("请求失败", e);
}))
.execute()
11、ultron-logging 使用示例
若开启logstash必须添加下面依赖:
net.logstash.logback
logstash-logback-encoder
ultron:
logging:
close-console: true -关闭控制台日志输出
close-file: false - 关闭文件日志输出
logstash:
enabled: true -开启logstash
destinations: localhost:4560,localhost:4561
开启链路追踪:
启动类上配置 @EnableTraceId 注解,配置文件添加如下配置:
logging.pattern.console="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr([%X{traceId}]){yellow} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n"
logging.pattern.file="%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] [%X{traceId}] %-40.40logger{39} : %m%n"
12、图形验证码使用
org.springultron
ultron-captcha
@Autowired
private CaptchaService captchaService
String code = captchaService.generateBase64(uuid)
boolean checkResult = captchaService.validate(uuid,userInputCaptcha)
自定义缓存:
继承CaptchaCache实现自己的缓存实现,注入CaptchaCache bean覆盖默认的bean
13、ultron-caffeine 缓存使用
org.springultron
ultron-caffeine
添加注解:@EnableCaching开启缓存
ultron-caffeine默认配置了四个不同过期时间的缓存空间:
1、cacheNames=FIVE_SECOND(过期时间5分钟)
2、cacheNames=THIRTY_SECOND(过期时间30分钟)
3、cacheNames=TWO_HOUR(过期时间2小时)
4、cacheNames=A_WEEK(过期时间7天)
同时也可以配置Spring cache的缓存配置:
spring:
cache:
cache-names: my_cache
type: caffeine
caffeine:
spec: maximumSize=1024,expireAfterWrite=60s
@Cacheable(value = "FIVE_SECOND", key = "#id")
public String findUserById(Serializable id) {
log.info("selectById");
return "selectById:" + id;
}
@Autowired
private CacheManager cacheManager;
public String findUserById(Serializable id) {
log.info("selectById");
String value = cacheManager.getCache(CaffeineCacheEnum.FIVE_SECOND.getName()).get(id, String.class);
return "selectById:" + id;
}
14、微信开发工具包
org.springultron
ultron-wechat
公众号配置:
wechat:
wx-conf:
app-id: xxx
app-secret: xxx
token: xxx
encoding-aes-key: xxx
encrypt-message: true
小程序配置:
wechat:
wxa-conf:
app-id: xxx
app-secret: xxx
token: xxx
encoding-aes-key: xxx
encrypt-message: true
公众号:
@Autowired
private WxApiService wxApiService;
消息接收:
@RestController
@RequestMapping("/wechat")
public class WechatMessageController extends WxMsgControllerAdapter {
@Override
protected void processTextMsg(InTextMsg textMsg) {
log.info(Jackson.toJson(textMsg));
renderOutTextMsg(textMsg, "欢迎关注");
}
@Override
protected void processFollowEvent(InFollowEvent followEvent) {
renderDefault();
}
@Override
protected void processMenuEvent(InMenuEvent menuEvent) {
renderDefault();
}
}
小程序:
@Autowired
private WxaApiService wxaApiService;
消息接收:
@RestController
public class MessageController extends WxaMsgController {
@Override
protected void processTextMsg(WxaTextMsg textMsg) {
}
@Override
protected void processImageMsg(WxaImageMsg imageMsg) {
}
@Override
protected void processMiniProgramPageMsg(WxaMiniProgramPageMsg miniProgramPageMsg) {
}
@Override
protected void processUserEnterSessionMsg(WxaUserEnterSessionMsg userEnterSessionMsg) {
}
@Override
protected void processUnknownMsg(WxaUnknownMsg unknownMsg) {
}
}
## 更新日志
* 2.0版本基于Spring boot 2.2.x
* 1.0版基于Spring boot 2.1.x 请切换分支1.x
## 鸣谢
感谢 [Mica](https://github.com/lets-mica/mica),有些工具类和配置参考了mica
## 许可证
[Apache License 2.0](https://github.com/brucewuu520/spring-ultron/blob/master/LICENSE)
Copyright (c) 2019-2020 brucewuu