# springcloud-groupon **Repository Path**: sowho.github.io/springcloud-groupon ## Basic Information - **Project Name**: springcloud-groupon - **Description**: 基于SpringCloud,React实现前后端分离的系统 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 14 - **Forks**: 5 - **Created**: 2020-04-12 - **Last Updated**: 2024-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springcloud-groupon #### 介绍 一个前后端分离的管理系统(后续计划做一套中后台业务系统,此项目仅为后台管理系统),后端使用SpringBoot2.1,SpringCloud,结合Mybatis,Nacos,Redis,Kafka,rocketmq等常用组件。 前端采用React,Redux,Ant design构建的单页应用。前端只做了登录,用户管理,角色管理,动态菜单等基础模块。 ##### 设计初衷 设计此项目是为了进一步学习目前微服务常用技术栈。从项目实战深入Spring Cloud 各个微服务的解决方案 #### 架构图 #### 项目结构 springcloud-groupon ├── groupon-common        公用模块以及自定义starter   ├── groupon-common-base   公共类,异常处理,工具类等   ├── groupon-common-log    日志收集与处理,可自行扩展   ├── groupon-common-mybatis  如mybatis枚举处理,拦截器等   ├── groupon-common-redis   集成redis与redisson,提供分布式锁   ├── groupon-common-rocketmq  基于rocketmq-client封装的   ├── groupon-common-xxljob   基于xxl-job封装的 ├── groupon-file-storage    文件服务,支持本地存储/sftp存储/fastdfs ├── groupon-admin        后台管理系统   ├── groupon-admin-gateway   ├── groupon-admin-system   ├── web-client 后端管理平台演示项目,仅包含登录,角色/用户管理 └── groupon-parent       maven pom依赖版本管理 ### Q&A - ##### 网关身份认证与鉴权 身份认证主要依靠Json Web Token,以登录流程为例 - 客户端调用登录接口,传入用户名密码,经过nginx后进入网关服务 - 网关服务确认用户名密码正确后创建 JWT,返回给客户端。 - 客户端拿到 JWT,进行存储(web浏览器存储在cookie中)在后续请求中,在 HTTP 请求头中加上 JWT。 - 服务端校验 JWT,校验通过后返回相关资源和数据。如果token快过期,应制定相应的刷新策略。 访问鉴权目前是依赖数据库来做的,将定义好的规则在项目初始化时加载进redis,后续每个api则根据规则进行鉴权,仅适用于后台管理系统。 - ##### 跨域 比较简单的是在nginx服务器中,监听同一个域名和端口,不同路径转发到客户端和服务器,把不同端口和域名的限制通过反向代理来做跨域。 当然也可以通过springMvc,自己实现过滤器,或者继承WebMvcConfigurerAdapter或者实现WebMvcConfigurer接口等方式 - ##### 日志收集 系统日志均在 /applog/{appName}目录中,使用filebeat扫描指定目录,读取所有日志文件,将其发送至elasticSearch,使用kibana展示(这个我只在本地做过,服务器实在是承受不住) - ##### 链路追踪 常用方案有两种,1.skywalking全链路追踪; 2.根据MDC的特性自定义traceId并依次想下游服务传递。本项目是使用的skywalking。 ###### 线程池中使用traceId 提供了[TracedThreadPoolExecutor](https://gitee.com/sowho.github.io/springcloud-groupon/tree/develop/groupon-common/groupon-common-base/src/main/java/com/zh/common/base/trace/TracedThreadPoolExecutor.java) ,[TracedThreadPoolTaskExecutor](https://gitee.com/sowho.github.io/springcloud-groupon/tree/develop/groupon-common/groupon-common-base/src/main/java/com/zh/common/base/trace/TracedThreadPoolTaskExecutor.java) 和 [MDCThreadPoolExecutor](https://gitee.com/sowho.github.io/springcloud-groupon/tree/develop/groupon-common/groupon-common-base/src/main/java/com/zh/common/base/trace/MDCThreadPoolExecutor.java) ###### logback中使用traceId apm-toolkit-logback-1.x有轮子 - ...... #### TODO - [ ] 可引入knife4j进行swagger文档聚合 - [ ] ...... ### 本地运行 ``` * 注册中心需自行搭建,调整各个服务中的bootstrap.yml文件,分别启动 admin-gateway,admin-system,如果需要debug可以访问 localhost:{port}/swagger-ui.html * 前端 * 1.执行 yarn install 安装依赖 * 2.调整 webpack.dev.js 中的代理地址为后端网关地址 * 3.执行 yarn start 运行项目 ``` ### 服务部署 ``` 1. 搭建各个服务的数据库服务,sql在各个模块doc中 2. 搭建nacos 注册中心服务,可集群部署 3. 搭建redis 中间件缓存服务,可集群部署 4. 搭建kafka/rocketmq 中间件队列服务(待定,kafka计划用来做业务日志/指标等监控) 5. 打包admin-* 项目,使用/doc/shell/start.sh启动jar包(如需skywalking,则需要搭建skywalking服务,脚本中可选择加入skywalking探针),可多实例部署 6. 在将web-client根目录执行 yarn build 打包,使用nginx存放静态文件并做反向代理,所有请求转发到网关处 ```