一个SpringCloud微服务学习项目 && 一个前后端分离的权限管理基础项目

By | 五月 17, 2019

jiiiiiin-security

一个SpringCloud微服务学习项目 && 一个前后端分离的权限管理基础项目

原则

  • 以最少的表结构字段完成一个基础应用,以便在以此完成实际项目时有更多的扩充自由

如果你仅仅需要一个简单的内管系统,请切换到master分支,其仅仅是一个spring-boot前后端分离基础应用,当前分支,是用来学习和实践spring-cloud微服务框架所开

功能截图

以下是部分功能截图

项目结构说明

.
├── pom.xml 公共pom
├── apollo-cache-dir (apollo本地缓存目录,见配置)
├── config 各个边界服务、后端服务的apollo配置目录
├── db 数据库初始化脚本
├── jiiiiiin-lib 自定义库
│   ├── jiiiiiin-data 数据层模块,目前主要针对Mybatis-Plus、redis(lib)
│   ├── jiiiiiin-security-app 针对SpringSecurity OAuth2 + Token(default/JWT)的安全模块(lib)
│   ├── jiiiiiin-security-authorize 后端RBAC抽象模块(lib)
│   ├── jiiiiiin-security-browser 针对Session的安全层模块(lib)
│   ├── jiiiiiin-security-core 安全层基础模块,处理Spring-Security相关基础配置(lib)
│   ├── jiiiiiin-mvc 应用开发通用模块(lib)
├── jiiiiiin-eureka-server 注册中心服务端(通用服务)
├── jiiiiiin-gateway 网关(通用服务)
├── jiiiiiin-hystrix
│   ├── jiiiiiin-hystrix-dashboard Hystrix熔断监服务(通用服务)
│   ├── jiiiiiin-hystrix-tuibine Hystrix Turbine聚合服务(通用服务)
├── edge-service 边界服务(pom)
│   ├── auth-center-server 统一用户认证中心应用
│   ├── manager-server 内管后端应用(TODO 待删除)
│   ├── manager-app 内管前端应用(vue项目,依赖d2-admin模块(1.6.9最新))
├── middle-tier-service 后端服务(pom)
│   └── user 用户服务(pom)
│       ├── user-common 用户公共代码(lib) 
│       ├── user-client 用户Feign客户端(lib) 
│       ├── user-server 用户应用
│   ├── order 订单服务(pom)
│   │   ├── order-server 后端应用
│   ├── product 商品服务(pom)
│   │   ├── product-client 商品Feign客户端(lib)
│   │   ├── product-server 后端应用

微服务代码划分,以便更好的管理项目,另外模块约定也可以为做代码生成做准备

  • middle-tier-service为【原子服务】
    • 一个原子服务,有划分为:
      • 业务标识-client Feign客户端(提供给调用方使用)
      • 业务标识-server 服务本身
      • 业务标识-common 当前原子服务中client和server共同依赖的代码,如实体等
  • edge-service为【边界服务服务】
    • 边界服务即提供给外部客户端(如:App)来调用,组织比较自由,但有一个原则及其只会依赖【原子服务】,一般不作为内部服务提供者

即下图中的Edge ServiceMiddle Tier Service

关于边界服务和原子服务的理解可以参考,【微服务架构~BFF和网关是如何演化出来的】

快速开始

  • 视频演示

注意:目前该视频是针对master分支录制,等当前分支对spring-cloud实践有一个基础眉目我会在重新录制响应视频,但是这个视频对于user-server & manager-app也具有参考价值

Watch the video

下载高清视频

  • 提示步骤:
    • 修改本地hosts
      • win配置方法 | mac配置方法 | 建议使用 switchhost,开源群下载,对自己的网络环境自信的朋友,也可以直接官网下载
        # 本地测试环境
        127.0.0.1   jiiiiiin-redis
        127.0.0.1   jiiiiiin-mysql
        127.0.0.1   jiiiiiin-eureka
        127.0.0.1   jiiiiiin-hystrix-dashboard
        127.0.0.1   jiiiiiin-hystrix-tuibine
        127.0.0.1   jiiiiiin-springboot-admin
        127.0.0.1   user-server
        127.0.0.1   auth-center-server
        127.0.0.1   jiiiiiin-gateway
        127.0.0.1   manager-app
    • 导入数据脚本
    • 启动jiiiiiin-mysql & jiiiiiin-redis
    • 启动apollo,并参考config目录中的xxx.properties创建各个应用的apollo对应项目,并自行配置所需配置信息

    注意这里可以自行控制apollo的连接环境,可以使用apollo-Quick-Start快速上手实践

    • 启动eureka::DiscoveryServerApplication
    • 启动监控服务
    • hystrix-dashboard::HystrixDashboardApplication
    • hystrix-tuibine::HystrixTuibineApplication
    • springboot-admin::SpringBootAdminApplication
    • zipkin::集成方式参考,建议使用docker直接部署服务端
    • 启动统一用户认证中心应用auth-center-server::AuthCenterApplication
    • 启动用户服务 user-server::UserApplication::9999
    • 启动网关 gateway::ZuulGatewayApplication::8861
    • 启动前端内管应用 manager-app::j manager-app && npm run serve

    一切ok,就可以直接访问manager-app 查看管理控制台了 :)

自定义配置

配置内容 位置
自定义properties配置jiiiiiin.security SecurityProperties.java 目前提供了针对公共接口、浏览器安全、验证码、OAuth2等相关配置
可覆盖的Bean配置 待整理~~

计划

  • SpringCloud

近期维护:新增feature/springcloud分支,将会在该分支尝试spring-cloud探索,目前基于第一代spring-cloud基础组件,核心为Netfix套件,进行一个初探

预期实践架构(来自微服务架构实战160讲)

功能 完成状态 简介
实践Eureka 服务注册发现 90% 集成Service Discovery (Eureka)服务注册中心
实践Zuul 服务网关 90% 集成Intelligent Routing (Zuul)服务网关
实践Feign/RestTemplate 服务间通讯和负载均衡 90% 实践服务间的调用
实践HYSTRIX/Turbine 服务的容错 90% 实现通过Turbine聚合各个服务的Hystrix监控信息,通过jiiiiiin-hystrix-dashboard项目完成统一聚合监控,需要在dashboard中键入jiiiiiin-hystrix-tuibine的集群监控url,如http://localhost:8962/turbine.stream
实践Zipkin 服务链路追踪 90% 集成方式参考,建议使用docker直接部署服务端
集成Spring Boot Admin 90% 集成方式参考
实践apollo 服务配置管理 90% 实践Apollo(阿波罗)
实践OAuth2授权认证中心 服务安全 90% 通过Spring Security Oauth2 + JWT来实现,身份认证通过网关走jiiiiiin-auth-center,鉴权直接在网关的SpringSecurity Resource服务器完成,并解决SpringSecurity OAuth2默认的性能问题
服务实时日志 0%
代码自动生成 0% 服务端3层代码自动生成,待适配目前的目录结构
docker化部署实践 0%
  • 业务

将会通过一个电商模块来实践服务划分

模块名称 完成状态 简介
用户服务 90% 开发进行中,将用户管理相关业务抽成一个user原子服务,提供给网关、统一权限认证中心、内管等应用使用
商品服务 0% 商家用来管理自己的商品
订单服务 0% 商家用来管理自己的订单
  • 已经实践的基础功能
功能 完成状态 简介
RBAC后端权限控制 100% 基于Spring Security的后端RBAC权限控制
RBAC前端权限控制 100% 1.基于vue-viewplus,实现了一个自定义模块
2.实现前端页面可访问性控制,通过路由拦截,判断用户待访问页面是否已经授权
3.实现可见页面的局部UI组件的可使用性或可见性控制,基于自定义v-access指令,对比声明的接口或资源别是否已经授权
集成vue-viewplus 100% vue-viewplus一个简化Vue应用开发的工具库
会话并发控制 100% 使用SpringSecurity#concurrency-control实现应用中同一用户在同时只能有一个是终端(渠道)成功登录应用,后登录终端会导致前一个会话失效
会话集群共享 100% 使用Spring Session与Redis实现会话的共享存储和集群部署
记住我控制 50% 使用spring-security实现remember-me功能
d2-mng-page 100% 自定义管理页面组件(统一管理:分页、检索、table、编辑),为了统一审美
Swagger集成 100% 用来构建服务端的RESTFull Api接口
spring-mobile 100% 用来进行渠道判断,使得应用能根据请求的设备响应不同的数据格式
Gif验证码 100% EasyCaptchakaptcha两种验证码库的支持
集成druid监控 100% druid
自定义短信登录集成 100% 自定义SpringSecurity短信登录

表结构和权限说明

表名称 简介
mng_admin 【用户表】,使用channel字段可以区分不同业务系统的用户,如这里0标识内管
mng_role 【角色表】,使用channel字段可以区分不同业务系统的角色,如这里0标识内管
mng_role_admin 【角色用户关联表】,这套系统中,角色和用户是可以多对多配置的
mng_resource 【权限资源表】,使用channel字段可以区分不同业务系统的资源,如这里0标识内管,另外type用来标识资源的类型,在这里只有类型: 1:菜单(默认) 0:按钮两种类型,并且没有直接定义一个类url字段取标识资源记录对应的后端某一个接口,是因为如一个菜单点击之后到达的页面可能要发多个后台交易,故一个字段来标识这多个交易容易导致混乱,所以在传统的RBAC表结构之下新增了mng_interface【系统接口表】来定义,而资源则是给业务人员配置角色或菜单时使用;这张表还有一个特点是将前端Vue Router的页面路径以path字段标识,以方便前后端的权限管理
mng_role_resource 【角色资源关联表】,用户、角色、资源都可以由业务人员进行关联操作
mng_interface 【系统接口表】,使用channel字段可以区分不同业务系统的接口,如这里0标识内管,使用url+method来区分后台的某一个接口
mng_resource_interface 【资源接口关联表】,mng_resourcemng_interface是多对多关系,因为某一个接口,比如查询资源树接口在角色管理列表和资源管理列表两个页面都会被调用,且存在一个资源记录会调用多个接口,故我觉得这样来设计表机构,多加这一张表,才能更清晰的将意思表达到位,且方便维护
persistent_logins spring security 记住用户所涉及表
springsocial_UserConnection spring social 第三方授权信息关联表

所用技术栈

后台

前端

参考

Github下载地址