分散式服務介面設計注意點

黑色鞋幫發表於2018-09-27

1、水平許可權校驗

水平許可權漏洞一般出現在一個使用者物件關聯多個其他物件(訂單等)、並且要實現對關聯物件的CRUD的時候。
請求包含使用者ID及關聯物件ID時、務必校驗關聯物件是否屬於該使用者;

2、冪等

冪等操作的特點是任意多次執行所產生的影響均與一次執行的影響相同。
冪等操作的基本處理思路是: 呼叫者給訊息一個唯一請求ID標識。ID標識一個工作單元,這個工作單元只應執行一次; 接收者在執行一個工作單元必須先檢驗該工作單元是否已經執行過。檢查是否執行的邏輯通常是根據唯一請求ID ,在服務端查詢請求是否有記錄,是否有對應的響應資訊,如果有,直接把響應資訊查詢後返回或者返回重複操作錯誤資訊;如果沒有,那麼就當做新請求去處理。

3、防併發

防併發基本思路是使用鎖:1、分散式鎖(redis鎖);2、樂觀鎖(版本號);3、狀態鎖定(對資料進行修改前判斷前置狀態)。

4、非同步任務

慎用EventBus、ThreadPool等處理非同步任務,服務當機或者重啟時會丟失任務。建議採用mq自發自收。

5、最終一致性

最終一致性為弱一致性、在需要強一致性的場景務必不能採用tmc等方式實現。(例如下單扣減額度等)

6、防重放

常用的防止重放的機制是使用timestamp和nonce做重放機制。timestamp用來表示請求的當前時間戳,nonce是隨機數與timestamp加密生成,sign是對整個url的簽名。
服務端接到這個請求:
1 )先驗證sign簽名是否合理,證明請求引數沒有被中途篡改。
2 )再驗證timestamp是否過期,證明請求是在最近60s被髮出的。
3 )最後驗證nonce是否已經有了,證明這個請求不是60s內的重放請求。

7、降級處理

當系統出現故障或壓力過大時保證核心功能。
Hystrix的設計原則包括:資源隔離、熔斷器、命令模式。
資源隔離:Hystrix利用Bulkheads(艙壁隔離模式), 將每個依賴服務分配獨立的執行緒池進行資源隔離, 從而避免服務雪崩。
熔斷器:設定錯誤率閾值,當請求錯誤率超過閾值,請求被禁止通過。經過一段時間後, 熔斷器會自動進入半開狀態, 允許一個請求通過,當該請求呼叫成功時, 熔斷器恢復到關閉狀態,若該請求失敗, 熔斷器繼續保持開啟狀態, 接下來的請求被禁止通過。
命令模式:Hystrix使用命令模式(繼承HystrixCommand類)來包裹具體的服務呼叫邏輯(run方法), 並在命令模式中新增了服務呼叫失敗後的降級邏輯(getFallback)。


相關文章