Ⅰ 求java學習路線圖
/*回答內容很長,能看完的少走一個月彎路,絕不抖機靈*/
提前預警:本文適合Java新手閱讀(老手可在評論區給下建議),希望大家看完能有所收獲。
廢話不多少了,先了解一下Java零基礎入門學習路線:
第一階段:JavaSE階段
變數、數據類型、運算符
二進制和十進制的轉化
注釋、單行注釋、多行注釋、文本注釋、注釋內容和位元組碼的關系
標識符、關鍵字、駝峰原則
變數的本質、內存畫圖、變數聲明和初始化
變數的分類和作用域(局部變數、成員變數、靜態變數)
常量和Final
基本數據類型介紹
整型變數和整型常量
浮點類型、float、double
char字元型、轉義字元
boolean布爾型、if語句使用要點、布爾類型佔用空間問題
運算符介紹
算數運算符(二元、自增、自減)
賦值和賦值運算符
關系運算符詳解
邏輯運算符、短路運算符詳解
位運算符詳解
字元串連接符
條件運算符(三元運算符)
運算符優先順序問題
自動類型轉換詳解
強制類型裝換詳解
基本數據類型裝換常見錯誤、溢出、L問題
使用Scanner獲取鍵盤輸入
控制語句
控制語句和實現邏輯對應
if單選結構
if_elseif_else多選結構
switch語句_IDEA更換主題
循環_while
循環_for循環_dowhile
嵌套循環
break和continue語句_標簽_控制語句底層原理
寫一個年薪計算機_網路查問題的秘訣(重要)
個人所得稅計算器軟體
方法核心詳解_天才思維模型教你高手學習思維模式
方法的重載
遞歸結構講解_遞歸頭_遞歸體
面向對象編程-基礎
面向過程和面向對象的區別
類和對象的概述
類的屬性和方法
創建對象內存分析
構造方法(Construtor)及重載
對象類型的參數傳遞
this關鍵字
static關鍵字詳解
局部代碼塊、構造代碼塊和靜態代碼塊
package和import詳解
JavaDoc生成API文檔
面向對象編程-進階
面向對象的三大特性
面向對象之【封裝(Encapsulation)】
訪問許可權修飾符
面向對象之【繼承(Inheritance)】
Object類
方法重寫Override
super關鍵字詳解
重寫equals()和toString()
繼承中對象創建的內存分析
面向對象之【多態(Polymorphism)】
向上轉型
向下轉型
instanceof運算符
編譯時和運行時詳解
final修飾符
抽象類和抽象方法(abstrct)
介面的定義和實現
JDK8的介面新特性
介面應用:內部類比較器Comparable
內部類詳解
Java的內存管理與垃圾回收
異常機制
異常的概述
異常的執行過程與分析
try-catch-finally捕捉異常
throw拋出異常
throws聲明異常
異常繼承體系
運行時異常和編譯異常
自定義異常
Java常用類
Wrapper包裝類
自動裝箱和自動拆箱
包裝類的源碼分析
String類的使用與內存原理
String類的源碼分析
StringBuffer
StringBuilder
字元串處理類性能分析
Date類
System類
DateFormat類
Calendat類
Math類
BigInteger類和BigDecimal類
Random類
枚舉類
File類
常見的面試題講述與分析
數據結構的概述
線性表
順序表
鏈表
棧和隊列
樹
二叉樹
二叉查找樹
二叉平衡樹
黑紅樹
圖
冒泡排序
選擇排序
遞歸
折半查找
集合和數組的聯系和區別
集合框架體系
ArrayList的使用和源碼分析
集合中使用泛型
LinkedList的使用和源碼分析
HashSet的使用和源碼分析
哈希表及原理
TreeSet的使用和源碼分析
比較器Comparable和Comparator
HashMap的使用和源碼分析
TreeMap的使用和源碼分析
Iterator於ListIterator
Collections工具類
舊集合類Vector、Hashtable
集合總結和選擇依據
泛型介面
泛型類
泛型方法
IO流的概念
IO流的分類及其原理分析
文件流FlieInputStream、FileOutputStream
緩沖流BufferedInputStream、BufferedOutputStream
數據流ObjectInputStream、ObjectOutputStream
序列化和反序列化
轉換流InputStreamReader、OutputStreamWriter
列印流PrintWrite和PrintStream
數組流ByteArrayOutputStream、ByteArrayInputStream
使用IO復制文件夾
進程和線程
線程的創建與啟動
創建線程的三種方式對比
線程的生命周期
線程式控制制
多線程的安全問題與解決辦法
線程的同步:同步代碼塊
線程的同步:同步方法
線程的同步:Lock鎖
線程的死鎖問題
線程通信
Condition
線程的完整生命周期
線程池ThreadPoolExecutor
ForkJoin框架
ThreadLocal類
計算機網路基礎知識
網路通信協議
OSI參考模型
TCP/IP參考模型
數據的封裝與拆封原理解析
TCP協議
UDP協議
IP地址和埠號
URL和Socket
使用TCP編程實現登錄功能
使用UDP編程實現客服系統
使用TCP編程實現文件上傳
手寫ArrayList
手寫單鏈表
手寫Linkedlist
手寫HashMap
手寫HashSet
最新並發集合類
生產者消費者模式擴展
Lock鎖和Condition
ReadWriteLock
BlockingQueue
volatile關鍵字
多線程題目練習
JDK新特徵
面試題詳解
設計模式入門
面向對象設計七大原則
簡單工廠模式
工廠方法模式
單例模式
原型模式
裝飾模式
適配器模式
外觀模式
數據結構演算法
集合(容器)
IO流
多線程
網路編程
集合提升尋訓練
多線程提升訓練
設計模式
第二階段:資料庫
資料庫基礎知識
MySQL基礎知識
MySQL8新特徵
安裝和卸載MySQL8
使用navicat訪問資料庫
SQL語言入門
創建資料庫表
DML
修改刪除資料庫表
表的完整性約束
表的外鍵約束
DML擴展
基本select查詢
where子句
函數
group by
having
SQL99-內連接查詢
SQL99-外連接查詢
SQL99-自連接查詢
SQL92-連接查詢
不相關子查詢
相關子查詢
分頁查詢
索引
事務及其特徵
事務的並發問題
事務的隔離級別
存儲過程
導入導出數據
JDBC概述
使用JDBC完成添加/更新/刪除操作
使用JDBC完成查詢操作
JDBC常用介面
使用PreparedStatement
使用事務完成銀行轉賬
提取DBUtil工具類
使用Properties讀寫屬性文件
日誌框架log4j
開發員工管理系統
Mysql基礎
MySQL 查詢語句
資料庫對象
JDBC
第三階段:JavaEE階段
web開發概述
B/S和C/S架構簡介
HTTP協議
HTTP請求頭和響應頭
Tomcat安裝使用
Tomcat目錄結構
Servlet概述
Servlet快速入門
Servlet生命周期
讀取配置文件信息
HttpServletRequest
HttpServletResponse
GET和POST區別
解決中文亂碼
請求轉發與重定向
絕對路徑和相對路徑
Cookie
Session
ServletContext
ServletConfig
JSP技術介紹
JSP的執行過程
scriptlet
表達式
聲明
JSP指令元素
JSP動作元素
JSP隱式對象
JSP底層原理
九大內置對象
四個作用域
Servlet和JSP的關系和區別
MVC模式
合並Servlet
JavaScript概述與特點
JS基礎語法
函數
數組
Math對象
String對象
Date對象
事件event
瀏覽器開發者工具
console
DOM和BOM
window
location
navigator
history
認識DOM
DOM獲取元素
jQuery簡介及快速入門
jQuery入口函數
jQuery對象與DOM對象互相轉換
基本選擇器
屬性選擇器
位置選擇器
表單選擇器
內容選擇器
jQuery事件
jQuery動畫效果
DOM操作-操作文本
DOM操作-操作屬性
DOM操作-操作元素
直接操作CSS樣式
操作CSS類樣式
購物車案例
表單驗證
正則表達式
EL介紹及使用
EL取值原理
EL隱含對象
EL邏輯運算
JSTL介紹-核心標簽庫
JSTL核心標簽庫
JSTL-格式標簽庫
Filter原理
Filter生命周期
Filter鏈
Filter登錄驗證
Filter許可權控制
Listener概述及分類
Listener監聽在線用戶
Ajax非同步請求和局部刷新的原理
使用原生Ajax驗證用戶唯一性
jQuery Ajax
JSON的格式和使用
主要JSON解析器
Jackson的使用
Jackson的實現原理
使用jQuery Ajax實現三級聯動
使用jQuery Ajax實現自動補全
分頁的意義
理解分頁工具類
實現基本分頁
實現帶查詢的分頁
文件上傳原理
文件上傳API
實現文件上傳
文件下載原理
文件下載響應頭
實現文件下載
Servlet
JSP
JavaScript
jQuery
EL+JSTL+過濾器+監聽器
Ajax和JSON
分頁和文件上傳/下載
第四階段:框架階段
MyBatis概述
MyBatis入門配置
基本的CRUD操作
核心配置文件詳解
Mapper.xml基礎詳解
模糊查詢
分頁的實現及插件PageHelper的使用
動態sql+sql片段的使用
一對多、多對一的關系處理
註解的使用
一級緩存和二級緩存說明及使用
generator逆向工程使用
Spring框架簡介
Spring官方壓縮包目錄介紹
Spring環境搭建
IoC/DI容器詳解
Spring創建Bean的三種方式
scope屬性講解
Spring中幾種注入方式
靜態代理設計模式
動態代理設計模式
AOP詳解
AOP中幾種通知類型
AOP兩種實現方式
自動注入
聲明式事務
事務傳播行為
事務隔離級別
只讀事務
事務回滾
基於註解式配置
常用註解
Spring 整合MyBatis
i18n
Spring整合Junit
MVC架構模式
手寫MVC框架
SpringMVC簡介
SpringMVC運行原理
基於配置文件方式搭建環境
基於註解方式搭建環境
SpringMVC的跳轉及視圖解析器的配置
SpringMVC和Ajax的交互
Spring 參數注入
SpringMVC作用域傳值
視圖解析器
文件下載
文件上傳
Spring攔截器/攔截器棧
登錄狀態驗證
SpringMVC容器和Spring容器介紹
異常處理4種方式
SpringMVC5其他常用註解
Maven簡介
Maven原理
Linux安裝及注意事項
Maven項目結構
POM模型
Maven 中項目類型
創建WAR類型的Maven項目
scope屬性可取值
SSM項目拆分演示
Maven的常見插件講解
熱部署
BootStrap概述
BootStrap柵格系統
BootStrap常用全局CSS樣式
常用組件
常用JavaScript插件
RBAC概述
RBAC發展歷史
基於RBAC的資料庫表設計
URL攔截實現
動態菜單實現
密碼學
MyBatis
Spring
SpringMVC
Maven
BootStrap
RBAC
第五階段:前後端分離階段
Spring Boot簡介
Spring Boot實現Spring MVC
配置文件順序及類型講解
Spring Boot項目結構
Spring Boot 整合MyBatis
Spring Boot 整合Druid
Spring Boot 整合PageHelper
Spring Boot 整合logback
Spring Boot 整合JSP
Spring Boot 整合Thymeleaf
Spring Boot 開發者工具
Spring Boot 異常顯示頁面
Spring Boot 整合Junit4
Spring Boot 項目打包部署
Spring Boot 整合Quartz
Spring Boot 中Interceptor使用
Spring Boot Actuator
HikariCP
Logback簡介
Logback依賴說明
Logback 配置文件講解
Logback 控制台輸出
Logback 文件輸出
Logback 資料庫輸出
Spring Security簡介
Spring Security架構原理
什麼是認證和授權
基礎環境搭建
自定義認證流程
UserDetailsService和UserDetails
PasswordEncoder
自定義認證結果
授權-訪問路徑匹配方式
授權-許可權管理
基於註解實現許可權管理
Thymeleaf整合Security許可權管理
Rememberme 實現
退出實現
CSRF
Linux簡介
VMWare安裝及使用
Linux安裝及注意事項
Linux目錄結構及路徑
Linux常用命令
VMWare常用配置
XShell安裝及使用
Xftp安裝及使用
JDK解壓版配置步驟
Tomcat配置步驟
安裝MySQL
WAR包部署
Docker簡介
Docker與VM對比
Docker特點
Docker架構
Docker安裝與啟動
鏡像加速器配置
Docker鏡像操作常用命令
Docker容器操作常用命令
DockerFile
搭建本地鏡像倉庫
推送鏡像到阿里雲及本地倉庫
Docker容器生命周期
Docker數據管理
Redis簡介
Redis 單機版安裝
Redis 數據類型介紹
Redis 常用命令
Redis 持久化方案
Redis 的主從搭建
Redis的哨兵搭建
Redis 的集群搭建
Spring Boot整合Spring Data Redis
Redis的緩存穿透
Redis的緩存雪崩
Redis的緩存擊穿
vsCode和插件安裝
webpack介紹
Vue項目創建
Vue模板語法
Vue條件渲染
Vue列表渲染
Vue事件處理
Vue計算屬性
Vue Class與Style
Vue表單處理
Vue組件
Vue組件生命周期
Vue 路由配置
Vue Axios網路請求
Vue跨域處理
Vue Element
Mock.js
Swagger2簡介
Springfox
Swagger2基本用法
Swagger-UI用法
Swagger2配置
Swagger2常用配置
Git的下載和安裝
Git和SVN對比
Git創建版本庫
Git版本控制
Git遠程倉庫
Git分支管理
Git標簽管理
GitEE建庫
GitEE 連接及使用
GitEE 組員及管理員配置
Spring Boot
Logback
Spring Security
Linux - CentOS 8
Docker
Redis
Vue
Swagger
Git/GitEE
第六階段:微服務架構
分布式文件系統概述
FastDFS簡介
FastDFS架構
Tracker Server
Storage Server
FastDFS安裝
安裝帶有FastDFS模塊的Nginx
Fastdfs-java-client的使用
創建Fastdfs-java-client工具類
實現文件上傳與下載
KindEditor介紹
通過KindEditor實現文件上傳並回顯
AMQP簡介
RabbitMQ簡介
安裝Erlang
安裝RabbitMQ
RabbitMQ原理
Spring Boot 集成RabbitMQ
RabbitMQ的交換器
Spring AMQP的使用
Eureka簡介
Eureka和Zookeeper 對比
搭建Eureka注冊中心
Eureka 服務管理平台介紹
搭建高可用集群
集群原理
Eureka優雅停服
Ribbon簡介
集中式與進程內負載均衡區別
Ribbon常見的負載均衡策略
Ribbon的點對點直連
Feign簡介
Feign的請求參數處理
Feign的性能優化
配置Feign負載均衡請求超時時間
Hystrix簡介
服務降級
服務熔斷
請求緩存
Feign的雪崩處理
可視化的數據監控Hystrix-dashboard
Spring Cloud Gateway簡介
Gateway基於配置文件實現路由功能
Gateway基於配置類實現路由功能
Gateway中內置過濾器的使用
Gateway中自定義GatewayFilter過濾器的使用
Gateway中自定義GlobalFilter過濾器的使用
Gateway中使用過濾器實現鑒權
Gateway結合Hystrix實現熔斷功能
什麼是分布式配置中心
創建配置中心服務端
創建配置中心客戶端
基於Gitee存儲配置文件
基於分布式配置中心實現熱刷新
什麼是消息匯流排
基於消息匯流排實現全局熱刷新
ElasticSearch介紹
ElasticSearch單機版安裝
ElasticSearch集群版安裝
ElasticSearch索引管理
ElasticSearch文檔管理
ElasticSearch文檔搜索
SpringDataElasticSearch訪問ElasticSearch
LogStash介紹
基於LogStash收集系統日誌
分布式事務簡介
分布式事務兩大理論依據
分布式事務常見解決方案
LCN簡介
TX-LCN的3種模式
LCN原理
LCN環境搭建及Demo演示
Nginx的簡介
什麼是正向代理、反向代理
Nginx的安裝
Nginx配置虛擬主機
Nginx配置服務的反向代理
Nginx的負載均衡配置
Spring Session介紹
通過Spring Session共享session中的數據
通過Spring Session同步自定義對象
Spring Session的Redis存儲結構
設置Session失效時間
Spring Session序列化器
MyBatis Plus簡介
Spring整合MyBatis Plus
MyBatis Plus的全局策略配置
MyBatis 的主鍵生成策略
MyBatis Plus的CRUD操作
條件構造器EntityWrapper講解
MyBatis Plus的分頁插件配置
MyBatis Plus的分頁查詢
MyBatis Plus的其他插件講解
MyBatis Plus的代碼生成器講解
MyBatis Plus的公共欄位自動填充
簡介
資料庫切分方式
基本概念
MySQL主從配置
切片規則
讀寫分離
實現分庫分表
FastDFS
RabbitMQ
Spring Cloud Netflix Eureka
Spring Cloud Netflix Ribbon
Spring Cloud OpenFeign
Spring Cloud Netflix Hystrix
Spring Cloud Gateway
Spring Cloud Config
Spring Cloud Bus
ELK
TX-LCN
Nginx
Spring Session
MyBatis Plus
ShardingSphere
第七階段:雲服務階段
Kafka簡介
Kafka架構
分區和日誌
Kafka單機安裝
Kafka集群配置
自定義分區
自動控制
Spring for Apache Kafka
Zookeeper簡介和安裝
Zookeeper 數據模型
Zookeeper 單機版安裝
Zookeeper常見命令
ZClient操作Zookeeper
Zookeeper 集群版安裝
Zookeeper 客戶端常用命令
Zookeeper分布式鎖
什麼是分布式架構
什麼是RFC、RPC
HttpClient實現RPC
RestTemplate
RMI實現RPC
基於Zookeeper實現RPC 遠程過程調用
SOA架構介紹
Dubbo簡介
Dubbo結構圖
Dubbo注冊中心
Dubbo 支持的協議
Dubbo 注冊中心搭建
Spring Boot 整合 Dubbo
Admin管理界面
Dubbo 搭建高可用集群
Dubbo 負載均衡
Spring Cloud Alibaba Dubbo簡介
基於Zookeeper發布服務
基於Zookeeper訂閱服務
實現遠程服務調用處理
Spring Cloud Alibaba Nacos簡介
搭建Nacos伺服器
基於Nacos發布|訂閱服務
實現遠程服務調用處理
Nacos Config配置中心
Spring Cloud Alibaba Sentinel簡介
搭建Sentinel伺服器
Sentinel-實時監控
Sentinel-簇點鏈路
Sentinel-授權規則
Sentinel-系統規則
@SentinelResource註解
持久化規則
Spring Cloud Alibaba Seata簡介
搭建Seata伺服器
Seata支持的事務模式-AT模式
Seata支持的事務模式-TCC模式
Seata支持的事務模式-Saga模式
Seata支持的事務模式-XA模式
SeataAT事務模式應用方式
SeataTCC事務模式應用方式
Kafka
Zookeeper
RPC
Dubbo
Spring Cloud Alibaba Dubbo
Spring Cloud Alibaba Nacos
Spring Cloud Alibaba Sentinel
Spring Cloud Alibaba Seata
Ⅱ Spring Cloud全家桶主要組件及簡要介紹
一、微服務簡介
微服務是最近的一兩年的時間里是很火的一個概念。感覺不學習一下都快跟不上時代的步伐了,下邊做一下簡單的總結和介紹。
何為微服務?簡而言之,微服務架構風格這種開發方法,是以開發一組小型服務的方式來開發一個獨立的應用系統的。其中每個小型服務都運行在自己的進程中,並經常採用HTTP資源API這樣輕量的機制來相互通信。這些服務圍繞業務功能進行構建,並能通過全自動的部署機制來進行獨立部署。這些微服務可以使用不同的語言來編寫,並且可以使用不同的數據存儲技術。對這些微服務我們僅做最低限度的集中管理。
一個微服務一般完成某個特定的功能,比如下單管理、客戶管理等等。每一個微服務都是微型六角形應用,都有自己的業務邏輯和適配器。一些微服務還會發布API給其它微服務和應用客戶端使用。其它微服務完成一個Web UI,運行時,每一個實例可能是一個雲VM或者是Docker容器。
比如,一個前面描述系統可能的分解如下:
總的來說,微服務的主旨是將一個原本獨立的系統拆分成多個小型服務,這些小型服務都在各自獨立的進程中運行,服務之間通過基於HTTP的RESTful API進行通信協作,並且每個服務都維護著自身的數據存儲、業務開發、自動化測試以及獨立部署機制。
二、微服務的特徵
1、每個微服務可獨立運行在自己的進程里;
2、一系列獨立運行的微服務共同構建起了整個系統;
3、每個服務為獨立的業務開發,一個微服務一般完成某個特定的功能,比如:訂單管理、用戶管理等;
4、微服務之間通過一些輕量的通信機制進行通信,例如通過REST API或者RPC的方式進行調用。
三、微服務的優缺點
1、易於開發和維護
2、啟動較快
3、局部修改容易部署
4、技術棧不受限
5、按需伸縮
6、DevOps
四、常見微服務框架
1、服務治理框架
(1)Dubbo、Dubbox(當當網對Dubbo的擴展)
最近的好消息是Dubbo已近重新開始進行運維啦!
(2)Netflix的Eureka、Apache的Consul等。
Spring Cloud Eureka是對Netflix的Eureka的進一步封裝。
2、分布式配置管理
(1)網路的Disconf
(2)360的QConf
(3)Spring Cloud組件中的Config
(3)淘寶的Diamond
3、批量任務框架
(1)Spring Cloud組件中的Task
(2)LTS
4、服務追蹤框架
。。。
五、Spring Cloud全家桶組件
在介紹Spring Cloud 全家桶之前,首先要介紹一下Netflix ,Netflix 是一個很偉大的公司,在Spring Cloud項目中占著重要的作用,Netflix 公司提供了包括Eureka、Hystrix、Zuul、Archaius等在內的很多組件,在微服務架構中至關重要,Spring在Netflix 的基礎上,封裝了一系列的組件,命名為:Spring Cloud Eureka、Spring Cloud Hystrix、Spring Cloud Zuul等,下邊對各個組件進行分別得介紹:
(1)Spring Cloud Eureka
我們使用微服務,微服務的本質還是各種API介面的調用,那麼我們怎麼產生這些介面、產生了這些介面之後如何進行調用那?如何進行管理哪?
答案就是Spring Cloud Eureka,我們可以將自己定義的API 介面注冊到Spring Cloud Eureka上,Eureka負責服務的注冊於發現,如果學習過Zookeeper的話,就可以很好的理解,Eureka的角色和 Zookeeper的角色差不多,都是服務的注冊和發現,構成Eureka體系的包括:服務注冊中心、服務提供者、服務消費者。
1、兩台Eureka服務注冊中心構成的服務注冊中心的主從復制集群;
2、然後服務提供者向注冊中心進行注冊、續約、下線服務等;
3、服務消費者向Eureka注冊中心拉去服務列表並維護在本地(這也是客戶端發現模式的機制體現!);
4、然後服務消費者根據從Eureka服務注冊中心獲取的服務列表選取一個服務提供者進行消費服務。
(2)Spring Cloud Ribbon
在上Spring Cloud Eureka描述了服務如何進行注冊,注冊到哪裡,服務消費者如何獲取服務生產者的服務信息,但是Eureka只是維護了服務生產者、注冊中心、服務消費者三者之間的關系,真正的服務消費者調用服務生產者提供的數據是通過Spring Cloud Ribbon來實現的。
在(1)中提到了服務消費者是將服務從注冊中心獲取服務生產者的服務列表並維護在本地的,這種客戶端發現模式的方式是服務消費者選擇合適的節點進行訪問服務生產者提供的數據,這種選擇合適節點的過程就是Spring Cloud Ribbon完成的。
Spring Cloud Ribbon客戶端負載均衡器由此而來。
(3)Spring Cloud Feign
上述(1)、(2)中我們已經使用最簡單的方式實現了服務的注冊發現和服務的調用操作,如果具體的使用Ribbon調用服務的話,你就可以感受到使用Ribbon的方式還是有一些復雜,因此Spring Cloud Feign應運而生。
簡單的可以理解為:Spring Cloud Feign 的出現使得Eureka和Ribbon的使用更為簡單。
(4)Spring Cloud Hystrix
我們在(1)、(2)、(3)中知道了使用Eureka進行服務的注冊和發現,使用Ribbon實現服務的負載均衡調用,還知道了使用Feign可以簡化我們的編碼。但是,這些還不足以實現一個高可用的微服務架構。
例如:當有一個服務出現了故障,而服務的調用方不知道服務出現故障,若此時調用放的請求不斷的增加,最後就會等待出現故障的依賴方 相應形成任務的積壓,最終導致自身服務的癱瘓。
Spring Cloud Hystrix正是為了解決這種情況的,防止對某一故障服務持續進行訪問。Hystrix的含義是:斷路器,斷路器本身是一種開關裝置,用於我們家庭的電路保護,防止電流的過載,當線路中有電器發生短路的時候,斷路器能夠及時切換故障的電器,防止發生過載、發熱甚至起火等嚴重後果。
(5)Spring Cloud Config
對於微服務還不是很多的時候,各種服務的配置管理起來還相對簡單,但是當成百上千的微服務節點起來的時候,服務配置的管理變得會復雜起來。
分布式系統中,由於服務數量巨多,為了方便服務配置文件統一管理,實時更新,所以需要分布式配置中心組件。在Spring Cloud中,有分布式配置中心組件Spring Cloud Config ,它支持配置服務放在配置服務的內存中(即本地),也支持放在遠程Git倉庫中。在Cpring Cloud Config 組件中,分兩個角色,一是Config Server,二是Config Client。
Config Server用於配置屬性的存儲,存儲的位置可以為Git倉庫、SVN倉庫、本地文件等,Config Client用於服務屬性的讀取。
(6)Spring Cloud Zuul
我們使用Spring Cloud Netflix中的Eureka實現了服務注冊中心以及服務注冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及版本管理。為了使得服務集群更為健壯,使用Hystrix的融斷機制來避免在微服務架構中個別服務出現異常時引起的故障蔓延。
先來說說這樣架構需要做的一些事兒以及存在的不足:
1、首先,破壞了服務無狀態特點。為了保證對外服務的安全性,我們需要實現對服務訪問的許可權控制,而開放服務的許可權控制機制將會貫穿並污染整個開放服務的業務邏輯,這會帶來的最直接問題是,破壞了服務集群中REST API無狀態的特點。從具體開發和測試的角度來說,在工作中除了要考慮實際的業務邏輯之外,還需要額外可續對介面訪問的控制處理。
2、其次,無法直接復用既有介面。當我們需要對一個即有的集群內訪問介面,實現外部服務訪問時,我們不得不通過在原有介面上增加校驗邏輯,或增加一個代理調用來實現許可權控制,無法直接復用原有的介面。
面對類似上面的問題,我們要如何解決呢?下面進入本文的正題:服務網關!
為了解決上面這些問題,我們需要將許可權控制這樣的東西從我們的服務單元中抽離出去,而最適合這些邏輯的地方就是處於對外訪問最前端的地方,我們需要一個更強大一些的均衡負載器,它就是本文將來介紹的:服務網關。
服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了許可權控制等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,為微服務架構提供了前門保護的作用,同時將許可權控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集群主體能夠具備更高的可復用性和可測試性。
(7)Spring Cloud Bus
在(5)Spring Cloud Config中,我們知道的配置文件可以通過Config Server存儲到Git等地方,通過Config Client進行讀取,但是我們的配置文件不可能是一直不變的,當我們的配置文件放生變化的時候如何進行更新哪?
一種最簡單的方式重新一下Config Client進行重新獲取,但Spring Cloud絕對不會讓你這樣做的,Spring Cloud Bus正是提供一種操作使得我們在不關閉服務的情況下更新我們的配置。
Spring Cloud Bus官方意義:消息匯流排。
當然動態更新服務配置只是消息匯流排的一個用處,還有很多其他用處。
六、總結
Spring Cloud 的組件還不止這些,通過上邊的口水話的介紹,應該可以大致有一定的了解,但是每一個組件的功能遠不止上述介紹的那些,每一個組件還有很多其他的功能點,這里的介紹希望能夠帶大家入個門,不要對微服務這個這么大的概念有所畏懼。
Ⅲ zookeeper
客戶端的Watcher
String就是節點的path,有三大類。
dataWatches:數據watcher
existWatches:節點是否存在的watcher
childWatches:節點的子節點個數變化,包括:0->1,1->2等等,只要數量變化就觸發。
對於zk的watcher機制,有幾個疑問?
三、ZK的通信協議
分兩類:請求和響應協議。是基於TCP/IP的應用層協議,其實就是規定了應用層報文的格式,以及每個欄位的含義。客戶端和服務端雙方都遵守這種約定,脫離了ZK,其他框架是無法識別這種通信協議的。
請求和響應報文格式,網上搜一下一大堆。這里不再贅述
那麼回到什麼是分布式協調呢?我們就以RPC這種場景來說:
比如我們可以理解上面的圖,一半client是service角色,一半client是consumer角色,然後zk提供了這些client之間的協調 -- 充當consumer角色的client必須依賴於充當service角色提供的服務,這可不就是分布式協調的一種嘛(協調其中一半的client依賴另一半)。當然我們可以繼續擴展:分布式配置中心Disconf,有個client它的角色可以是管理員(配置員),它是一個進程。它向zk某一個節點配置了XX數據,然後其他所有client同時收到最新配置。這可不就是另外一種協調了嘛(其他client依賴這個配置的值執行業務)。
ZooKeeper 是一個典型的分布式數據一致性解決方案,分布式應用程序可以基於 ZooKeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能
乍一看這個定義挺抽象的,一時半會沒理解。其實舉個例子就容易理解的多,比如你有個資源,我們先簡單把該資源當做一個本地文件或本地電影。你為了保證該資源的可靠性,你需要把該資源到3台機器上。那麼這三個資源,在互聯網上就會有三個url地址:機器1/xxx/xxx/xxx.pdf,機器2/xxx/xxx/xxx.pdf,機器3/xxx/xxx/xxx.pdf。請求方為了訪問該資源,肯定不會把這三個地址硬編碼到自己本地,這樣不易拓展。所以這個時候,就需要一個統一命名服務來封裝該資源的三個真實地址,對外只提供一個地址並且永遠可以不變。那麼這個統一命名服務,我們當然可以用http協議來實現,也可以用zk協議(ZAB協議)來實現。
現在理解了上面的內容,那麼我們就容易拓展這個資源的定義了。上面所說的資源,我們可以拓展為一個服務 xxx.xxx.xxx.UserService,該服務的提供方可以有很多個,但是為了封裝真實提供方,我們只能對外暴露一個地址那就是xxx.xxx.xxx.UserService。是不是很熟悉?Dubbo的ZK注冊中心,就是這么乾的。
理解定義我們就不說了,這個很好理解。實際案例咱們可以參考Dubbo的ZK,提供者發布或修改服務真實地址後,消費者可以實時收到變化的通知,然後再去ZK拉取最新數據。這可不就是ZK的發布與訂閱嘛,通過Listener觀察者模式來實現。應用場景很多:RPC服務發現,配置中心的配置分發等等。
所謂集群管理無在乎兩點:是否有機器退出和加入、選舉 Master。
不就是ZK的發布訂閱嘛,沒啥好說的。
這里的maser選舉,可不是ZK內部的master選舉(兩者相差十萬八千里)。這里的master選舉,是指業務調用方,屬於client角色的進程,進行選舉。
業務master選舉其實很簡單,完全沒必要像ZK內部選舉那樣,還要實現一套可靠的選舉演算法(paxos演算法包含了一個提案選舉,paxos演算法可不止一個選舉演算法)。ZK本身提供了一個可靠創建唯一節點的API介面,這個介面保證了並發調用只會有一個成功。那麼業務master選舉,是不是可以轉化為多個業務進程並發調用該API介面,誰創建唯一節點成功了,誰就是master了,其他進程就是slave。怎麼感覺這么像分布式鎖的實現呢?除了少了釋放鎖的通知操作。。。
軟負載均衡也沒啥好說的,就是注冊與發現的變種,或者說發布與訂閱的變種。獲取統一命名服務的所有提供者列表,然後通過負載均衡演算法在這一堆列表中選擇一個,策略可以是隨機選擇,輪訓選擇,Hash一致性選擇等等。。。Dubbo的負債均衡是實現在消費者調用邏輯裡面的,並不在獲取列表介面裡面,ZK不做負載均衡,基於ZK的應用可以做。
和上面的數據發布與訂閱 一模一樣 ,不在贅述。
和上面說的Master選舉很像,都是一堆client角色的業務調用方,調用創建某唯一節點的API。誰創建成功,誰就拿鎖。只不過ZK的底層實現是嚴格按照順序來的,所以必然是ZK接收請求的時候,誰第一個誰拿鎖。注意可不是client誰先請求誰拿鎖。client請求還要經過網路,同時請求是沒法確定哪個client先到達的。
但是光創建唯一節點成功還不叫鎖,鎖天然包含了兩個功能:可重入和釋放鎖喚醒其他等待的client節點。可重入ZK是實現不了,需要業務方自己實現。釋放鎖的喚醒ZK是通過Listener的通知喚醒的。
我們看下上面的所有應用場景,其實本質上都是調用zk的兩個最核心的介面:創建節點和監聽節點變化。
ZooKeeper 將數據保存在內存中,這也就保證了高吞吐量和低延遲 (但是內存限制了能夠存儲的容量不太大,此限制也是保持 znode 中存儲的數據量較小的進一步原因)。ZK集群加機器可不能增加內存,為啥呢?因為ZK集群裡面的所有數據,都是每台機器保存一份副本。整個集群內存最小的機器,決定整個集群的內存大小。
ZooKeeper 是高性能的。在「讀」多於「寫」的應用程序中尤其的高性能 ,因為「寫」會導致所有的伺服器間同步狀態。(「讀」多於「寫」是協調服務的典型場景。)
ZooKeeper 底層其實只提供了兩個功能: