• springcloud 项目搭建


    服务端服务介绍

    服务和模块介绍:
    应用服务 bankintegral-boot-server
    主要包括 token解析、用户uri权限拦截、日志、黑白名单等功能。

    认证模块: bankintegral-oauth
    主要包括 登录接口、获取用户权限接口、常用数据接口(如前端获取的字典、枚举接口)等接口和功能。

    权限模块: bankintegral-authority
    主要包括 组织机构管理、岗位管理、用户管理、系统设置、权限配置等功能。

    文件模块: bankintegral-file
    主要包括 文件存储、文件下载、文件回显等功能。支持多种第三方OSS存储。 公共模块:bankintegral-public 主要包含 公共的常量、枚举、工具包、类、实现类

    用户模块: bankintegral-user
    主要包含 用户基本信息、用户收货地址、用户购物车、用户收藏等等

    商品模块: bankintegral-goods
    主要包含 商品信息、sku、商品规格、商品分类等等

    订单模块: bankintegral-order
    主要包含 主积分订单,积分订单详情等等

    支付模块: bankintegral-pay
    主要包含 支付流水、银行对账等等 bankintegral-springboot 目录结构
    ├── bankintegral-boot-server # 启动springboot服务主入口 ├── bankintegral-authority # 权限模块
    │ ├── bankintegral-authority-biz
    │ ├── bankintegral-authority-controller
    │ ├── bankintegral-authority-entity
    ├── bankintegral-file # 文件模块
    │ ├── bankintegral-file-biz
    │ ├── bankintegral-file-controller
    │ ├── bankintegral-file-entity
    ├── bankintegral-oauth # 认证模块
    │ ├── bankintegral-oauth-biz
    │ ├── bankintegral-oauth-controller
    │ └── bankintegral-oauth-server
    ├── bankintegral-public # 公共模块
    │ ├── bankintegral-common
    │ ├── bankintegral-common-api
    ├── bankintegral-user # 用户模块
    │ ├── bankintegral-user-biz
    │ ├── bankintegral-user-controller
    │ ├── bankintegral-user-entity
    ├── bankintegral-goods # 商品模块
    │ ├── bankintegral-goods-biz
    │ ├── bankintegral-goods-controller
    │ ├── bankintegral-goods-entity
    ├── bankintegral-order # 订单模块
    │ ├── bankintegral-order-biz
    │ ├── bankintegral-order-controller
    │ ├── bankintegral-order-entity
    ├── bankintegral-pay # 支付模块
    │ ├── bankintegral-pay-biz
    │ ├── bankintegral-pay-controller
    │ ├── bankintegral-pay-entity
    └── src
    └── main
    └── filters
    └── config-test.properties # 测试环境全局配置
    └── config-prod.properties # 生产环境全局配置

    层、三层架构:
    实体层:包含bankintegral-user-entity、bankintegral-goods-entity、bankintegral-order-entit等等
    业务层:包含 bankintegral-user-biz、 bankintegral-goods-biz、 bankintegral-order-biz等等
    控制层:包含bankintegral-user-controller、bankintegral-goods-controller等等
    数据传输对象: Entity: 跟数据库表一一对应 DTO:数据传输对象,Service或Manager 使用的对象 Query:数据查询对象,各层接收上层的查询请求。建议超过3个参数的查询进行封装。 VO:显示层对象,Controller层接收和返回参数。

    项目约定: 控制层(Controller): Controller 不能互相注入调用
    Controller 只能调用Service,禁止调用Mapper(Dao)
    Controller 主要负责参数验证、转换等操作,尽量别写业务代码 service层: 所有涉及到新增、修改、删除操作都要加Transactional事务注解 --》@Transactional(rollbackFor = Exception.class)
    代码生成器 Mybatis-plus-generator
    项目基础工具服务类Util bankintegral-core ---》最核心的、最基础的、



    技术栈
    ●所涉及的相关的技术有:
    ○JSON序列化:Jackson
    ○消息队列:RabbitMQ3.7+
    ○缓存:Redis5.0
    ○数据库: Polardb(mysql 8.0+)
    ○定时器:xxl-jobs或自定义定时Schedule
    ○持久层框架: Mybatis-plus
    ○代码生成器:基于Mybatis-plus-generator自定义
    ○配置中心: Nacos
    ○项目构建:Maven
    ○文件服务器:阿里云OSS
    ○数据权限
    ○前后端统一表单验证(基于JSR 303 是 Java 为 Bean 数据合法性校验所提供的标准框架
    ○防跨站脚本攻击(XSS)
    ○分布式事务
    ○灰度发布
    ○工作流

    ●部署方面:
    ○服务器:CentOS8或者Alibaba Cloud Linux
    ○Nginx
    ○Jenkins
    ○执行脚本shell
    ○阿里云日志
    ○云监控

     

    技术实现策略:

    服务端
    1、移动端/PC端登录---》JWT技术
    http请求头:

    • Authorization: Basic {Base64加密的客户端id和密码}
    • token: Bearer {JWT 生成的token}

    2、PC后台权限---》页面security、数据DataScopeInnerInterceptor

    3、接口加密---》非对称加密RSA、对称加密AES

    4、延迟时间任务消费 ---》RabbitMq

    5、缓存、计时器、原子性加减操作、幂等性等 ----》redis

    6、异步方法调用 ----》@Async,通过线程池ThreadPoolTaskExecutor实现

    7、定时任务 ----》xxl-job 或者自定义Schedule

    8、Bean的转化 ----》采用Dozer、BeanUtil等组件来对 DTO、entity、VO等对象的优化转换

    9、防跨站脚本攻击(XSS) ----》通过过滤器对所有请求中的 表单参数 进行过滤

    10、Fegin之间用户信息传递----》在token验证成功后在header中封装参数返回到业务服务中

    如下所示:

    // 将请求头中的token解析出来的用户信息重新封装到请求头,转发到业务服务
    // 业务服务在利用HeaderThreadLocalInterceptor拦截器将请求头中的用户信息解析到ThreadLocal中
    if (authInfo != null) {
        addHeader(mutate, ContextConstants.JWT_KEY_ACCOUNT, authInfo.getAccount());
        addHeader(mutate, ContextConstants.JWT_KEY_USER_ID, authInfo.getUserId());
        addHeader(mutate, ContextConstants.JWT_KEY_NAME, authInfo.getName());
    
        MDC.put(ContextConstants.JWT_KEY_USER_ID, String.valueOf(authInfo.getUserId()));
    }

    fegin拦截获取用户信息

    @Slf4j
    public class HeaderThreadLocalInterceptor implements AsyncHandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (!(handler instanceof HandlerMethod)) {
                return true;
            }
    
            if (!ContextUtil.getBoot()) {
                ContextUtil.setPath(getHeader(request, ContextConstants.PATH_HEADER));
                ContextUtil.setUserId(getHeader(request, ContextConstants.JWT_KEY_USER_ID));
                ContextUtil.setAccount(getHeader(request, ContextConstants.JWT_KEY_ACCOUNT));
                ContextUtil.setName(getHeader(request, ContextConstants.JWT_KEY_NAME));
                ContextUtil.setTenant(getHeader(request, ContextConstants.JWT_KEY_TENANT));
                ContextUtil.setSubTenant(getHeader(request, ContextConstants.JWT_KEY_SUB_TENANT));
    
                String traceId = request.getHeader(ContextConstants.TRACE_ID_HEADER);
                MDC.put(ContextConstants.LOG_TRACE_ID, StrUtil.isEmpty(traceId) ? StrUtil.EMPTY : traceId);
                MDC.put(ContextConstants.JWT_KEY_TENANT, getHeader(request, ContextConstants.JWT_KEY_TENANT));
                MDC.put(ContextConstants.JWT_KEY_SUB_TENANT, getHeader(request, ContextConstants.JWT_KEY_SUB_TENANT));
                MDC.put(ContextConstants.JWT_KEY_USER_ID, getHeader(request, ContextConstants.JWT_KEY_USER_ID));
            }
            // cloud
            ContextUtil.setGrayVersion(getHeader(request, ContextConstants.GRAY_VERSION));
            return true;
        }
    
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            ContextUtil.remove();
        }
    }

    11、mybatis-plus多数据源切换----》使用 @DS 切换数据源
    可参考地址:Mybatis-Plus多数据源配置切换_JackSparrow001的博客-CSDN博客_mybatisplus切换数据源

  • 相关阅读:
    【技术支持案例】S32K146的hard fault问题处理
    关于redisson的序列化配置
    如何使用iPhone15在办公室观看家里电脑上的4k电影,实现公网访问本地群晖!
    百战RHCE(第四十八战:运维工程师必会技-Ansible学习3-构建Ansible清单)
    请求一下子太多了,数据库危
    如何让设计师快速提高设计美感?这5个网站就够了
    SparkSQL系列-4、数据处理分析
    java计算机毕业设计基于安卓Android/微信小程序的大学生教学辅导系统APP
    C语言刷题(2)
    RabbitMQ详解-06RabbitMQ高级
  • 原文地址:https://blog.csdn.net/qq_39291929/article/details/127426909