表級鎖的爭用狀態變量:
show status like ‘table%’;
行級鎖爭用狀態變量:
show status like ‘innodb_row_lock%’;
單體架構的優勢:
1、便於開發
2、易於測試
3、易於部署
單體架構的不足:
1、復雜性高
2、交付效率低:構建和部署耗時長
3、伸縮性差:只能按整體橫向擴展,無法分模塊垂直擴展,IO密集型模塊和CPU密集型模塊無法獨立升級和擴容
4、可靠性差:一個BUG可能引起整個項目的運行
5、阻礙技術創新
微服務架構的優勢:
1、易於開發和維護
2、獨立部署
3、伸縮性強
4、與組織結構相匹配
5、技術異構性
微服務面臨的挑戰:
1、服務拆分:
(1)、微服務拆分原則:領域模型、組織結構、康威定律、單一職責
(2)、微服務擁有獨立數據庫
(3)、微服務之間確定服務邊界
2、數據一致性
(1)、可靠性事件模式
(2)、補償模式-sagas模式
3、服務通信
(1)、通信技術方案:RPC、REST、異步消息
(2)、服務注冊和發現
(3)、負載均衡
4、服務網關:
(1)、API Gateway
(2)、為前端服務的后端
(3)、身份認證、路由服務、流量控制、日志統計
5、高可觀察
(1)、健康檢測、集中控制
(2)、日志聚合及檢索
(3)、分布式追蹤
6、可靠性(客戶端實現):
(1)、流量控制、超時控制
(2)、艙壁隔離(線程隔離),熔斷機制
(3)、服務降級,冪等重試
微服務拆分原則:
1、單一職責、高內聚低耦合
2、微服務粒度適中
3、考慮團隊結構
4、以業務模型切入
5、演進式拆分
6、避免環形依賴與雙向依賴
7、DDD
微服務拆分步驟:
1、分析業務模型:
(1)、弱耦合在一起
(2)、高內聚力
2、確定服務邊界:
(1)、服務應包含單一的界限上下文
3、微服務數據庫拆分
微服務數據一致性:
1、分布式事務不適用微服務
(1)、2PC會有單點故障
(2)、由於鎖的原因降低吞吐量
(3)、Nosql數據庫並不支持
2、采用最終一致性來實現數據一致性
(1)、可靠性事件模式:消息隊列(支付寶轉余額寶)
(2)、補償模式-sagas模型:一些列的有序事務(每一個事物都有補償子事務)
技術選型的三要素:
1、技術選型的廣度和深度:
2、把握和分析技術選項的優缺點
3、緊密結合項目和團隊的情況
Eureka簡介:
1、支持跨機房的高可用
2、數據一致性是數據最終一致性
3、Eureka Client會對服務注冊表進行緩存,降低Eureka的壓力,進一步增強了它的高可用
借助logbook輸出HTTP日志
1、pom添加logbook依賴
2、在服務提供者工程添加logbook filter以輸出日志
3、在服務消費者工程httpclient添加logbook攔截器
JWT介紹:
1、基於token的進行身份驗證的方案
2、jwt設計一個字符串由header、payload、signature組成
3、具備安全、自包含、緊湊等特點
JWT優點:
1、安全性高,防止token被偽造和篡改
2、自包含,減少存儲開銷
3、跨語言,支持多種語言的實現
4、支持過期,發布者等校驗
JWT注意事項:
1、消息體是可以被base64解密成銘文
2、jwt不適合存放大量信息
3、無法作廢未過期的jwt(可以借用Redis實現)
Redis的score機制:
可以做商品或房屋的熱門商品,每點擊一個商品的詳情,就往Redis(zset)中添加一個,並只留排名前10的;
級聯故障解決方案:
1、艙壁隔離(線程隔離)
2、超時控制
3、服務降級
4、熔斷機制
Spring Cloud Sleuth原理:使用的是ThreadLocal,使用的是異步線程
1、疑問:(spring.factories)
(1)、追蹤數據是如何生成的
(2)、追蹤數據是如何再進程內和進程間傳遞的
(3)、如何解決跨線程池問題的
進程內根據ThreadLocal進行數據的傳遞
Hystrix是跨線程池的,業務線程和調用線程是隔離的
用戶請求—》TraceFilter—》Trace攔截器—》Controller—》HystrixCallable
—》TraceRestTemplate—》TraceAspect—(可以通過MQ,也可以通過Http請求上報)—》Zipkin Server(ES、Mysql做數據存儲)
日志檢索方案:
1、ELK介紹
(1)、Elasticsearch(日志存儲)
(2)、LogStash(負責日志收集)
(3)、Kibana(進行日志圖形化展示)
查看日志信息:less info.log
本地緩存:
private final Cache<String, String> registerCache =
CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
.removalListener(new RemovalListener<String, String>() {
@Override public void onRemoval(RemovalNotification<String, String> notification) { String email = notification.getValue(); User user = new User(); user.setEmail(email); List<User> targetUser = userMapper.selectUsersByQuery(user); if (!targetUser.isEmpty() && Objects.equal(targetUser.get(0).getEnable(), 0)) { userMapper.delete(email);// 代碼優化: 在刪除前首先判斷用戶是否已經被激活,對於未激活的用戶進行移除操作 } } }).build();
private final Cache<String, String> resetCache = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES).build();
微服務的消費模式:
1、服務直連模式(RestTemplate)特點:簡潔明了、平台語言無關性、無法保證服務的可用性、生產環境比較少用
2、客戶端發現模式:
(1)、服務實例啟動后,將自己的位置信息提交到服務注冊表
(2)、客戶端從服務注冊表進行查詢,來獲取可用的服務實例
(3)、客戶端自行使用負載均衡算法從多個服務實例中選擇出一個
3、服務端發現模式
微服務的消費者:
1、HttpClient(RestTemplateBuilder)
2、Ribbon(基於客戶端的負載均衡器(加權、隨機、輪詢算法))(RestTemplateBuilder+配置)
3、Feign:
使用API網關的意義:
1、API網關的意義:
(1)、集合多個API
(2)、統一API入口
2、常見API網關的實現方式:nginx、zuul、getaway
API網關帶來的好處:
1、避免將內部信息泄露給外部
2、能給API添加額外的安全層
3、可以降低API調用的復雜度
4、微服務模擬與虛擬化
zuul簡介:
1、功能:認證、壓力測試、動態路由、負載削減、安全、靜態響應處理、主動交換管理等
服務熔斷:
1、斷路器
2、斷路器模式
熔斷器的意義:
1、好處:
(1)、系統穩定
(2)、減少性能損耗
(3)、及時響應
(4)、閥值可定制
熔斷器的功能:
1、異常處理
2、日志記錄
3、測試失敗的操作
4、手動復位
5、加速斷路
7、重試失敗請求
微服務的高級主題----自動擴展
1、什么是自動擴展
(1)、垂直擴展:就是升級(雙核變四核)
(2)、水平擴展:就是數量變多(1台主機增加到4台主機)
2、自我注冊和自我發現(服務注冊表(Eureka)、客戶端、微服務實例)
3、自動擴展的意義:
(1)、提高了高可用性和容錯能力
(2)、增加了可伸縮性
(3)、具有最佳使用率,並節約成本
(4)、優先考慮某些服務或服務組
自動擴展的常見模式:
1、自動擴展的不同級別:應用程序級別、基礎架構級別
如何實現微服務的自動擴展:
1、要思考的問題:
(1)、如何管理數千個容器
(2)、如何監控他們
(3)、在部署工作時如何應用規則和約束?
(4)、如何利用容器來獲得資源效率?
(5)、如何確保至少有一定數量的最小實例正在運行?
(6)、如何確保依賴服務正常運行?
(7)、如何進行滾動的升級和優雅的遷移?
(8)、如何回滾錯誤的部署?
2、所需功能:依賴兩個關鍵功能
(1)、一個容器抽象層,在許多物理或虛擬機上提供統一的抽象
(2)、容器編排和初始化系統在集群抽象之上只能管理部署
3、容器編排:
(1)、容器編排工具提供了一個抽象層來處理大規模的集裝箱部署
(2)、具備發現、資源管理、監控和部署等功能
3、容器編排工作職能:
(1)、集群管理
(2)、自動部署
(3)、可伸縮性
(4)、運行狀況監控
(5)、基礎架構抽象
(6)、資源優化
(7)、資源分配
(8)、服務可用性
(9)、敏捷性
(10)、隔離
資源分配常用算法:
1、常用算法:
(1)、傳播:將負載平均分配到各個主機上
(2)、裝箱:負載先把第一台主機用完了,在用其它主機,按需付費
(3)、隨機:負載隨機選擇主機
常見容器編排技術:
(1)、Docker Swarm
(2)、Kubernetes
(3)、Apache Mesos