add: jetcache、flyflow、重发、限流

This commit is contained in:
2023-08-15 11:16:43 +08:00
parent 78b9f393e1
commit 1ae39af607
10 changed files with 7167 additions and 31 deletions

View File

@@ -31,6 +31,34 @@
<configuration.version>1.9</configuration.version>
</properties>
<dependencies>
<!--重试-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<!--限流-->
<dependency>
<groupId>io.github.forezp</groupId>
<artifactId>distributed-limit-core</artifactId>
<version>1.0.4</version>
</dependency>
<!--引入flyway-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.1.0</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>9.21.1</version>
</dependency>
<!--反射-->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
<!-- https://onew.me/logback/2018/09/17/logback_win.html-->
<dependency>
<groupId>org.fusesource.jansi</groupId>
@@ -43,11 +71,17 @@
<artifactId>annotations</artifactId>
<version>13.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.codehaus.groovy</groupId>-->
<!-- <artifactId>groovy-all</artifactId>-->
<!-- <version>3.0.13</version>-->
<!-- <type>pom</type>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.13</version>
<type>pom</type>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
<!-- 日志链路追踪 https://tlog.yomahub.com/pages/f62a84/#%E5%90%8C%E6%AD%A5%E6%97%A5%E5%BF%97-->
<dependency>

View File

@@ -49,11 +49,11 @@ public class AuthorizationController {
@ApiOperation("登录授权")
@PostMapping(value = "/login")
public ResponseEntity<Object> login(@RequestBody Map authMap) throws Exception {
public ResponseEntity<Object> login(@RequestBody Map authMap, HttpServletRequest request) throws Exception {
if (ObjectUtil.isEmpty(authMap)){
return ResponseEntity.noContent().build();
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(onlineUserService.login(authMap));
return ResponseEntity.ok(onlineUserService.login(authMap, request));
}

View File

@@ -65,4 +65,5 @@ public interface ISysDeptService extends IService<SysDept> {
void createDept(SysDept dept);
List<SysDept> getUserDeptByUserId(String userId);
}

View File

@@ -41,4 +41,6 @@ public interface SysDeptMapper extends BaseMapper<SysDept> {
* @return
*/
String findAllChild(String pid);
List<SysDept> getUserDeptByUserId(String userId);
}

View File

@@ -37,4 +37,17 @@
</foreach>
)
</select>
<select id="getUserDeptByUserId" resultType="org.nl.system.service.dept.dao.SysDept">
SELECT
sd.*
FROM
sys_dept sd
WHERE sd.dept_id IN (
SELECT
d.dept_id
FROM
`sys_user_dept` d
WHERE d.user_id = #{userId}
) AND sd.is_used = TRUE
</select>
</mapper>

View File

@@ -176,4 +176,9 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
sysDeptMapper.updateSubCount(dept.getPid());
}
}
@Override
public List<SysDept> getUserDeptByUserId(String userId) {
return sysDeptMapper.getUserDeptByUserId(userId);
}
}

View File

@@ -18,9 +18,9 @@ public class LuceneDefaultAppender extends UnsynchronizedAppenderBase<ILogging
@Override
protected void append(ILoggingEvent eventObject) {
IndexWriter indexWriter = LuceneIndexWriter.getIndexWriter();
Document document = new Document();
document.add(new StringField("status_code", "01", Field.Store.YES));
// IndexWriter indexWriter = LuceneIndexWriter.getIndexWriter();
// Document document = new Document();
// document.add(new StringField("status_code", "01", Field.Store.YES));
}

View File

@@ -18,9 +18,11 @@ package org.nl.system.service.secutiry.impl;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -28,6 +30,8 @@ import org.nl.common.utils.*;
import org.nl.config.RsaProperties;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.dto.CurrentUser;
import org.nl.system.service.dept.ISysDeptService;
import org.nl.system.service.dept.dao.SysDept;
import org.nl.system.service.secutiry.dto.UserDto;
import org.nl.system.service.role.ISysRoleService;
import org.nl.system.service.secutiry.dto.AuthUserDto;
@@ -55,6 +59,8 @@ public class OnlineUserService {
@Autowired
private ISysUserService sysUserService;
@Autowired
private ISysDeptService deptService;
@Autowired
private ISysRoleService roleService;
@Autowired
private RedisUtils redisUtils;
@@ -69,20 +75,27 @@ public class OnlineUserService {
* @param token /
* @param request /
*/
public void save(UserDto userDto, String token, HttpServletRequest request){
// String dept = userDto.getDept().getName();
String dept = "";
public void save(SysUser userDto, String token, HttpServletRequest request){
// 获取用户部门
List<SysDept> userDeptByUserId = deptService.getUserDeptByUserId(userDto.getUser_id());
StringBuilder sb = new StringBuilder();
for (SysDept dept : userDeptByUserId) {
sb.append(dept.getName()).append("");
}
if (sb.length() > 0) {
sb.setLength(sb.length() - 1);
}
String dept = sb.toString();
String ip = StringUtils.getIp(request);
String browser = StringUtils.getBrowser(request);
// String address = StringUtils.getCityInfo(ip);
String address = "局域网";
String address = StringUtils.getCityInfo(ip);
OnlineUserDto onlineUserDto = null;
try {
// onlineUserDto = new OnlineUserDto(userDto.getUsername(), userDto.getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date());
onlineUserDto = new OnlineUserDto(userDto.getUsername(), userDto.getPerson_name(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date());
} catch (Exception e) {
log.error(e.getMessage(),e);
}
redisUtils.set(token, onlineUserDto, StpUtil.getTokenTimeout());
redisUtils.set("oline-" + userDto.getUsername(), onlineUserDto, StpUtil.getTokenTimeout());
}
/**
@@ -109,7 +122,7 @@ public class OnlineUserService {
Collections.reverse(keys);
List<OnlineUserDto> onlineUserDtos = new ArrayList<>();
for (String key : keys) {
if (key.length() == 1511) {
if (key.startsWith("oline-")) {
OnlineUserDto onlineUserDto = (OnlineUserDto) redisUtils.get(key);
if(StrUtil.isNotEmpty(filter)){
if(onlineUserDto.toString().contains(filter)){
@@ -127,10 +140,26 @@ public class OnlineUserService {
/**
* 踢出用户
* @param key /
* @param key: OnlineUserDto /
*/
public void kickOut(String key){
public void kickOut(OnlineUserDto key) {
// 获取用户
SysUser one = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, key.getUserName()));
if (ObjectUtil.isNotEmpty(one)) {
redisUtils.del("oline-" + one.getUsername());
}
// 下线
StpUtil.logoutByTokenValue(key.getKey()); // 通过token强退
}
/**
* 踢出用户
* @param keytoken /
*/
public void kickOut(String key) {
redisUtils.del(key);
// 下线
StpUtil.logoutByTokenValue(key); // 通过token强退
}
/**
@@ -211,7 +240,7 @@ public class OnlineUserService {
}
}
@SneakyThrows
public Map<String, Object> login(Map paramMap){
public Map<String, Object> login(Map paramMap, HttpServletRequest request){
// 密码解密 - 前端的加密规则: encrypt
AuthUserDto authUser = JSON.toJavaObject((JSON) JSON.toJSON(paramMap), AuthUserDto.class);
String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey, authUser.getPassword());
@@ -263,7 +292,7 @@ public class OnlineUserService {
put("user", user);
}};
// 保存在线信息
// onlineUserService.save(userDto, StpUtil.getTokenValue(), request);
this.save(userInfo, StpUtil.getTokenValue(), request);
return authInfo;
}
}

View File

@@ -7,15 +7,14 @@ spring:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:nl-sso-server}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:P@ssw0rd}
# password: ${DB_PWD:P@ssw0rd}
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:nl-sso-server}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
# username: ${DB_USER:root}
# password: ${DB_PWD:P@ssw0rd}
# password: ${DB_PWD:P@ssw0rd}
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:stand_lms}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
# password: ${DB_PWD:Root.123456}
# password: ${DB_PWD:12356}
password: ${DB_PWD:12356}
# 初始连接数
initial-size: 5
# 最小连接数
@@ -57,9 +56,25 @@ spring:
wall:
config:
multi-statement-allow: true
flyway:
# 是否启用flyway
enabled: true
# 编码格式默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径默认db/migration
locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时自动执行基准迁移新建schema_version表
baseline-on-migrate: true
redis:
#数据库索引
database: ${REDIS_DB:2}
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
# password: ${REDIS_PWD:}
@@ -70,6 +85,7 @@ spring:
threads: 4
nettyThreads: 4
singleServerConfig:
database: 2
connectionMinimumIdleSize: 8
connectionPoolSize: 8
address: redis://127.0.0.1:6379
@@ -169,7 +185,7 @@ sa-token:
token-session-check-login: false
alone-redis:
# Redis数据库索引默认为0
database: 2
database: 4
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
@@ -178,3 +194,22 @@ sa-token:
password:
# 连接超时时间
timeout: 10s
jetcache:
statIntervalMinutes: 15 # 统计间隔默认0表示不统计
areaInCacheName: false # areaName是否作为缓存key前缀默认True
local:
default: # 默认default可以配置更多的area
type: linkedhashmap # 已支持可选linkedhashmap、caffeine
keyConvertor: fastjson # key转换器
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java # 序列化器,只有remote需要
valueDecoder: java # 序列化器,只有remote需要
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379

File diff suppressed because one or more lines are too long