為什么寫這本書
在互聯(lián)網(wǎng)時代,互聯(lián)網(wǎng)產(chǎn)品的最大特點就是需要快速發(fā)布新功能,支持高并發(fā)和大數(shù)據(jù)。傳統(tǒng)的架構(gòu)已經(jīng)慢慢不能支撐互聯(lián)網(wǎng)業(yè)務(wù)的發(fā)展,這時微服務(wù)架構(gòu)便順勢而出。
最開始,國內(nèi)很多公司都是基于阿里開源的 Dubbo 框架來構(gòu)建微服務(wù)的,由于阿里內(nèi)部的原因,Dubbo 已經(jīng)幾年沒進行維護了,不過在2018年,阿里宣布重新開始維護。反觀Spring Cloud,其在國外發(fā)展得很好,但在國內(nèi),由于 Dubbo 的存在導(dǎo)致Spring Cloud鮮為人知。不過從 2017 年開始,Spring Cloud 在國內(nèi)的普及度逐漸變高,很多中小型互聯(lián)網(wǎng)公司都開始擁抱 Spring Cloud。
Spring Cloud 提供一整套微服務(wù)的解決方案,基于 Spring Boot 可實現(xiàn)快速集成,且開發(fā)效率很高,堪稱中小型互聯(lián)網(wǎng)公司微服務(wù)開發(fā)的福音。而且 Spring Cloud 發(fā)布新功能的頻率非常高, 目前僅大版本就有很多個,同時還有龐大的社區(qū)支持,照這樣的發(fā)展勢頭,我相信未來幾年國內(nèi)互聯(lián)網(wǎng)公司的公布式系統(tǒng)開發(fā)一定是 Spring Cloud 的天下。
我一直在使用 Spring Boot、Spring Data 等一系列框架來進行開發(fā),作為一名 Spring Cloud的忠實粉絲,自然希望能夠有更多開發(fā)者參與進來,于是自己堅持寫 Spring Cloud 相關(guān)的文章,并且將文章涉及的代碼整理好放在 GitHub 上面進行分享。在這個過程中我得到了很多開發(fā)者的關(guān)注,他們向我咨詢一些微服務(wù)方面的問題,我也會在研究和解決了一些問題后,通過文章分享給各位開發(fā)者。在有幸結(jié)識了華章的楊老師后,我決定將這些文章整理成書,目的是想推廣 Spring Cloud 在國內(nèi)的使用和發(fā)展,并分享自己在微服務(wù)領(lǐng)域的一些小經(jīng)驗。
讀者對象
Java開發(fā)工程師
Spring Cloud用戶和愛好者
微服務(wù)愛好者
本書的讀者對象主要是 Java 開發(fā)人員,特別是工作 1~3 年的開發(fā)人員,這個階段的開發(fā)人員資歷尚淺,需要一些實用的技術(shù)和經(jīng)驗來提升自己,Spring Cloud 正是一門符合提升要求的技術(shù)。因為它現(xiàn)在正處于快速發(fā)展的階段,越來越多的企業(yè)也開始使用 Spring Cloud。相信在不久的將來,熟練掌握Spring Cloud 將會成為 Java 開發(fā)人員面試的門檻。
本書內(nèi)容
本書主打的是與微服務(wù)相關(guān)的實戰(zhàn)體系。第一部分是準備篇,可以幫助各位讀者了解微服務(wù)以及 Spring Cloud 的概念。第二部分是基礎(chǔ)篇,會對 Spring Cloud 中常用的模塊進行詳細講解。第三部分是實戰(zhàn)篇,開始實戰(zhàn)性質(zhì)的內(nèi)容講解,包括選擇配置中心、自研發(fā)配置中心、分布式跟蹤、微服務(wù)安全認證、Spring Boot Admin 管理微服務(wù)、快速生成 API 文檔等實用內(nèi)容。
最后一部分是高級篇,也是難度比較大的一部分,主要內(nèi)容如下:
對 Zuul 進行擴展,即對認證、限流、降級、灰度發(fā)布等內(nèi)容進行講解。
講解緩存框架的使用,解決緩存穿透、緩存雪崩等問題。
數(shù)據(jù)存儲的選型,比如對 MySQL、MongoDB、ElasticSearch 的使用進行講解。
分布式事務(wù)的解決方案,重點是利用消息隊列開發(fā)可靠性消息服務(wù)來實現(xiàn)數(shù)據(jù)的最終一致性。
講解分布式任務(wù)調(diào)度框架 Elastic-Job。
講解分庫分表的解決方案 Sharding-JDBC。
勘誤和支持
由于水平有限,書中難免會出現(xiàn)一些不準確的地方,懇請讀者批評指正。為此,特貼出本書源碼地址 https://github.com/yinjihuan/spring-cloud。如果你遇到任何問題或者有其他寶貴意見,歡迎發(fā)送郵件至郵箱 jihuan900@126.com,期待能夠得到你們的真摯反饋。
致謝
首先要感謝 Spring Cloud 的各位開發(fā)人員,感謝你們開發(fā)出這樣一個好用的框架。
感謝機械工業(yè)出版社華章公司的楊福川老師,是你在這半年多的時間中始終支持我的寫作,正因為有你的鼓勵和幫助,我才能順利完成全部書稿。
感謝機械工業(yè)出版社華章公司的張錫鵬老師,是你在本書的審稿過程中給了我很多實用的建議,讓我學(xué)習(xí)到了很多寫作方面的技巧。
最后感謝家人的支持和理解,讓我能夠把全部精力投入到本書的寫作中。謹以此書獻給我最親愛的家人,以及眾多熱愛 Spring Cloud 的朋友們!
Contents 目 錄
贊譽
前言
第一部分 準備篇
第1章 Spring Cloud 與微服務(wù)概述 2
1.1 傳統(tǒng)的單體應(yīng)用 2
1.1.1 改進單體應(yīng)用的架構(gòu) 2
1.1.2 向微服務(wù)靠攏 3
1.2 什么是微服務(wù) 4
1.2.1 使用微服務(wù)架構(gòu)的優(yōu)勢和劣勢 4
1.2.2 重構(gòu)前的準備工作 5
1.3 什么是Spring Cloud 5
1.3.1 Spring Cloud模塊介紹 6
1.3.2 Spring Cloud版本介紹 6
1.4 本章小結(jié) 7
第2章 實戰(zhàn)前的準備工作 8
2.1 開發(fā)環(huán)境的準備 8
2.2 Spring Boot入門 9
2.2.1 Spring Boot簡介 9
2.2.2 搭建Spring Boot項目 9
2.2.3 編寫第一個REST接口 11
2.2.4 讀取配置文件 11
2.2.5 profiles多環(huán)境配置 13
2.2.6 熱部署 13
2.2.7 actuator監(jiān)控 15
2.2.8 自定義actuator端點 17
2.2.9 統(tǒng)一異常處理 18
2.2.10 異步執(zhí)行 20
2.2.11 隨機端口 22
2.2.12 編譯打包 24
2.3 Spring Boot Starter自定義 25
2.3.1 Spring Boot Starter項目創(chuàng)建 25
2.3.2 自動創(chuàng)建客戶端 26
2.3.3 使用Starter 27
2.3.4 使用注解開啟Starter自動構(gòu)建 27
2.3.5 使用配置開啟Starter自動構(gòu)建 28
2.3.6 配置Starter內(nèi)容提示 29
2.4 本章小結(jié) 29
第二部分 基礎(chǔ)篇
第3章 Eureka 注冊中心 32
3.1 Eureka 32
3.2 使用 Eureka 編寫注冊中心服務(wù) 33
3.3 編寫服務(wù)提供者 35
3.3.1 創(chuàng)建項目注冊到Eureka 35
3.3.2 編寫提供接口 36
3.4 編寫服務(wù)消費者 37
3.4.1 直接調(diào)用接口 37
3.4.2 通過Eureka來消費接口 38
3.5 開啟 Eureka 認證 38
3.6 Eureka 高可用搭建 39
3.6.1 高可用原理 39
3.6.2 搭建步驟 40
3.7 常用配置講解 41
3.7.1 關(guān)閉自我保護 41
3.7.2 自定義Eureka的
InstanceID 41
3.7.3 自定義實例跳轉(zhuǎn)鏈接 42
3.7.4 快速移除已經(jīng)失效的服務(wù)信息 43
3.8 擴展使用 44
3.8.1 Eureka REST API 44
3.8.2 元數(shù)據(jù)使用 46
3.8.3 EurekaClient使用 47
3.8.4 健康檢查 49
3.8.5 服務(wù)上下線監(jiān)控 50
3.9 本章小結(jié) 51
第4章 客戶端負載均衡 Ribbon 52
4.1 Ribbon 52
4.1.1 Ribbon模塊 52
4.1.2 Ribbon 使用 53
4.2 RestTemplate結(jié)合 Ribbon 使用 54
4.2.1 使用RestTemplate與整合 Ribbon 54
4.2.2 RestTemplate負載均衡示例 57
4.2.3 @LoadBalanced注解原理 58
4.2.4 Ribbon API 使用 62
4.2.5 Ribbon 饑餓加載 63
4.3 負載均衡策略介紹 64
4.4 自定義負載策略 65
4.5 配置詳解 66
4.5.1 常用配置 66
4.5.2 代碼配置 Ribbon 67
4.5.3 配置文件方式配置Ribbon 67
4.6 重試機制 68
4.7 本章小結(jié) 69
第5章 聲明式REST客戶端Feign 70
5.1 使用 Feign 調(diào)用服務(wù)接口 70
5.1.1 在Spring Cloud中集成Feign 71
5.1.2 使用Feign調(diào)用接口 71
5.2 自定義 Feign的配置 72
5.2.1 日志配置 72
5.2.2 契約配置 73
5.2.3 Basic認證配置 74
5.2.4 超時時間配置 75
5.2.5 客戶端組件配置 75
5.2.6 GZIP壓縮配置 76
5.2.7 編碼器解碼器配置 77
5.2.8 使用配置自定義Feign的配置 78
5.2.9 繼承特性 78
5.2.10 多參數(shù)請求構(gòu)造 80
5.3 脫離 Spring Cloud 使用 Feign 80
5.3.1 原生注解方式 81
5.3.2 構(gòu)建Feign對象 82
5.3.3 其他配置 83
5.4 本章小結(jié) 83
第6章 Hystrix服務(wù)容錯處理 84
6.1 Hystrix 84
6.1.1 Hystrix的簡單使用 84
6.1.2 回退支持 85
6.1.3 信號量策略配置 86
6.1.4 線程隔離策略配置 86
6.1.5 結(jié)果緩存 87
6.1.6 緩存清除 88
6.1.7 合并請求 89
6.2 在 Spring Cloud 中使用Hystrix 91
6.2.1 簡單使用 91
6.2.2 配置詳解 92
6.2.3 Feign整合Hystrix服務(wù)容錯 95
6.2.4 Feign中禁用Hystrix 97
6.3 Hystrix監(jiān)控 97
6.4 整合 Dashboard 查看監(jiān)控數(shù)據(jù) 98
6.5 Turbine 聚合集群數(shù)據(jù) 100
6.5.1 Turbine使用 100
6.5.2 context-path導(dǎo)致監(jiān)控失敗 101
6.6 本章小結(jié) 102
第7章 API網(wǎng)關(guān) 103
7.1 Zuul簡介 103
7.2 使用Zuul構(gòu)建微服務(wù)網(wǎng)關(guān) 104
7.2.1 簡單使用 104
7.2.2 集成Eureka 105
7.3 Zuul路由配置 105
7.4 Zuul過濾器講解 106
7.4.1 過濾器類型 106
7.4.2 請求生命周期 107
7.4.3 使用過濾器 108
7.4.4 過濾器禁用 109
7.4.5 過濾器中傳遞數(shù)據(jù) 110
7.4.6 過濾器攔截請求 111
7.4.7 過濾器中異常處理 113
7.5 Zuul容錯和回退 115
7.5.1 容錯機制 115
7.5.2 回退機制 116
7.6 Zuul使用小經(jīng)驗 118
7.6.1 /routes 端點 118
7.6.2 /filters 端點 118
7.6.3 文件上傳 119
7.6.4 請求響應(yīng)信息輸出 121
7.6.5 Zuul自帶的Debug功能 124
7.7 Zuul高可用 126
7.8 本章小結(jié) 127
第三部分 實戰(zhàn)篇
第8章 API 網(wǎng)關(guān)之Spring Cloud Gateway 130
8.1 Spring Cloud Gateway介紹 130
8.2 Spring Cloud Gateway工作原理 131
8.3 Spring Cloud Gateway快速上手 131
8.3.1 創(chuàng)建Gateway項目 131
8.3.2 路由轉(zhuǎn)發(fā)示例 132
8.3.3 整合Eureka路由 133
8.3.4 整合Eureka的默認路由 133
8.4 Spring Cloud Gateway路由斷言工廠 134
8.4.1 路由斷言工廠使用 134
8.4.2 自定義路由斷言工廠 136
8.5 Spring Cloud Gateway過濾器工廠 137
8.5.1 Spring Cloud Gateway過濾器工廠使用 137
8.5.2 自定義Spring Cloud Gateway過濾器工廠 138
8.6 全局過濾器 140
8.7 實戰(zhàn)案例 143
8.7.1 限流實戰(zhàn) 143
8.7.2 熔斷回退實戰(zhàn) 145
8.7.3 跨域?qū)崙?zhàn) 145
8.7.4 統(tǒng)一異常處理 147
8.7.5 重試機制 150
8.8 本章小結(jié) 151
第9章 自研分布式配置管理 152
9.1 自研配置管理框架Smconf簡介 152
9.2 Smconf工作原理 153
9.3 Smconf部署 154
9.3.1 Mongodb安裝 154
9.3.2 Zookeeper 安裝 155
9.3.3 Smconf Server 部署 156
9.4 項目中集成Smconf 157
9.4.1 集成Smconf 157
9.4.2 使用Smconf 158
9.4.3 配置更新回調(diào) 159
9.5 Smconf詳細使用 160
9.5.1 源碼編譯問題 160
9.5.2 后臺賬號管理 160
9.5.3 REST API 161
9.6 Smconf源碼解析 163
9.6.1 Client啟動 163
9.6.2 啟動加載配置 165
9.6.3 配置修改推送原理 166
9.7 本章小結(jié) 167
第10章 分布式配置中心Apollo 168
10.1 Apollo簡介 168
10.2 Apollo的核心功能點 168
10.3 Apollo核心概念 170
10.4 Apollo本地部署 171
10.5 Apollo Portal管理后臺使用 172
10.6 Java中使用Apollo 174
10.6.1 普通Java項目中使用 174
10.6.2 Spring Boot中使用 177
10.7 Apollo的架構(gòu)設(shè)計 179
10.7.1 Apollo架構(gòu)設(shè)計介紹 179
10.7.2 Apollo服務(wù)端設(shè)計 181
10.7.3 Apollo客戶端設(shè)計 188
10.7.4 Apollo高可用設(shè)計 195
10.8 本章小結(jié) 196
第11章 Sleuth 服務(wù)跟蹤 197
11.1 Spring Cloud 集成 Sleuth 197
11.2 整合 Logstash 198
11.2.1 ELK 簡介 198
11.2.2 輸出 JSON 格式日志 198
11.3 整合Zipkin 200
11.3.1 Zipkin數(shù)據(jù)收集服務(wù) 200
11.3.2 項目集成Zipkin發(fā)送調(diào)用鏈數(shù)據(jù) 201
11.3.3 抽樣采集數(shù)據(jù) 203
11.3.4 異步任務(wù)線程池定義 203
11.3.5 TracingFilter 204
11.3.6 監(jiān)控本地方法 205
11.3.7 過濾不想跟蹤的請求 206
11.3.8 用RabbitMq代替 Http 發(fā)送調(diào)用鏈數(shù)據(jù) 206
11.3.9 用 Elasticsearch 存儲調(diào)用鏈數(shù)據(jù) 207
11.4 本章小結(jié) 208
第12章 微服務(wù)之間調(diào)用的安全認證 209
12.1 什么是 JWT 209
12.2 創(chuàng)建統(tǒng)一的認證服務(wù) 210
12.2.1 表結(jié)構(gòu) 210
12.2.2 JWT工具類封裝 210
12.2.3 認證接口 212
12.3 服務(wù)提供方進行調(diào)用認證 212
12.4 服務(wù)消費方申請 Token 214
12.5 Feign 調(diào)用前統(tǒng)一申請 Token 傳遞到調(diào)用的服務(wù)中 216
12.6 RestTemplate調(diào)用前統(tǒng)一申請 Token 傳遞到調(diào)用的服務(wù)中 217
12.7 Zuul中傳遞 Token 到路由的服務(wù)中 218
12.8 本章小結(jié) 219
第13章 Spring Boot Admin 220
13.1 Spring Boot Admin 的使用方法 220
13.1.1 創(chuàng)建 Spring Boot Admin項目 220
13.1.2 將服務(wù)注冊到 Spring Boot Admin 221
13.1.3 監(jiān)控內(nèi)容介紹 223
13.1.4 如何在 Admin 中查看各個服務(wù)的日志 225
13.2 開啟認證 226
13.3 集成 Eureka 227
13.4 監(jiān)控服務(wù) 228
13.4.1 郵件警報 228
13.4.2 自定義釘釘警報 229
13.5 本章小結(jié) 232
第14章 服務(wù)的API文檔管理 233
14.1 Swagger 簡介 233
14.2 集成 Swagger 管理 API 文檔 234
14.2.1 項目中集成 Swagger 234
14.2.2 使用 Swagger 生成文檔 234
14.2.3 在線測試接口 235
14.3 Swagger 注解 236
14.4 Eureka 控制臺快速查看 Swagger 文檔 240
14.5 請求認證 240
14.6 Zuul中聚合多個服務(wù)Swagger 241
14.7 本章小結(jié) 242
第四部分 高級篇
第15章 API 網(wǎng)關(guān)擴展 244
15.1 用戶認證 244
15.1.1 動態(tài)管理不需要攔截的 API 請求 244
15.1.2 創(chuàng)建認證的用戶服務(wù) 246
15.1.3 路由之前的認證 247
15.1.4 向下游微服務(wù)中傳遞認證之后的用戶信息 248
15.1.5 內(nèi)部服務(wù)間的用戶信息傳遞 248
15.2 服務(wù)限流 250
15.2.1 限流算法 250
15.2.2 單節(jié)點限流 251
15.2.3 集群限流 255
15.2.4 具體服務(wù)限流 258
15.2.5 具體接口限流 258
15.3 服務(wù)降級 262
15.4 灰度發(fā)布 264
15.4.1 原理講解 264
15.4.2 根據(jù)用戶做灰度發(fā)布 265
15.4.3 根據(jù) IP 做灰度發(fā)布 268
15.5 本章小結(jié) 268
第16章 微服務(wù)之緩存 269
16.1 Guava Cache 本地緩存 269
16.1.1 Guava Cache 簡介 269
16.1.2 代碼示例 270
16.1.3 回收策略 270
16.2 Redis 緩存 271
16.2.1 用Redistemplate操作 Redis 271
16.2.2 用 Repository 操作 Redis 272
16.2.3 Spring Cache 緩存數(shù)據(jù) 274
16.2.4 緩存異常處理 278
16.2.5 自定義緩存工具類 279
16.3 防止緩存穿透方案 282
16.3.1 什么是緩存穿透 282
16.3.2 緩存穿透的危害 282
16.3.3 解決方案 282
16.3.4 布隆過濾器介紹 283
16.3.5 代碼示例 283
16.4 防止緩存雪崩方案 284
16.4.1 什么是緩存雪崩 284
16.4.2 緩存雪崩的危害 284
16.4.3 解決方案 284
16.4.4 代碼示例 285
16.4.5 分布式鎖方式 285
16.5 本章小結(jié) 286
第17章 微服務(wù)之存儲 287
17.1 存儲選型 287
17.2 Mongodb 288
17.2.1 集成 Spring Data Mongodb 288
17.2.2 添加數(shù)據(jù)操作 288
17.2.3 索引使用 290
17.2.4 修改數(shù)據(jù)操作 291
17.2.5 刪除數(shù)據(jù)操作 293
17.2.6 查詢數(shù)據(jù)操作 294
17.2.7 GridFS操作 295
17.2.8 用 Repository方式操作數(shù)據(jù) 296
17.2.9 自增 ID 實現(xiàn) 300
17.2.10 批量更新擴展 303
17.3 Mysql 304
17.3.1 集成 Spring Jdbc-Template 304
17.3.2 JdbcTemplate代碼示例 305
17.3.3 封裝JdbcTemplate操作Mysql更簡單 305
17.3.4 擴展JdbcTemplate使用方式 306
17.3.5 常見問題 310
17.4 Elasticsearch 312
17.4.1 集成 Spring Data Elasticsearch 312
17.4.2 Repository 示例 312
17.4.3 ElasticsearchTemplate示例 315
17.4.4 索引構(gòu)建方式 318
17.5 本章小結(jié) 319
第18章 微服務(wù)之分布式事務(wù)解決方案 320
18.1 兩階段型 320
18.2 TCC 補償型 321
18.3 最終一致性 321
18.3.1 原理講解 321
18.3.2 創(chuàng)建可靠性消息服務(wù) 323
18.3.3 消息存儲表設(shè)計 324
18.3.4 提供服務(wù)接口 325
18.3.5 創(chuàng)建消息發(fā)送系統(tǒng) 329
18.3.6 消費消息邏輯 332
18.3.7 消息管理系統(tǒng) 335
18.4 最大努力通知型事務(wù) 335
18.5 本章小結(jié) 335
第19章 分布式任務(wù)調(diào)度 336
19.1 Elastic-Job 336
19.1.1 Elastic-Job 介紹 336
19.1.2 任務(wù)調(diào)度目前存在的問題 336
19.1.3 為什么選擇 Elastic-Job 337
19.2 快速集成 338
19.3 任務(wù)使用 339
19.3.1 簡單任務(wù) 339
19.3.2 數(shù)據(jù)流任務(wù) 340
19.3.3 腳本任務(wù) 340
19.4 配置參數(shù)講解 341
19.4.1 注冊中心配置 341
19.4.2 作業(yè)配置 342
19.4.3 dataflow 獨有配置 343
19.4.4 script獨有配置 343
19.5 多節(jié)點并行調(diào)度 344
19.5.1 分片概念 344
19.5.2 任務(wù)節(jié)點分片策略 344
19.5.3 業(yè)務(wù)數(shù)據(jù)分片處理 345
19.6 事件追蹤 347
19.7 擴展功能 349
19.7.1 自定義監(jiān)聽器 349
19.7.2 定義異常處理 349
19.8 運維平臺 350
19.8.1 功能列表 350
19.8.2 部署運維平臺 351
19.8.3 運維平臺使用 351
19.9 使用經(jīng)驗分享 355
19.9.1 任務(wù)的劃分和監(jiān)控 355
19.9.2 任務(wù)的擴展性和節(jié)點數(shù)量 355
19.9.3 任務(wù)的重復(fù)執(zhí)行 355
19.9.4 overwrite 覆蓋問題 356
19.9.5 流水式任務(wù) 356
19.10 本章小結(jié) 357
第20章 分庫分表解決方案 358
20.1 Sharding-JDBC 358
20.1.1 介紹 358
20.1.2 功能列表 359
20.1.3 相關(guān)概念 359
20.2 快速集成 360
20.3 讀寫分離實戰(zhàn) 362
20.3.1 準備數(shù)據(jù) 362
20.3.2 配置讀寫分離 363
20.3.3 驗證讀從庫 363
20.3.4 驗證寫主庫 365
20.3.5 Hint 強制路由主庫 366
20.4 分庫分表實戰(zhàn) 367
20.4.1 常用分片算法 367
20.4.2 使用分片算法 368
20.4.3 不分庫只分表實戰(zhàn) 368
20.4.4 既分庫又分表實戰(zhàn) 372
20.5 分布式主鍵 375
20.6 本章小結(jié) 377
第21章 最佳生產(chǎn)實踐經(jīng)驗 378
21.1 開發(fā)環(huán)境和測試環(huán)境共用Eureka 378
21.2 Swagger和Actuator訪問進行權(quán)限控制 379
21.3 Spring Boot Admin監(jiān)控被保護的服務(wù) 380
21.4 Apollo配置中心簡化版搭建分享 380
21.5 Apollo使用小經(jīng)驗 382
21.5.1 公共配置 382
21.5.2 賬號權(quán)限 383
21.5.3 環(huán)境配置和項目配置 385
21.6 Apollo動態(tài)調(diào)整日志級別 385
21.7 Apollo存儲加密 387
21.8 擴展Apollo支持存儲加解密 390
21.9 Apollo結(jié)合Zuul實現(xiàn)動態(tài)路由 391
21.10 Apollo整合Archaius 393
21.11 Elastic-Job的Spring-Boot-Starter封裝 394
21.12 Spring Boot中Mongodb多數(shù)據(jù)源封裝 396
21.13 Zuul中對API進行加解密 398
21.14 本章小結(jié) 400