## 12.2 單體系統到系統拆分
如果你對上一節還有疑惑,在想為什么我不把所有系統放到一個工程里,打成一個war包,也就是我們所謂的單體系統呢?
單體系統確實是一種常見系統設計方式,這十幾年年來最主要的設計方式。單體系統的所有功能都在一個工程里,打成一個war包,部署。這樣有如下明顯好處
* 單體系統開發方式簡單,我們從剛開始學習編程,就是完成的單體系統,開發人員只要集中精力開發當前工程
* 容易修改,如果需要修改任何功能,都非常方便,只需要修改一個工程范圍的代碼
* 測試簡單,單體系統測試不需要考慮別的系統,避免本書下冊要提到的各種REST,MQ調用
* 部署也很容易:不需要考慮跟別的系統關系,直接打war包部署到Web服務器即可
* 性能容易擴展,可以通過Nginx,把一個應用部署到多個服務器上。
隨著業務發展,重構,單體系統越來越多,在開發一個龐大的單體系統的時候,就會有如下弊病
* 單體系統龐大,越來越難理解單體系統,微小的改動牽涉面廣泛導致開發小組小心謹慎,開發速度會越來越慢。另外,啟動一個龐大的單體系統,可能需要3分鐘,或者更多時間
* 多個功能在同一個單體系統上開發,導致測試越來越慢,比如,測試必須排期,串行測試
* 單體系統如果想對技術進行更新換代,那代價非常大,如果是個小系統構成,則可以選取一個小系統先做嘗試。單體大系統是幾乎不可能做技術升級的
* 單體系統的所有功能運行在同一個JVM里,功能會互相影響,比如一個統計上傳word文檔的頁碼的功能由于非常消耗CPU,因此,會因為調用統計功能,導致整個系統短暫都不可用,出現假死的現象
因此,越來越多的架構師在設計系統的時候,會考慮系統拆分成多個單體小系統甚至是微服務。對于傳統企業應用,拆成小系統更合適,對互聯網系統,使用微服務個更合適,這是因為
* 傳統IT系統本質上還是會用一個數據庫,而微服務提倡的是一個服務一個數據庫
* 傳統IT系統很少需要調用其他模塊服務。傳統IT系統通過工作流來串聯其他子系統。而電商類的微服務則是通過RPC等方式進行交互,是一個輕量級協議。傳統IT系統也可以通過SOA,JMS跟其他系統(非子系統)交互,采用重量級協議
* 微服務對系統的基礎設施要求很高,比如微服務治理,彈性庫等等,只要電商系統才有人力物力去做這種事情,而傳統IT系統,及時財大氣粗,也暫時不具備微服務那樣的IT基礎設置
因此,對于大多數傳統IT應用來說,單體拆分小系統在技術上沒有風險,是一個可以立即實施的架構。如下是一個單體系統拆分后的物理架構

對于用戶來說,訪問不同的菜單功能,講定位到不同的子系統,提供服務。
> 關于如上物理架構實現,在本書的下冊。plus系統即可以拆分成小系統,也可以作為一個單體系統來設計。這一章主要介紹plus系統的核心功能和開發方法
- 再版說明
- 1 前言
- 1.1 內容介紹
- 1.2 Java EE
- 1.2.1 Java EE 架構
- 1.5 如何閱讀本書
- 1.6 本書第二版與第一版區別
- 1.7 本書例子
- 1.8 購買正版
- 2 Spring Boot 基礎
- 2.1 檢查Java環境
- 2.2 安裝IDE
- 2.3.1 安裝Eclipse
- 2.3.2 安裝Idea
- 2.3.3 Idea和 Eclipse 區別
- 2.3 Maven安裝和配置
- 2.3.1 Maven介紹
- 2.3.2 安裝Maven
- 2.3.3 pom文件構成
- 2.3.4 設置Maven鏡像
- 2.3.5 IDE設置Maven
- 2.4 Spring框架
- 2.4.1 Spring 歷史
- 2.4.2 Spring 容器介紹
- 2.4.3 Spring 常用注解
- 2.5 Hello,Spring Boot
- 2.5.1 創建一個Maven工程
- 2.5.2 增加Web支持
- 2.5.3 hello world
- 2.5.4 使用熱部署
- 2.5.5 添加Rest支持
- 2.5.6 配置HTTP監聽端口
- 3 MVC框架
- 3.1 集成MVC框架
- 3.1.1 引入依賴
- 3.1.2 Web應用目錄結構
- 3.1.3 Java 包名結構
- 3.2 使用Controller
- 3.3 URL 映射到方法
- 3.3.1 @RequestMapping
- 3.3.2 URL路徑匹配
- 3.3.4 HTTP method匹配
- 3.3.5 consumes和 produces
- 3.3.6 params和header匹配
- 3.4 方法參數
- 3.4.1 PathVariable
- 3.4.2 Model&ModelAndView
- 3.4.3 JavaBean接收HTTP參數
- 3.4.4 @RequsestBody接收JSON
- 3.4.5 MultipartFile
- 3.4.6 @InitBinder
- 3.5 驗證框架
- 3.5.1 JSR-303
- 3.5.2 MVC中使用@Validated
- 3.5.3 自定義校驗
- 3.6 WebMvcConfigurer
- 3.6.1 攔截器
- 3.6.2 跨域訪問
- 3.6.3 格式化
- 3.6.4 注冊Controller
- 3.7 Redirect 和 Forward
- 3.8 通用錯誤處理
- 3.9 異步請求
- 3.10 處理靜態資源
- 3.11 調用Service
- 3.11.1 申明一個Service類
- 3.11.2 事務管理
- 3.12 CURL 命令
- 4 視圖技術
- 4.1 Json技術
- 4.1.1 SpringBoot中使用Jackson
- 4.1.2 配置Jackson
- 4.1.3 Jackson三種使用方式
- 4.1.4 Jackson 樹遍歷
- 4.1.5 對象綁定
- 4.1.6 流式操作
- 4.1.7 Jackson 注解
- 4.1.9 集合的反序列化
- 4.1.10 關于Jackson性能說明
- 4.2 Beetl模板引擎
- 4.2.1 安裝Beetl
- 4.2.2 設置定界符號和占位符
- 4.2.3 自動檢測模板變化
- 4.2.4 GroupTemplate
- 4.2.5 使用變量
- 4.2.6 表達式
- 4.2.7 控制語句
- 4.2.8 函數調用
- 4.2.9 格式化函數
- 4.2.10 直接調用Java
- 4.2.11 標簽函數
- 4.2.12 HTML標簽
- 4.2.13 安全輸出
- 4.2.14 配置Beetl
- 4.2.15 布局
- 4.2.16 驗證模板
- 4.2.17 腳本引擎
- 4.2.18 為什么選擇Beetl
- 5 數據庫訪問
- 5.1 配置數據源
- 5.2 Hikari 配置選項
- 5.3 JDBC Template
- 5.3.1 查詢
- 5.3.2 修改
- 5.3.3 JdbcTemplate 增強
- 5.3 Spring Data JPA 支持
- 5.3.1 創建Entity
- 5.3.2 簡化Entity
- 5.3.3 Repository
- 5.3.4 CrudRepository
- 5.3.5 PagingAndSortingRepository
- 5.3.6 JpaRepository
- 5.3.7 持久化Entity
- 5.3.6 Sort
- 5.3.7 Pageable和 Page
- 5.3.8 基于方法名字查詢
- 5.3.9 @Query 查詢
- 5.3.10 使用JPA Query
- 5.3.11 Example 查詢
- 5.3.12 一個使用JPA糟糕回憶
- 6 BeetlSQL
- 6.1 BeetlSQL 特點
- 6.2 配置BeetlSQL
- 6.3 一個例子
- 6.3.1 創建實體對象
- 6.3.2 創建Dao
- 6.3.3 編寫Service
- 6.3.4 編寫一個復雜的SQL
- 6.4 SQLManager
- 6.5 Mrakdown 文件
- 6.6 跨數據庫
- 6.6 翻頁查詢
- 6.7 實體對象和多表結果集
- 6.8 直接使用SQL
- 6.9 Query 類
- 6.10 代碼生成
- 6.11 BeetlSQL函數
- 6.11 一些重要注解
- 6.11.1 @Table
- 6.11.2 @Version
- 6.11.3 @SqlResource
- 6.11.4 @SqlProvider
- 6.11.5 自定義注解
- 6.12 重要配置事項
- 6.13 擴展BeetlSQL
- 6.14 主從支持
- 6.15 最佳實踐
- 7 MyBatis
- 7.1 Spring Boot 集成
- 7.2 編寫Mapper文件
- 7.2.1 查詢
- 7.2.2 更新語句
- 7.2.4 SQL片段
- 7.3 動態SQL
- 7.4 MyBatis-Plus集成
- 8 Spring Boot 配置
- 8.1 SpringBoot 配置
- 8.1.1 服務器配置
- 8.1.2 使用其他Web服務器
- 8.1.3 配置啟動信息
- 8.1.4 配置瀏覽器顯示ico
- 8.2 日志配置
- 8.3應用配置讀取
- 8.3.1 Environment
- 8.3.2 @Value
- 8.3.3 @ConfigurationProperties
- 8.4 SpringBoot 自動裝配
- 8.4.1 @Configuration和@Bean
- 8.4.2 Bean條件裝配
- 8.4.3 Class 條件裝配
- 8.4.4 Environment裝配
- 8.4.5 其他條件裝配
- 8.4.6 聯合多個條件
- 8.4.7 Condition接口
- 8.4.8 制作Stater
- 8.5 Application.properties
- 8.6 其他配置
- 8.6.1 靜態文件配置
- 8.6.2 熱啟動配置
- 8.7 HikariCP配置
- 9 部署Spring Boot 應用
- 9.1 以Jar文件運行
- 9.2 以war方式部署
- 9.3 多環境部署
- 9.4 @Profile
- 9.5 Launcher
- 10 Testing 單元測試
- 10.1 JUnit 介紹
- 10.1.1 Junit相關概念
- 10.1.2 Junit 測試
- 10.1.3 Assert
- 10.1.4 Suite
- 10.2 Spring Boot 單元測試
- 10.2.1 測試范圍依賴
- 10.2.2 SpringBoot 測試腳手架
- 10.2.3 測試Service
- 10.2.4 測試MVC
- 10.2.5 完成MVC請求模擬
- 10.2.6 比較 MVC返回結果
- 10.2.7 JSON 比較
- 10.3 Mockito
- 10.3.1 模擬對象
- 10.3.2 模擬方法參數
- 10.3.3 模擬方法返回值
- 10.4 @Sql
- 11 AOP和事務
- 11.1 AOP
- 11.2 事務和Spirng 事務管理
- 11.2.1 事務處理
- 11.2.2 隔離保護
- 11.2.3 Spring Boot 事務管理
- 11.2.4 分布式事物
- 12 Spring Boot Plus 安裝
- 12.1 代碼工程
- 12.2 單體系統到系統拆分
- 12.3 安裝
- 12.4 核心模型
- 12.4.1 Function
- 12.4.2 Menu
- 12.4.3 Role
- 12.4.4 User表
- 12.4.5 數據字典表
- 12.4.6 審計表
- 12.5 代碼生成
- 12.5.1 子系統生成
- 12.5.1 配置子系統
- 12.5.2 業務代碼生成
- 12.6 權限系統原理
- 12.6.1 功能權限
- 12.6.2 數據權限
- 12.6.3 加密
- 12.7 Plus的配置類