perf: 使用 CompletableFuture 实现异步加载用户权限、角色代码和角色信息,以提高登录时的性能和响应速度

This commit is contained in:
2024-06-15 12:01:24 +08:00
parent e6dbe1a06d
commit d5f3c7417a
3 changed files with 25 additions and 4 deletions

View File

@@ -18,6 +18,7 @@ package top.continew.admin.common.model.dto;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import top.continew.admin.common.constant.SysConstants; import top.continew.admin.common.constant.SysConstants;
import java.io.Serial; import java.io.Serial;
@@ -32,6 +33,7 @@ import java.util.Set;
* @since 2022/12/24 13:01 * @since 2022/12/24 13:01
*/ */
@Data @Data
@NoArgsConstructor
public class LoginUser implements Serializable { public class LoginUser implements Serializable {
@Serial @Serial
@@ -97,6 +99,12 @@ public class LoginUser implements Serializable {
*/ */
private LocalDateTime loginTime; private LocalDateTime loginTime;
public LoginUser(Set<String> permissions, Set<String> roleCodes, Set<RoleDTO> roles) {
this.permissions = permissions;
this.roleCodes = roleCodes;
this.roles = roles;
}
/** /**
* 是否为管理员 * 是否为管理员
* *

View File

@@ -30,6 +30,7 @@ import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUser;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -44,6 +45,7 @@ import top.continew.admin.common.enums.GenderEnum;
import top.continew.admin.common.enums.MenuTypeEnum; import top.continew.admin.common.enums.MenuTypeEnum;
import top.continew.admin.common.enums.MessageTypeEnum; import top.continew.admin.common.enums.MessageTypeEnum;
import top.continew.admin.common.model.dto.LoginUser; import top.continew.admin.common.model.dto.LoginUser;
import top.continew.admin.common.model.dto.RoleDTO;
import top.continew.admin.common.util.helper.LoginHelper; import top.continew.admin.common.util.helper.LoginHelper;
import top.continew.admin.system.enums.MessageTemplateEnum; import top.continew.admin.system.enums.MessageTemplateEnum;
import top.continew.admin.system.enums.PasswordPolicyEnum; import top.continew.admin.system.enums.PasswordPolicyEnum;
@@ -64,6 +66,7 @@ import top.continew.starter.messaging.websocket.util.WebSocketUtils;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
/** /**
* 登录业务实现 * 登录业务实现
@@ -86,6 +89,7 @@ public class LoginServiceImpl implements LoginService {
private final MessageService messageService; private final MessageService messageService;
private final PasswordEncoder passwordEncoder; private final PasswordEncoder passwordEncoder;
private final OptionService optionService; private final OptionService optionService;
private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override @Override
public String accountLogin(String username, String password, HttpServletRequest request) { public String accountLogin(String username, String password, HttpServletRequest request) {
@@ -199,10 +203,15 @@ public class LoginServiceImpl implements LoginService {
*/ */
private String login(UserDO user) { private String login(UserDO user) {
Long userId = user.getId(); Long userId = user.getId();
LoginUser loginUser = BeanUtil.copyProperties(user, LoginUser.class); CompletableFuture<Set<String>> permissionFuture = CompletableFuture.supplyAsync(() -> permissionService
loginUser.setPermissions(permissionService.listPermissionByUserId(userId)); .listPermissionByUserId(userId), threadPoolTaskExecutor);
loginUser.setRoleCodes(permissionService.listRoleCodeByUserId(userId)); CompletableFuture<Set<String>> roleCodeFuture = CompletableFuture.supplyAsync(() -> permissionService
loginUser.setRoles(roleService.listByUserId(userId)); .listRoleCodeByUserId(userId), threadPoolTaskExecutor);
CompletableFuture<Set<RoleDTO>> roleFuture = CompletableFuture.supplyAsync(() -> roleService
.listByUserId(userId), threadPoolTaskExecutor);
CompletableFuture.allOf(permissionFuture, roleCodeFuture, roleFuture);
LoginUser loginUser = new LoginUser(permissionFuture.join(), roleCodeFuture.join(), roleFuture.join());
BeanUtil.copyProperties(user, loginUser);
return LoginHelper.login(loginUser); return LoginHelper.login(loginUser);
} }

View File

@@ -55,6 +55,10 @@ continew-starter.thread-pool:
queue-capacity: 128 queue-capacity: 128
# 活跃时间(单位:秒) # 活跃时间(单位:秒)
keep-alive-seconds: 300 keep-alive-seconds: 300
# 关闭线程池是否等待任务完成
wait-for-tasks-to-complete-on-shutdown: true
# 执行器在关闭时阻塞的最长毫秒数,以等待剩余任务完成执行(单位:毫秒)
await-termination-millis: 30000
--- ### 接口文档配置 --- ### 接口文档配置
springdoc: springdoc: