Spring+SpringMVC+Mybatis分佈式敏捷開發系統架構(附源碼)


前言

zheng項目不僅僅是一個開發架構,而是努力打造一套從 前端模板 - 基礎框架 - 分佈式架構 - 開源項目 - 持續集成 - 自動化部署 - 系統監測 - 無縫升級 的全方位J2EE企業級開發解決方案。

項目介紹

基於Spring+SpringMVC+Mybatis分佈式敏捷開發系統架構,提供整套公共微服務服務模塊:內容管理、支付中心、用戶管理(包括第三方)、微信平臺、存儲系統、配置中心、日誌分析、任務和通知等,支持服務治理、監控和追蹤,努力爲中小型企業打造全方位J2EE企業級開發解決方案。

組織結構

zheng
├── zheng-common -- SSM框架公共模塊
├── zheng-admin -- 後臺管理模板
├── zheng-ui -- 前臺thymeleaf模板[端口:1000]
├── zheng-config -- 配置中心[端口:1001]
├── zheng-upms -- 用戶權限管理系統
|    ├── zheng-upms-common -- upms系統公共模塊
|    ├── zheng-upms-dao -- 代碼生成模塊,無需開發
|    ├── zheng-upms-client -- 集成upms依賴包,提供單點認證、授權、統一會話管理
|    ├── zheng-upms-rpc-api -- rpc接口包
|    ├── zheng-upms-rpc-service -- rpc服務提供者
|    └── zheng-upms-server -- 用戶權限系統及SSO服務端[端口:1111]
├── zheng-cms -- 內容管理系統
|    ├── zheng-cms-common -- cms系統公共模塊
|    ├── zheng-cms-dao -- 代碼生成模塊,無需開發
|    ├── zheng-cms-rpc-api -- rpc接口包
|    ├── zheng-cms-rpc-service -- rpc服務提供者
|    ├── zheng-cms-search -- 搜索服務[端口:2221]
|    ├── zheng-cms-admin -- 後臺管理[端口:2222]
|    ├── zheng-cms-job -- 消息隊列、任務調度等[端口:2223]
|    └── zheng-cms-web -- 網站前臺[端口:2224]
├── zheng-pay -- 支付系統
|    ├── zheng-pay-common -- pay系統公共模塊
|    ├── zheng-pay-dao -- 代碼生成模塊,無需開發
|    ├── zheng-pay-rpc-api -- rpc接口包
|    ├── zheng-pay-rpc-service -- rpc服務提供者
|    ├── zheng-pay-sdk -- 開發工具包
|    ├── zheng-pay-admin -- 後臺管理[端口:3331]
|    └── zheng-pay-web -- 演示示例[端口:3332]
├── zheng-ucenter -- 用戶系統(包括第三方登錄)
|    ├── zheng-ucenter-common -- ucenter系統公共模塊
|    ├── zheng-ucenter-dao -- 代碼生成模塊,無需開發
|    ├── zheng-ucenter-rpc-api -- rpc接口包
|    ├── zheng-ucenter-rpc-service -- rpc服務提供者
|    └── zheng-ucenter-web -- 網站前臺[端口:4441]
├── zheng-wechat -- 微信系統
|    ├── zheng-wechat-mp -- 微信公衆號管理系統
|    |    ├── zheng-wechat-mp-dao -- 代碼生成模塊,無需開發
|    |    ├── zheng-wechat-mp-service -- 業務邏輯
|    |    └── zheng-wechat-mp-admin -- 後臺管理[端口:5551]
|    └── zheng-ucenter-app -- 微信小程序後臺
├── zheng-api -- API接口總線系統
|    ├── zheng-api-common -- api系統公共模塊
|    ├── zheng-api-rpc-api -- rpc接口包
|    ├── zheng-api-rpc-service -- rpc服務提供者
|    └── zheng-api-server -- api系統服務端[端口:6666]
├── zheng-oss -- 對象存儲系統
|    ├── zheng-oss-sdk -- 開發工具包
|    ├── zheng-oss-web -- 前臺接口[端口:7771]
|    └── zheng-oss-admin -- 後臺管理[端口:7772]
├── zheng-message -- 實時通知系統
|    ├── zheng-message-sdk -- 開發工具包
|    ├── zheng-message-server -- 服務端[端口:8881,SocketIO端口:8882]
|    └── zheng-message-client -- 客戶端
├── zheng-shop -- 電子商務系統
└── zheng-demo -- 示例模塊(包含一些示例代碼等)
     ├── zheng-demo-rpc-api -- rpc接口包
     ├── zheng-demo-rpc-service -- rpc服務提供者
     └── zheng-demo-web -- 演示示例[端口:9999]

技術選型

後端技術:

技術 名稱 官網
Spring Framework 容器 http://projects.spring.io/spring-framework/
SpringMVC MVC框架 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc
Apache Shiro 安全框架 http://shiro.apache.org/
Spring session 分佈式Session管理 http://projects.spring.io/spring-session/
MyBatis ORM框架 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis Generator 代碼生成 http://www.mybatis.org/generator/index.html
PageHelper MyBatis物理分頁插件 http://git.oschina.net/free/Mybatis_PageHelper
Druid 數據庫連接池 https://github.com/alibaba/druid
FluentValidator 校驗框架 https://github.com/neoremind/fluent-validator
Thymeleaf 模板引擎 http://www.thymeleaf.org/
Velocity 模板引擎 http://velocity.apache.org/
ZooKeeper 分佈式協調服務 http://zookeeper.apache.org/
Dubbo 分佈式服務框架 http://dubbo.io/
TBSchedule & elastic-job 分佈式調度框架 https://github.com/dangdangdotcom/elastic-job
Redis 分佈式緩存數據庫 https://redis.io/
Solr & Elasticsearch 分佈式全文搜索引擎 http://lucene.apache.org/solr/ https://www.elastic.co/
Quartz 作業調度框架 http://www.quartz-scheduler.org/
Ehcache 進程內緩存框架 http://www.ehcache.org/
ActiveMQ 消息隊列 http://activemq.apache.org/
JStorm 實時流式計算框架 http://jstorm.io/
FastDFS 分佈式文件系統 https://github.com/happyfish100/fastdfs
Log4J 日誌組件 http://logging.apache.org/log4j/1.2/
Swagger2 接口測試框架 http://swagger.io/
sequence 分佈式高效ID生產 http://git.oschina.net/yu120/sequence
AliOSS & Qiniu & QcloudCOS 雲存儲 https://www.aliyun.com/product/oss/ http://www.qiniu.com/ https://www.qcloud.com/product/cos
Protobuf & json 數據序列化 https://github.com/google/protobuf
Jenkins 持續集成工具 https://jenkins.io/index.html
Maven 項目構建管理 http://maven.apache.org/
Netty-socketio 實時推送 https://github.com/mrniko/netty-socketio

前端技術:

技術 名稱 官網
jQuery 函式庫 http://jquery.com/
Bootstrap 前端框架 http://getbootstrap.com/
Bootstrap-table Bootstrap數據表格 http://bootstrap-table.wenzhixin.net.cn/
Font-awesome 字體圖標 http://fontawesome.io/
material-design-iconic-font 字體圖標 https://github.com/zavoloklom/material-design-iconic-font
Waves 點擊效果插件 https://github.com/fians/Waves
zTree 樹插件 http://www.treejs.cn/v3/
Select2 選擇框插件 https://github.com/select2/select2
jquery-confirm 彈出窗口插件 https://github.com/craftpip/jquery-confirm
jQuery EasyUI 基於jQuery的UI插件集合體 http://www.jeasyui.com
React 界面構建框架 https://github.com/facebook/react
Editor.md Markdown編輯器 https://github.com/pandao/editor.md
zhengAdmin 後臺管理系統模板 https://github.com/shuzheng/zhengAdmin
autoMail 郵箱地址自動補全插件 https://github.com/shuzheng/autoMail
zheng.jprogress.js 加載進度條插件 https://github.com/shuzheng/zheng.jprogress.js
zheng.jtotop.js 返回頂部插件 https://github.com/shuzheng/zheng.jtotop.js
socket.io.js SocketIO插件 https://socket.io/

架構圖

架構圖

模塊依賴

模塊依賴

模塊介紹

zheng-common

Spring+SpringMVC+Mybatis框架集成公共模塊,包括公共配置、MybatisGenerator擴展插件、通用BaseService、工具類等。

zheng-admin

基於bootstrap實現的響應式Material Design風格的通用後臺管理系統,zheng項目所有後臺系統都是使用該模塊界面作爲前端展示。

zheng-ui

各個子系統前臺thymeleaf模板,前端資源模塊,使用nginx代理,實現動靜分離。

zheng-upms

本系統是基於RBAC授權和基於用戶授權的細粒度權限控制通用平臺,並提供單點登錄、會話管理和日誌管理。接入的系統可自由定義組織、角色、權限、資源等。用戶權限=所擁有角色權限合集+用戶加權限-用戶減權限,優先級:用戶減權限>用戶加權限>角色權限

zheng-oss

文件存儲系統,提供四種方案:

  • 阿里雲 OSS
  • 騰訊雲 COS
  • 七牛雲
  • 本地分佈式存儲

阿里雲OSS

zheng-api

服務網關,對外暴露統一規範的接口和包裝響應結果,包括各個子系統的交互接口、對外開放接口、開發加密接口、接口文檔等服務,可在該模塊支持驗籤、鑑權、路由、限流、監控、容錯、日誌等功能。示例圖:

在公衆號後端架構師後臺回覆“架構整潔”,獲取一份驚喜禮包。

API網關

zheng-cms

內容管理系統:支持多標籤、多類目、強大評論的內容管理,有基本單頁展示,菜單管理,系統設置等功能。

zheng-pay

  • 一站式支付解決方案,統一下單接口,支持支付寶、微信、網銀等多種支付方式。不涉及業務的純粹的支付平臺。

  • 統一下單(統一下單接口、統一掃碼)、訂單管理、數據分析、財務報表、商戶管理、渠道管理、對賬系統、系統監控。

統一掃碼支付

zheng-ucenter

通用用戶管理系統, 實現最常用的用戶註冊、登錄、資料管理、個人中心、第三方登錄等基本需求,支持擴展二次開發。

zheng-wechat-mp

微信公衆號管理平臺,除實現官網後臺自動回覆、菜單管理、素材管理、用戶管理、消息羣發等基礎功能外,還有二維碼推廣、營銷活動、微網站、會員卡、優惠券等。

zheng-wechat-app

微信小程序後臺

zheng-message

基於Netty實現SocketIO的實時推送系統。支持命名空間、二進制數據、SSL、ACK等功能。

搜索Java知音公衆號,回覆“後端面試”,送你一份Java面試題寶典.pdf

環境搭建(QQ羣內有“zheng環境搭建和系統部署文檔.doc”)

開發工具:

  • MySql: 數據庫
  • jetty: 開發服務器
  • Tomcat: 應用服務器
  • SVN|Git: 版本管理
  • Nginx: 反向代理服務器
  • Varnish: HTTP加速器
  • IntelliJ IDEA: 開發IDE
  • PowerDesigner: 建模工具
  • Navicat for MySQL: 數據庫客戶端

開發環境:

  • Jdk7+
  • Mysql5.5+
  • Redis
  • Zookeeper
  • ActiveMQ
  • Dubbo-admin
  • Dubbo-monitor

工具安裝

環境搭建和系統部署文檔(作者:小兵,QQ羣共享提供下載)

資源下載

  • JDK7  http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html [1]
  • Maven  http://maven.apache.org/download.cgi [2]
  • Redis  https://redis.io/download [3]
  • ActiveMQ  http://activemq.apache.org/download-archives.html [4]
  • ZooKeeper  http://www.apache.org/dyn/closer.cgi/zookeeper/ [5]
  • Dubbo  http://dubbo.io/Download-zh.htm [6]
  • Elastic Stack  https://www.elastic.co/downloads [7]
  • Nginx  http://nginx.org/en/download.html [8]
  • Jenkins  http://updates.jenkins-ci.org/download/war/ [9]
  • dubbo-admin-2.5.3  http://download.csdn.net/detail/shuzheng5201314/9733652 [10]
  • dubbo-admin-2.5.4-SNAPSHOT-jdk8  http://download.csdn.net/detail/shuzheng5201314/9733657 [11]

開發指南:

  • 1、本機安裝Jdk7、Mysql、Redis、Zookeeper、ActiveMQ並 啓動相關服務,使用默認配置默認端口即可
  • 2、克隆源代碼到本地並打開, 推薦使用IntelliJ IDEA,本地編譯並安裝到本地maven倉庫

修改本地Host

  • 127.0.0.1 ui.zhangshuzheng.cn

  • 127.0.0.1 upms.zhangshuzheng.cn

  • 127.0.0.1 cms.zhangshuzheng.cn

  • 127.0.0.1 pay.zhangshuzheng.cn

  • 127.0.0.1 ucenter.zhangshuzheng.cn

  • 127.0.0.1 wechat.zhangshuzheng.cn

  • 127.0.0.1 api.zhangshuzheng.cn

  • 127.0.0.1 oss.zhangshuzheng.cn

  • 127.0.0.1 config.zhangshuzheng.cn

  • 127.0.0.1 zkserver

  • 127.0.0.1 rdserver

  • 127.0.0.1 dbserver

  • 127.0.0.1 mqserver

編譯流程

maven編譯安裝zheng/pom.xml文件即可

啓動順序(後臺)

準備工作

  • 新建zheng數據庫,導入project-datamodel文件夾下的zheng.sql

  • 修改各dao模塊和rpc-service模塊的redis.properties、jdbc.properties、generator.properties數據庫連接等配置信息,其中master.redis.password、master.jdbc.password、slave.jdbc.password、generator.jdbc.password密碼值使用了AES加密,請使用com.zheng.common.util.AESUtil工具類修改這些值

  • 啓動Zookeeper、Redis、ActiveMQ、Nginx(配置文件參考project-tools/nginx下的*.conf文件)

zheng-upms

  • 首先啓動 zheng-upms-rpc-service(直接運行src目錄下的ZhengUpmsRpcServiceApplication#main方法啓動) => zheng-upms-server(jetty),然後按需啓動對應子系統xxx的zheng-xxx-rpc-service(main方法) => zheng-xxx-webapp(jetty)

啓動演示
  • 訪問 http://upms.zhangshuzheng.cn:1111/[12],子系統菜單已經配置到zheng-upms權限中,不用直接訪問子系統,默認帳號密碼:admin/123456

  • 登錄成功後,可在右上角切換已註冊系統訪問

zheng-cms

  • zheng-cms-admin:啓動ActiveMQ-啓動 => 啓動zheng-rpc-service => 啓動zheng-cms-admin

  • zheng-cms-web:啓動nginx代理zheng-ui靜態資源,配置文件可參考 nginx.conf

zheng-oss

  • 首先啓動zheng-oss-web服務

  • 開發階段,如果zheng-oss-web沒有公網域名,推薦使用ngrok內網穿透工具,爲開發環境提供公網域名,實現上傳回調

  • 啓動nginx代理zheng-ui靜態資源

開發演示(QQ羣內有“zheng十分鐘視頻:從檢出到啓動.wmv”)

  • 創建數據表(建議使用PowerDesigner)

  • 直接運行對應項目dao模塊中的generator.main(),可自動生成單表的CRUD功能和對應的model、example、mapper、service代碼

    • selectByExampleWithBLOBsForStartPage()

    • selectByExampleForStartPage()

    • selectByExampleWithBLOBsForOffsetPage()

    • selectByExampleForOffsetPage()

    • 生成的model和example均已實現Serializable接口,支持分佈式

    • 已包含抽象類BaseServiceImpl,只需要繼承抽象類並傳入泛型參數,即可默認實現mapper接口所有方法,特殊需求直接擴展即可

    • BaseServiceImpl默認已實現四種根據條件分頁接口

    • BaseServiceImpl方法根據讀寫操作自動切換主從數據源,繼承的擴展接口,可手動通過DynamicDataSource.setDataSource(DataSourceEnum.XXX.getName())指定數據源

  • 啓動流程:優先rcp-service服務提供者,再啓動其他webapp

  • 擴展流程:可擴展和拆分rpc-api和rpc-service模塊,可按微服務拆分或場景拆分

部署方式(QQ羣內有“zheng十分鐘視頻:從打包到linux服務器部署.wmv”)

  • war包項目:使用tomcat等web容器啓動

  • rpc-service服務提供者jar包:將打包後的zheng-xxx-rpc-service-assembly.tar.gz文件解壓,使用bin目錄的管理腳本運行即可,支持優雅停機。

框架規範約定

約定優於配置(convention over configuration),此框架約定了很多編程規範,下面一一列舉:

  • service類,需要在叫名service的包下,並以Service結尾,如CmsArticleServiceImpl

  • controller類,需要在以controller結尾的包下,類名以Controller結尾,如CmsArticleController.java,並繼承BaseController

  • spring task類,需要在叫名task的包下,並以Task結尾,如TestTask.java

  • mapper.xml,需要在名叫mapper的包下,並以Mapper.xml結尾,如CmsArticleMapper.xml

  • mapper接口,需要在名叫mapper的包下,並以Mapper結尾,如CmsArticleMapper.java

  • model實體類,需要在名叫model的包下,命名規則爲數據錶轉駝峯規則,如CmsArticle.java

  • spring配置文件,命名規則爲applicationContext-*.xml

  • 類名:首字母大寫駝峯規則;方法名:首字母小寫駝峯規則;常量:全大寫;變量:首字母小寫駝峯規則,儘量非縮寫

  • springmvc配置加到對應模塊的springMVC-servlet.xml文件裏

  • 配置文件放到src/main/resources目錄下

  • 靜態資源文件放到src/main/webapp/resources目錄下

  • jsp文件,需要在/WEB-INF/jsp目錄下

  • RequestMapping和返回物理試圖路徑的url儘量寫全路徑,如:@RequestMapping("/manage")return "/manage/index"

  • RequestMapping指定method

  • 模塊命名爲項目-子項目-業務,如zheng-cms-admin

  • 數據表命名爲:子系統_,如cms_article

  • 更多規範,參考[[阿里巴巴Java開發手冊] http://git.oschina.net/shuzheng/zheng/attach_files

演示地址

演示地址:http://upms.zhangshuzheng.cn/[13]

預覽圖

    

數據模型

數據庫模型

拓撲圖

拓撲圖

項目地址

https://gitee.com/shuzheng/zheng/


往期推薦



Java大文件HTTP斷點續傳到服務器該怎麼做?

MySQL億級數據分頁的奇妙經歷

面試官:來說說https和http區別?

聊聊前後端分離接口規範

Spring Boot 中關於 %2e 的 坑,希望你不要遇到

MySQL  Binlog 日誌處理工具都有那些?

面試官:作爲架構師,請你談談Saas 應用如何搭建?

SpringBoot中微服務技術中進程間通信原理

Spring Boot 接入支付寶支付案例教程!

Spring Boot 中的Http接口調用只知道 RestTemplate?來試下 Retrofit !

Java中關於線程同步,你會用到的4個類


本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章