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