規則的持久化問題。現在的規則都是在內存里的,我們要寫一些代碼來編一些規則。啟動以后規則在內存里了。如果你配置里面有sentinel的dashboard,有流量經過客戶端的時候,它會把規則同步給Dashboard,同樣的sentinel的dashboard頁面上增加或者修改規則后。sentinel也會把規則推給相應的客戶端,
我們之前在配置文件內配置了這個 sentinel的port。sentinel的客戶端還會再起一個服務。一但dashboard去改這個配置的時候,它就會調用客戶端的服務把響應的配置推送過來
那么規則永遠是在客戶端的內存中的,同樣sentinel的dashboard規則也是內存里面的。一旦dashboard或者客戶端重啟,這些變化過的規則就都消失了。
想要的效果是有一個遠程的配置中心,這個配置中心可能是ZooKeeper或者是Nacos或者是阿波羅等,這些都是支持的。
要做兩件事:
1.讓sentinel的Dashboard知道,當我的配置規則變化的時候,我要把配置規則推到遠程配置中心,然后把它持久化保存起來。
2.客戶端也要做改造,客戶端要知道我的配置規則都在遠程配置中心存着,然后一旦有變化的時候,配置中心要推給我,我要能接收這個新的規則,來更新我自己的配置,
這樣不管是Dashboard還是客戶端他們重啟后都不會丟掉現有的規則配置。
開始改造
來安裝zookeeper,用其他的配置中心的話,步驟都是一樣的,只是配置的細節不太一樣,配置的東西也是一樣的。zookeeper基本所有公司都在用,所以我們用這個最廣泛的東西。
stable穩定版
現在這個最新的穩定版、
解壓出來是這么個文件夾
進入conf文件
zoo_sample.cfg是一個樣例的配置文件。
復制並改個名字
這里面是一些默認的配置,開始發的時候用這些默認的配置就可以了。
bin文件夾下有一些命令,因為我們已經有了配置的了。所以直接啟動server就可以了。
這是已經子在跑了 ,表示已經啟動過一次了。
把他停止
再start,這樣就又啟動起來了。
一旦啟動起來,就可以用zkClient去連一下。默認的會連本機的端口, 好像是2181端口。
顯示connected就表示連上 了。
改造sentinel的Dashboard
改造sentinel的Dashboard讓它知道在編輯或者新建規則的時候,把這些規則都放到我剛才跑的zookeeper服務里面去。
把sentinel的源碼下載下來。
用git客戶端把源碼下載到本地。把代碼切到1.6的分支上去。
在開發工具內倒入,下載的源碼
代碼里面有很多模塊,我們只修改Dashboard
加載進來后第一步修改pom文件,有個zookeeper相關支持。
這里默認配置的是test,打包的時候不會把依賴打進去。
把test注釋掉。打包的時候真正把apache.curator打到項目里面去。它才能和zookeeper進行通訊。
其實和zookeeper通訊啊,保存規則的數據,然后從zookeeper讀取數據,所有這些代碼sentinel其實已經幫我們都寫好了。只不過沒有直接放在它的功能里面。因為它要同時支持好多種web的存儲。
所以它只是在這里寫了一堆接口
這里面就是需要的所有代碼,在src/test/java/repository.metric目錄下
在rule包下面建個zookeeper的包,然后把src/test/java/rue/zookeeper下的代碼 都復制過來。
復制過去后,就報錯了。有沖突 ,把下面的 刪掉。
什么都不用改,直接把代碼復制過去就可以了
找到FlowControllerV2
這里默認 注入了DynamicRuleProvider和DynamicRulePublisher
把我們剛才復制過來的實現類的名字復制過來
替換DuynamicRuleprovider
publisher的名字也復制過來。
這樣他就會用實現類來和zookeeper通訊,保存數據了。
配置文件的修改
修改默認的端口為8082
左邊菜單欄
流控規則的頁面要修改。
把flowV1里面的V1去掉
啟動測試
這個項目本身也是個SpringBoot的項目,啟動,啟動類
可以看到控制台 輸出 zookeeper的日志
看一下sentinel 端口已經修改為8082
登陸進來后,現在是一個完全空的控制台。
注冊orderAPI
手工寫代碼的規則,這里 我們去掉,不再用了。
dashboard的端口修改為8082了
啟動OrderAPI
給orderAPi流量才會在sentinel上顯示,連續多點擊幾次。
現在應該是沒有任何的限流規則的。所以都是成功的。
orderAPI已經注冊過來了。流控規則現在是空的
新增流控規則
快速失敗:直接拒絕掉請求
Warm Up:流量一點一點放大,
排隊等待:在這等着,等流控流量有空了再把這個請求放過去,
這就有了一條createOrder資源的配置。
看下zookeeper里面的配置。zkCli.sh連進去。
根目錄下的節點。sentinel_rule_config這個是sentinel默認在zookeeper上建的一個目錄。sentinel所有的配置都是放在這個sentinel_rule_config節點下面的。
sentinel_rule_config下面有一個orderApi。這就說明我們剛才建的這個陣地orderApi的這個資源建的規則已經放到zookeeper里面。
把微服務都停一下。然后重啟
我們已經在orderAPi里面沒有寫任何的規則了。規則都刪了。
重新進去Dashboard
多點擊幾次訪問,給它一點流量。
這個規則仍然在這里。規則不是在內存里面,也不是從客戶端同步過來的,而是持久化在我們的zookeeper里面了。
sentinel控制台現在是和Dashboard連起來了。但是我的客戶端也就是orderAPi它還沒有和zookeeper連起來。
訪問orderApi,快速的去點,仍然是所有的都是成功的,也就是客戶端這里並沒有限流,因為客戶端並不知道,我要從zookeeper去接收規則。等於客戶端現在還是一個沒有任何規則的狀態。我非常快的訪問orderAPi也沒有限流的效果。
改造客戶端
讓客戶端去zookeeper拿規則。和zookeeper保持同步。
首先在pom.xml里面加依賴,讓它知道我要根zookeeper通訊。
maven的倉庫里面搜索sentinel的數據源。
找到Sentinel DataSource Zookeeper
這里用1.5.2的版本
用這個1.5.2的版本
因為,starter-alibaba-sentinel里面用的是1.5.2的版本。這樣我們就有了zookeeper的datasource依賴。
重新建立配置文件
這里不再編碼去寫配置規則了。而是在這里去配一下 ,讓sentinel去zookeeper那里去讀配置。
首先配置文件把基本信息配置一下。這個是我們自定義的配置。
zookeeper的地址。
path是說去zookeeper的哪里目錄下讀sentinel的規則。就是是我們之前在zookeeper里面看到的
path路徑前面加斜線。
/sentinel_rule_config這個目錄下面存了sentinel所有的應用的配置。所以我們要根據應用的名字去拼裝出一個路徑來。
這個類構造出來以后,馬上就去讀規則。加上這個注解,@PostConstruct
聲明一個zookeeper的數據源。告訴它從這個數據源里面讀就可以了。
ReadableDataSource前面的String是應用的名字,后面的List<FlowRule>是一組流量的規則。每個應用對應一組流量的規則,像一個Map一樣。
用阿里巴巴的fastJson把讀取過來的數據 轉換成FlowRule類
FlowRuleManager就知道 從這個數據源 同步流控的規則。
啟動測試
快速的多點擊幾次訪問
后台日志。說明流控規則已經生效了。
流控法規則就是從zookeeper里面同步過來的。
總結
現在的代碼 之改造了流控規則。這里只寫了FlowRuleManager
降級的規則如果也要從zookeeper里面拿就要再寫,DegradeRuleManager
現在sentinel和dashboard已經沒有關系了。都和配置中心來通訊。
現在已經把所有的規則配置已經持久化到zookeeper里面,本節結束。
結束