springcloud 项目搭建---》自己用

67 篇文章 0 订阅

服务端服务介绍

服务和模块介绍:
应用服务 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切换数据源

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值