2023年9月27日 星期三

微服務開發指南:使用Spring Cloud與Docker

 





|Chapter 01| 使用 Spring 實作微服務架構

1.1. 微服務架構的演變  
1.1.1. 常見的 N 層架構 
1.1.2. 什麼是單體架構? 
1.1.3. 什麼是微服務架構?
1.1.4. 為什麼要改變建構應用程式的方式?
1.2. Spring 社群的微服務技術
1.3. 本書範例專案與相關微服務技術
1.4. 微服務編寫準則與開發模式
1.4.1. 微服務的核心模式
1.4.2. 微服務的路由模式
1.4.3. 微服務的用戶端彈性模式
1.4.4. 微服務的安全模式
1.4.5. 微服務的日誌紀錄和追蹤模式


|Chapter 02| 使用 Spring Cloud 打造微服務生態系統

2.1. Spring Cloud 關鍵技術
2.1.1. Spring Cloud Config
2.1.2. Spring Cloud Service Discovery
2.1.3. Spring Cloud LoadBalancer、Resilience4j
2.1.4. Spring Cloud Gateway
2.1.5. Spring Cloud Stream
2.1.6. Spring Cloud Sleuth、Zipkin
2.1.7. Spring Cloud Security
2.2. 使用 Spring Cloud 的簡單範例
2.3. 本書範例專案
2.3.1. 專案情境與需求
2.3.2. 使用 Spring Initializr 建立專案


|Chapter 03| 使用 Spring Boot 開發微服務程式

3.1. 架構師的任務:設計微服務架構
3.1.1. 解析業務需求
3.1.2. 決定服務粒度
3.1.3. 定義服務介面
3.1.4. 何時不該使用微服務?
3.2. 開發者的任務:使用 Spring Boot 建構微服務
3.2.1. 建立 Controller 類別
3.2.2. 建立 Domain 類別
3.2.3. 建立 Service 類別
3.2.4. 建立多國語系環境
3.2.5. 測試服務
3.3. DevOps 的任務:打造精密的執行環境
3.3.1. 服務組裝:打包和部署微服務
3.3.2. 服務引導:管理微服務的設定
3.3.3. 服務註冊和發現:用戶端如何與微服務通訊
3.3.4. 服務監控:傳達微服務的健康狀況
3.4. 結語


|Chapter 04| 整合 Docker 建構微服務專案與環境

4.1. 應該選擇虛擬機還是容器技術?
4.2. 使用 Docker 容器技術
4.2.1. 什麼是 Docker ?
4.2.2. 安裝 Docker Desktop 與 WSL
4.2.3. 常用 Docker 指令介紹
4.3. 使用 Dockerfile 建立 Docker 映像檔
4.3.1. Dockerfile 的編寫指示介紹
4.3.2. 使用 docker build 指令建構映像檔
4.4. 使用 Docker Compose 定義和管理 Docker 容器群組
4.4.1. Docker Compose 的安裝與簡介
4.4.2. docker-compose.yml 的編寫指示介紹
4.4.3. Docker Compose 的指令介紹
4.5. 整合 Docker 與微服務
4.5.1. 使用 Maven 插件 dockerfile-maven-plugin 支援 Docker
4.5.2. 編寫 Dockerfile
4.5.3. 建構 Docker 映像檔並執行
4.5.4. 使用 Buildpacks 建構 Docker 映像檔
4.5.5. 使用 Docker Compose 啟動服務


|Chapter 05| 使用 Spring Cloud Config Server 管理微服務的設定

5.1. 設定資料的複雜性與管理原則
5.1.1. 設定資料的管理架構
5.1.2. 設定資料的管理實作
5.2. 建構 Spring Cloud Config Server 的微服務用戶端
5.2.1. 設定微服務用戶端讀取 Spring Cloud Config Server 的資料
5.2.2. 使用介面 Environment 或 @Value 讀取設定資料
5.2.3. 微服務用戶端的資料設計
5.3. 建構 Spring Cloud Config Server
5.3.1. 選擇專案的依賴項目
5.3.2. 設定 Spring Cloud Config Server 的啟動類別
5.3.3. 使用檔案系統儲存設定資料
5.3.4. 啟動微服務架構的所有服務
5.3.5. 使用 Git 儲存設定資料
5.3.6. 同步讀取 Spring Cloud Config Server 更新後的設定資料
5.4. 保護機敏設定資料
5.4.1. 設定對稱密鑰
5.4.2. 啟用 Spring Cloud Config Server 的自動加解密機制


|Chapter 06| 整合 Netflix Eureka 建構 Service Discovery

6.1. Service Discovery 的需求與目的
6.1.1. Service Discovery 對於微服務的重要性
6.1.2. 使用負載均衡器解析服務位址的缺點
6.2. 雲端的 Service Discovery
6.2.1. Service Discovery 的機制
6.2.2. 使用 Spring Cloud 和 Netflix Eureka 實作 Service Discovery
6.3. 建構 Spring Cloud Eureka 服務 
6.3.1. 建立 Eureka Server 專案 
6.3.2. Eureka Server 的註冊與自我保存機制 
6.4. 向 Spring Cloud Eureka 註冊服務  
6.4.1. 建立查詢 Eureka Server 的微服務程式
6.4.2. 使用 Eureka Server 的儀表板與 REST API
6.5. 使用 Eureka Server 查找服務實例
6.5.1. 使用支援負載均衡的 RestTemplate 呼叫服務實例
6.5.2. 使用 DiscoveryClient 與標準 RestTemplate 元件呼叫服務實例
6.5.3. 使用 Netflix Feign 的用戶端程式呼叫服務實例


|Chapter 07| 整合 Resilience4j 建立彈性與容錯的微服務架構

7.1. 用戶端彈性模式簡介
7.1.1. 用戶端負載均衡 (Client-Side Load Balancing) 模式
7.1.2. 斷路器 (Circuit Breaker) 模式 
7.1.3. 回退 (Fallback) 模式
7.1.4. 隔板 (Bulkhead) 模式
7.2. 以 Resilience4j 實作用戶端彈性模式
7.2.1. 未使用彈性模式的情境
7.2.2. 使用彈性模式的情境
7.2.3. 使用 Book 微服務專案實作彈性模式
7.3. 實作斷路器 (Circuit Breaker) 模式
7.3.1. 斷路器的原理  
7.3.2. 查詢資料庫時套用斷路器模式  
7.3.3. 呼叫 Author 微服務時套用斷路器模式  
7.3.4. 自定義斷路器  
7.4. 實作回退 (Fallback) 模式 
7.5. 實作隔板 (Bulkhead) 模式 
7.6. 實作重試 (Retry) 模式 
7.7. 實作頻率限制器 (Rate Limiter) 模式 
7.8. 使用 ThreadLocal 追蹤服務呼叫  


|Chapter 08| 使用 Spring Cloud Gateway 支援服務路由

8.1. 簡介 Service Gateway 
8.2. 導入 Spring Cloud Gateway
8.2.1. 建構 Spring Cloud Gateway 專案
8.2.2. 設定 Spring Cloud Gateway 與 Eureka Server 的關聯
8.3. 設定 Spring Cloud Gateway 服務路由
8.3.1. Spring Cloud Gateway 是反向代理
8.3.2. 設定自動映射路由
8.3.3. 設定手動映射路由
8.3.4. 同時使用自動與手動映射路由
8.3.5. 動態重新載入路由設定
8.4. 使用 Spring Cloud Gateway 的 Predicate 與 Filter 工廠
8.4.1. 使用內建的 Predicate 工廠設定路由
8.4.2. 使用內建的 Filter 工廠設定路由
8.4.3. 自定義前置與後置 Filter 追蹤服務呼叫
8.5. 自定義 Spring Cloud Gateway 的前置 Filter 與建立關聯 ID
8.6. 完備關聯 ID 在服務內的追蹤流程
8.6.1. 建立 UserContextFilter 攔截並讀取 HTTP 標頭資訊
8.6.2. 建立 UserContext 與 UserContextHolder 保存 HTTP 標頭資訊
8.6.3. 建立 UserContextInterceptor 和 RestTemplate 傳播關聯 ID
8.7. 自定義 Spring Cloud Gateway 的後置 Filter 並回應關聯 ID 至用戶端


|Chapter 09| 使用 Keycloak 保護微服務架構

9.1. 簡介 OAuth2
9.2. 簡介 Keycloak
9.3. 建立與設定 Keycloak
9.3.1. 使用 Docker 啟動 Keycloak
9.3.2. 建立 Realm
9.3.3. 建立用戶端程式
9.3.4. 建立 Realm 角色
9.3.5. 建立使用者
9.3.6. 取得 OAuth2 的存取令牌
9.4. 使用 Keycloak 保護微服務 
9.4.1. 新增 Spring Security 與 Keycloak 的 Maven 依賴項目  
9.4.2. 設定微服務連線 Keycloak  
9.4.3. 建立設定類別與限制端點存取  
9.4.4. 使用存取令牌驗證保護機制 
9.5. 整合 Keycloak 與 Service Gateway  
9.5.1. 存取令牌的傳播流程 
9.5.2. 設定 Service Gateway 傳播 Authorization 標頭 
9.5.3. 設定 Book 服務啟用 Keycloak 保護  
9.5.4. 傳播存取令牌  
9.6. 解析存取令牌中的自定義資訊 
9.7. 更完整的微服務安全性架構  
9.7.1. 對所有服務通訊使用 HTTPS/SSL  
9.7.2. 呼叫所有服務均透過 Service Gateway  
9.7.3. 將 API 區分公開區域和私有區域  
9.7.4. 封鎖服務裡非必要開放的通訊埠  


|Chapter 10| 使用 Spring Cloud Stream 支援事件驅動架構

10.1. 訊息傳遞、事件驅動架構和微服務的案例  
10.1.1. 簡介訊息代理與訊息傳遞模型  
10.1.2. 使用同步的請求與回應模型傳達服務間狀態變化
10.1.3. 使用訊息傳遞模型傳達服務間狀態變化
10.1.4. 訊息架構的注意事項
10.2. 使用 Spring Cloud Stream
10.2.1. 簡介 Spring Cloud Stream
10.2.2. 設定 Apache Kafka 的 Docker 環境
10.2.3. 在微服務專案中建立訊息生產者
10.2.4. 在微服務專案中建立訊息消費者
10.2.5. 驗證訊息的發送與接收
10.3. 結合 Redis 與 Spring Cloud Stream
10.3.1. 設定 Redis 的 Docker 環境
10.3.2. 使用 Redis 快取
10.4. 使用 Spring Cloud Stream 的函數式編程模型
10.4.1. 調整訊息生產者改使用函數式編程模型 
10.4.2. 調整訊息消費者改使用函數式編程模型 


|Chapter 11| 使用 Spring Cloud Sleuth 與 Zipkin 追蹤微服務架構

11.1. 簡介 Spring Cloud Sleuth
11.1.1. 微服務架構下追蹤與除錯的難題
11.1.2. 使用 Spring Cloud Sleuth 追蹤服務軌跡
11.2. 使用 Spring Cloud Sleuth 與 ELK Stack 彙整日誌紀錄
11.2.1. 整合 ELK Stack 與 Spring Cloud Sleuth
11.2.2. 在服務中設定 Logback
11.2.3. 在 Docker 中定義和運行 ELK Stack 服務
11.2.4. 使用 Kibana 查詢日誌紀錄彙整結果
11.2.5. 在 Service Gateway 將追蹤 ID 新增到 HTTP 回應標頭
11.2.6. 由 Spring Boot 3.x 開始將停止支援 Spring Cloud Sleuth 
11.3. 使用 Zipkin 進行分散式追蹤 
11.3.1. 設定 Zipkin 
11.3.2. 使用 Zipkin 追蹤跨服務操作  
11.3.3. 使用 Zipkin 追蹤訊息傳遞 
11.3.4. 新增自定義跨度