## 18.1 水平擴展實現
當系統想提升處理能力的時候,通常用倆種選擇,一種是重置擴展架構,即提升現有系統硬件的處理能能力,比如提高CPU頻率,使用更好的存儲器。另外一種選擇是水平擴展架構,即部署系統到更多的服務器上同時提供服務。這倆種方式各有利弊,現在通常都優先采用水平擴展架構,這是因為
* 重置擴展架構
缺點:架構中,硬件提升能力有限,而且,硬件能力提升往往需要更多的花費
優點:應用系統不需要做任何改變。
* 水平擴展
優點:成本便宜
缺點:更多的應用導致管理更加復雜。對于Spring Boot 應用,會話管理是個難點
Spring Boot 應用水平擴展有倆個問題需要解決,一個是將用戶的請求派發到水平部署的任意一臺Spring Boot應用,這通常用一個反向代理服務器來實現,本書將使用nginx作為反向代理服務器
> 反向代理(Reverse Proxy)方式是指來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
>
> 正向代理服務器:是指局域網內,訪問外網,通過一個正向代理服務器訪問外網。
另外一個需要解決的是會話管理, 單個Spring Boot應用,會話管理是Tomcat 來管理,會話信息跟Tomcat存放在一起.如果部署多個Spring Boot應用,對于同一個用戶請求,即使被請求通過Nginx派發到不同的Web服務器上,也能共享會話信息。有倆種方式可以實現。
* 復制會話:Web服務器通常都支持Session復制,一臺應用的會話信息改變將立刻復制到到其他集群的web服務器上
* 集中式會話:所有Web服務器都共享一個會話,會話信息通常是存放在一臺服務器來實現,本章講使用Redis服務器來存放會話
復制會話的缺點是每次會話改變需要復制到多臺Web服務器上,效率較低。因此Spring Boot 應用是采用第二種方式集中式會話方式,結構如下:

上圖是一個大型分布式系統架構,包含了三個獨立的子系統。業務子系統一和業務子系統二各部署在一臺Tomcat服務器上,業務子系統三部署在倆臺Tomcat服務器上,采用水平擴展。
架構采用Nginx作為反向代理,其后的各個子系統都采用Spring Session,將會話存放在Redis里,因此,這些子系統雖然是分開部署,支持水平擴展,但能整合成一個大的系統。Nginx提供統一的入口,對于用戶訪問,將按照某種策略,比如根據訪問路徑派發到后面的對應的Spring Boot應用,Spring Boot取得調用Spring Session取得會話信息,Spring Session并沒有從本地存取會話,會話信息是存放在Redis服務器上。
- 再版說明
- 13 REST
- 13.1 REST
- 13.1.1 REST 風格的架構
- 13.1.2 使用api作為上下文
- 13.1.3 增加一個版本標示
- 13.1.4 標識資源
- 13.1.5 確定HTTP METHOD
- 13.1.6 確定HTTP Status
- 13.1.7 REST VS WebService
- 13.2 SpringBoot Rest集成
- 13.2.1 集成REST
- 13.2.2 @RestController
- 13.2.3 REST Client
- 13.3 Swager UI
- 13.3.2 集成Swager UI
- 13.3.3 OpenAPI 規范
- 13.3.4 接口描述
- 13.3.5 查詢參數描述
- 13.3.6 URI中的參數
- 13.3.7 HTTP 頭參數
- 13.3.8 表單參數
- 13.3.9 整個請求體作為參數
- 14 MongoDB
- 14.1 安裝MongoDB
- 14.2 使用shell
- 14.2 .1 指定數據庫
- 14.2.2 插入文檔
- 14.2.3 查詢文檔
- 14.2.4 更新操作
- 14.2.5 刪除操作
- 14.3 Spring Boot集成
- 14.4 增刪改查
- 14.4.1 增加API
- 14.4.2 根據主鍵查詢API
- 14.4.3 查詢API
- 14.4.4 修改API
- 14.4.5 刪除API
- 14.4.6 使用MongoDatabase
- 14.4.7 打印日志
- 14.5 使用Spring Data
- 15 Redis
- 15.1 安裝Redis
- 15.2 使用redis-cli
- 15.2 .1 安全設置
- 15.2.2 基本操作
- 15.2.3 Keys
- 15.2.3 Redis List
- 15.2.4 Redis Hash
- 15.2.5 Set
- 15.2.6 Pub&Sub
- 15.3 Spring Boot 集成
- 15.4 使用StringRedisTemplate
- 15.4.1 opsFor
- 15.4.2 綁定key的操作
- 15.4.3 RedisConnection
- 15.4.4 Pub&Sub
- 15.4.5 Pipeline
- 15.5 序列化策略
- 15.5.1 默認序列化策略
- 15.5.2 自定義序列化策略
- 16 Elastic Search
- 16.1 Elastic Search 介紹
- 16.1.1Elastic 安裝
- 16.2.1 創建Index
- 16.2.2 添加文檔
- 16.2.3 根據主鍵查詢
- 16.2.4 根據主鍵更新
- 16.2.5 根據主鍵刪除
- 16.2.6 搜索文檔
- 16.2.7 聯合多個索引搜索
- 16.2.8 Mapping
- 16.2.9 路由
- 16.3 使用RestTemplate 訪問ES
- 16.3.1 創建Book
- 16.3.2 使用RestTemplate 獲取搜索結果
- 16.4 Spring Data Elastic
- 16.4.1 安裝Spring Data
- 16.4.2 編寫entity
- 15.4.3 編寫Dao
- 16.4.4 編寫Controller
- 17 Cache
- 17.1 關于Cache
- 17.1.1 Cache 組件和概念
- 17.1.2 Cache的單機應用
- 17.1.3 使用專有的Cache服務器
- 17.1.4 使用一二級緩存服務器
- 17.2 Spring Boot Cache
- 17.2.1 集成Spring cache
- 17.3 注釋驅動緩存
- 17.3.1 @Cacheable
- 17.3.2 KEY生成器
- 17.3.2 @CachePut
- 17.3.3 @CacheEvict
- 17.3.4 @Caching
- 17.3.5 @CacheConfig
- 17.4 使用Redis Cache
- 17.4.1集成Redis 緩存
- 17.4.2 禁止緩存
- 17.4.3 定制緩存
- 17.4. 5 Redis緩存原理
- 17.5 實現Redis 倆級緩存
- 17.5.1 實現 TwoLevelCacheManager
- 17.5.2 創建RedisAndLocalCache
- 17.5.3 緩存同步說明
- 17.5.4 將代碼組合在一起
- 18 Spring Session
- 18.1 水平擴展實現
- 18.2 nginx 安裝和配置
- 18.2.1 安裝nginx
- 18.2.2 配置nginx
- 18.3 Spring Session
- 18.3.1 Spring Session介紹
- 18.3.2 使用Redis
- 18.3.3 Nginx+Redis
- 19 SpringBoot 和 Zookeeper
- 19.1 Zookeeper
- 19.1.1 zookeeper 數據結構
- 19.1.2 Zookeeper 安裝
- 19.1.3 zookeeper 基本命令
- 19.1.4 領導選取演示
- 19.1.5 分布式鎖演示
- 19.1.6 服務注冊演示
- 19.2 Spring boot 集成zookeeper
- 19.2.1 集成 Curator
- 19.2.2 Curator api
- 19.3 分布式鎖實現
- 19.4 服務注冊
- 19.4.1 服務注冊
- 19.4.2 獲取服務
- 19.5 領導選取
- 19.6 屏障
- 20 監控SpringBoot應用
- 20.1 安裝Acutator
- 20.2 HTTP 跟蹤
- 20.3 日志查看
- 20.4 線程棧信息
- 20.5 內存信息
- 20.6 查看URL映射
- 20.7 查看Spring管理Bean
- 20.8 其他監控
- 20.9 編寫自己的監控信息
- 20.9.1 編寫HealthIndicator
- 20.9.2 自定義監控。