服務接口保護的方案有:黑名單和白名單、對IP實現限流/熔斷機制、服務降級、服務隔離機制。java
服務限流:在高併發的狀況下,客戶端的請求數量超出咱們設置的閾值,開啓自我保護機制。直接執行服務降級的方法,不執行業務邏輯,走本地fallback方法。git
服務降級:在高併發的狀況下,爲了防止用戶一直等待,採用限流或者熔斷機制,保護咱們的服務,不執行業務邏輯,走本地fallback方法。github
默認狀況下,tomcat/jetty服務器只會有一個線程池處理全部接口的請求。這樣的話就是在高併發的狀況下, 若是客戶端全部的請求都堆積到同一個接口上,那麼會產生該服務器的全部的線程都在處理該接口,可能會致使其餘的接口沒法訪問,短暫沒有線程去訪問。spring
解決方案:後端
服務隔離機制:線程池隔離或者信號量隔離機制。api
線程池隔離:每一個接口都有本身獨立的線程池維護咱們的請求,每一個線程池互不影響,缺點:佔用服務器內存很是大。tomcat
信號量隔離:設置處理每一個服務的線程數量的閾值,超出該線程數量,則拒絕訪問。bash
咱們能夠使用代碼來管理項目,可是配置寫死顯然很差。這裏直接用控制檯來管理項目,能夠實現動態配置管理項目。服務器
首先 下載Sentinel 的jar包。而後使用下面命令啓動控制檯併發
java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dcsp.sentinel.api.port=8719 -jar sentinel-dashboard.jar
後端啓動
nohup java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dcsp.sentinel.api.port=8719 -jar sentinel-dashboard.jar &
導入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <version>0.2.2.RELEASE</version> </dependency>
配置文件
cloud: nacos: discovery: server-addr: ip:port sentinel: transport: dashboard: ip:port eager: true
進入控制檯就能夠增刪規則了
不過要注意的是,若是接口沒有使用@SentinelResource註解,那麼資源名就是訪問接口的路徑,若是使用了@SentinelResource註解,那麼資源名就是註解指定的名稱。
控制檯與註解結合使用,能夠指定限流、降級/熔斷時候的處理方法。