Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
再看下每個文件中的實際統計結果:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
再看下每個文件中的實際統計結果:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
再看下每個文件中的實際統計結果:
我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。
再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
再看下每個文件中的實際統計結果:
我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。
再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:
步驟總結
- 先啟動好 nacos 服務,並將集群限流規則發佈到 nacos 中
- 啟動好 dashboard,版本選擇 1.4.1
- 啟動獨立模式運行的 token server,並配置與 dashboard 的連接,token server 會自動連接上 dashboard
- 啟動兩個 token client,配置與 token server / dashboard 的連接,需模擬一次流量請求,client 才會初始化並連接上 dashboard
- 通過 jmeter 模擬請求 token client 觀察 dashboard 上的實時監控
一個完整的集群請求流程如下圖所示:
Sentinel 系列教程,現已上傳到 github 和 gitee 中:
- GitHub:https://github.com/all4you/sentinel-tutorial
- Gitee:https://gitee.com/all4you/sentinel-tutorial
搭建集群限流環境
本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節
下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:
啟動配置中心
要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:
本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:
如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:
PS:控制檯默認的用戶名,密碼都是:nacos
啟動服務端
這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。
引入服務端依賴
首先我們引入集群流控服務端所需的相關依賴:
服務端配置
引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。
手動載入配置
手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:
載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。
註冊監聽器(可選)
如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。
為 namespace 註冊一個 SentinelProperty:
為 ServerTransportConfig 註冊一個 SentinelProperty:
以上是通過 Nacos 作為配置中心的,但是這個步驟對於 token server 來說,並不是必須的,只要啟動的時候能獲取到所需的配置信息即可,不過在實際的場景中配置信息還是要保存在配置中心的。
PS:如果我們註冊了相應的監聽器,就需要到具體的配置中心中維護相應的信息,我們這裡用的是 Nacos 配置中心,那麼我們就需要到 Nacos 中創建具體的配置項。本次模擬我就不進行相應的監聽器的註冊了,直接通過硬編碼把配置項load進去。
創建動態規則源
token server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要通過 ClusterFlowRuleManager 註冊一個可以自動根據 namespace 創建動態規則源的生成器,即 Supplier。
Supplier 會根據 namespace 生成類型為 SentinelProperty<List<FlowRule>> 的動態規則源,不同的 namespace 對應著不同的規則源,若不指定
namespace ,則默認為為應用名:${project.name} 的值。
ClusterFlowRuleManager 中是這樣註冊 Supplier 的:
setPropertySupplier(Function<String, SentinelProperty<List<FlowRule>>> propertySupplier)
參數接收的是一個 Function 的函數式接口,提供一個 String,則生成一個 SentinelProperty。
假設我們用 Nacos 作為集群服務端的配置中心,則可以這樣註冊一個 Supplier:
針對集群熱點規則,配置方式類似。
當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。
假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:
PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。
啟動TokenServer
以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:
另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444
啟動後我們可以在控制檯中看到如下信息:
在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:
啟動客戶端
token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。
引入客戶端依賴
我們先引入集群流控客戶端所需的相關依賴:
客戶端配置
我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。
- 硬編碼
通過硬編碼的方式,手動載入,如下列代碼所示:
- 註冊動態數據源
通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:
- 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>
其中 data 是 JSON 格式的 ClusterClientConfig 對象的值
這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。
客戶端限流規則
如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:
具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:
http://<ip>:<port>?getRules?type=flow
結果如下圖所示:
PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的
代碼中埋點
當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。
另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:
-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port
埋點的代碼如下所示:
設置客戶端模式(可選)
通過 API 將當前集群客戶端的模式置為客戶端模式:
http://<ip>:<port>/setClusterMode?mode=<xxx>
其中 mode 為 0 代表 client,1 代表 server。如下圖所示:
PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。
設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。
我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。
模擬請求
現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:
http://127.0.0.1:7001/clusterFlow
如下圖所示:
在控制檯中設置 Token Server 和 Client
當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。
首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:
現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:
選擇其它兩個為 cluster client,如下圖所示:
保存後推送,如下圖所示:
頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。
選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:
並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:
我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:
查看效果
通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。
然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:
發現通過的 qps 並不是維持在10以內,而是超過了10。
排查問題
首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:
看下每個文件中具體的內容:
可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。
那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:
從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:
8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?
但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。
定位問題
經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。
現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:
再看 metrics 日誌文件,發現文件名也帶上了進程號:
再看下每個文件中的實際統計結果:
我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。
再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:
步驟總結
- 先啟動好 nacos 服務,並將集群限流規則發佈到 nacos 中
- 啟動好 dashboard,版本選擇 1.4.1
- 啟動獨立模式運行的 token server,並配置與 dashboard 的連接,token server 會自動連接上 dashboard
- 啟動兩個 token client,配置與 token server / dashboard 的連接,需模擬一次流量請求,client 才會初始化並連接上 dashboard
- 通過 jmeter 模擬請求 token client 觀察 dashboard 上的實時監控
一個完整的集群請求流程如下圖所示:
避免踩坑
- 所有版本請使用 1.4.1 ,避免不必要的問題排查
- 如果在 token server列表中選擇 client 時,未出現可選的 client 機器,請先對該 client 發送請求流量以觸發 sentinel 的初始化,然後 client 才會連接上 dashboard
- 本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 中的統計結果有誤
- token client 也需要配置限流規則,並且指定 clusterMode 為 true
- 當 token client 請求 token server 超時了,就會退化為本地限流模式
文章來源:https://dwz.cn/NNkk4pdJ
作者: 逅弈