'Sentinel 實戰-集群限流環境搭建(詳細圖文描述)'

GitHub FLOW 編程仔日常 2019-08-22
"

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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看下每個文件中的實際統計結果:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看下每個文件中的實際統計結果:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看下每個文件中的實際統計結果:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。

再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:

"

Sentinel 系列教程,現已上傳到 github 和 gitee 中:

  • GitHub:https://github.com/all4you/sentinel-tutorial
  • Gitee:https://gitee.com/all4you/sentinel-tutorial
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看下每個文件中的實際統計結果:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。

再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

步驟總結

  • 先啟動好 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
Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

搭建集群限流環境

本文demo在:sentinel-tutorial/sentinel-practice/sentinel-cluster-flow-control 章節

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

啟動配置中心

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制檯實時進行推送。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

本次我們通過 Nacos 作為我們的規則源的配置中心,首先我們先下載 Nacos 然後在本地啟動一個 Nacos 的服務,我是通過源碼編譯的 Nacos 服務:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

如上圖所示,啟動成功後,我們可以訪問 Nacos 的控制檯來進行控制了:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:控制檯默認的用戶名,密碼都是:nacos

啟動服務端

這裡我們以獨立模式來運行 token server,即單獨啟動某臺機器作為 token server,其它的機器為 token client。

引入服務端依賴

首先我們引入集群流控服務端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

服務端配置

引入了依賴之後,就需要創建一個 ClusterTokenServer 的實例了,然後啟動該實例。不過要啟動 ClusterTokenServer 還需要先做一些配置,包括 namespace 和 ServerTransportConfig。

手動載入配置

手動載入 namespace 和 ServerTransportConfig 的配置到 ClusterServerConfigManager 中,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

載入了這些配置到 ClusterServerConfigManager 中之後,ClusterTokenServer 在啟動的時候,就會去 ClusterServerConfigManager 獲取啟動所需的配置信息。

註冊監聽器(可選)

如果 ClusterTokenServer 啟動之後想要更新一些設置,例如我想更換一個 namespace 或者我想更新 ServerTransportConfig,那該怎麼辦呢,這時我們可以通過為他們註冊一個 SentinelProperty ,將配置信息保存到配置中心,當配置中心中的內容發生變更時,SentinelProperty 會通過 PropertyListener 來通知到 SentinelProperty 的註冊方,此時就可以動態的更新配置信息了。

為 namespace 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

為 ServerTransportConfig 註冊一個 SentinelProperty:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

以上是通過 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 實戰-集群限流環境搭建(詳細圖文描述)

針對集群熱點規則,配置方式類似。

當集群限流服務端 namespace set 產生變更時,Sentinel 會自動針對新加入的 namespace 生成動態規則源並進行自動監聽,並刪除舊的不需要的規則源。

假設我們的 namespace 為 appA,那麼我們在 Nacos 中創建服務端的動態規則源如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:實際創建的時候,要把內容中的註釋去除掉,否則會報錯,因為這不是一個合法的json字符串,這裡只是用作描述。

啟動TokenServer

以上的所有步驟都完成之後,現在可以創建一個 ClusterTokenServer 實例並且啟動它了,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

另外請在啟動時加入以下啟動參數,讓服務端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

Sentinel 中提供了一個默認的以獨立方式啟動的 ClusterTokenServer 的實現類,但是類的名字起的有點讓人疑惑,不是很清晰,我給官方倉庫提交了一個 PR ,有興趣的可以看一下:#444

啟動後我們可以在控制檯中看到如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在 ~/logs/csp/sentinel-record.log 日誌文件中將打印如下信息:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

啟動客戶端

token server 啟動好之後,就可以啟動 token client了,我們啟動兩個 token client,我以一個為例來描述,另一個類似。

引入客戶端依賴

我們先引入集群流控客戶端所需的相關依賴:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

客戶端配置

我們需要為集群客戶端指定服務端的 ip 和 port ,這樣客戶端啟動之後就會連接上服務端。我們有三種方式可以設置客戶端的配置信息。

  • 硬編碼

通過硬編碼的方式,手動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 註冊動態數據源

通過註冊動態數據源,然後設置監聽器的方式,自動載入,如下列代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

  • 通過http接口
//<ip>:<port>/cluster/client/modifyConfig?data=<config>

其中 data 是 JSON 格式的 ClusterClientConfig 對象的值

這裡我選擇第一,第二兩種方式來設置客戶端的配置信息。

客戶端限流規則

如果客戶端和服務端之間的通訊中斷,那麼集群限流將退化成本地限流,客戶端就需要通過本地的限流規則進行流控,所以我們還需要為客戶端配置相應的限流規則,官方推薦的做法也是通過註冊動態數據源的方式,這裡我們仍然以 Nacos 作為我們的數據源來進行配置,如下面的代碼所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

具體的在 Nacos 中創建配置項的步驟,這裡就不再繼續描述了,服務端的規則如果已經創建過的話,客戶端可以直接複用,只需要把 groupId 和 dataId 與服務端的保持一致即可,啟動完成後可以通過以下 api 獲取系統中的規則:

http://<ip>:<port>?getRules?type=flow

結果如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:FlowRuleManager 是管理普通限流的,ParamFlowRuleManager 是管理熱點參數限流的

代碼中埋點

當以上的步驟都完成之後,我們就可以在客戶端的代碼中進行埋點了,然後啟動客戶端。

另外請在啟動時加入以下啟動參數,讓客戶端在啟動後可以連接上 sentinel-dashboard:

-Dproject.name=xxx -Dcsp.sentinel.dashboard.server=consoleIp:port

埋點的代碼如下所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

設置客戶端模式(可選)

通過 API 將當前集群客戶端的模式置為客戶端模式:

http://<ip>:<port>/setClusterMode?mode=<xxx>

其中 mode 為 0 代表 client,1 代表 server。如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

PS:因為我是在同一臺機器上模擬的,集群的服務端已經使用了 8720 的對外 api 端口,所以集群的客戶端client1的對外 api 端口是 8721,以此類推 client2 對外的 api 端口為 8721。

設置成功後,若客戶端已經設置了服務端的配置,客戶端將會自動連接到遠程的 token server。

我們可以在 sentinel-record.log 日誌中查看連接的相關日誌。

模擬請求

現在我們要來模擬請求,來觸發客戶端的初始化了,觸發完成之後,客戶端就會連接上 dashboard 了,執行如下請求:

http://127.0.0.1:7001/clusterFlow

如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

在控制檯中設置 Token Server 和 Client

當上面的步驟都完成後,我們就可以在 Sentinel 控制檯的【集群流控】頁面中的 token server 列表頁面管理分配 token server 了。

首先先看下 dashboard 中已經連接上來的機器列表吧,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

現在我們來創建一個 Token Server ,我啟動了三個應用實例,其中 8720 端口對應的實例為 token server,選擇 192.168.0.104:8720 這臺為服務端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

選擇其它兩個為 cluster client,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

保存後推送,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制檯的端口。

選擇好以後,點擊【保存】按鈕,刷新頁面即可以看到 token server 分配成功:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

並且我們可以在頁面上查看 token server 的連接情況,點擊【連接詳情】即可查看,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以在【集群流控】頁面的【Cluster Client列表】中查看具體的集群客戶端,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

查看效果

通過 jmeter 模擬流量同時請求兩臺客戶端機器,過一段時間後觀察效果。

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

然後在監控頁面看到對應資源的集群維度的總 qps ,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

發現通過的 qps 並不是維持在10以內,而是超過了10。

排查問題

首先我們直接查看 ${appName}-metrics.log 日誌文件中打印的信息,在我的機器上有兩個 metrics 的log文件,分別對應兩個 cluster-client:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

看下每個文件中具體的內容:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

可以看到同一秒兩個 client 通過的 qps 相加的結果是保持在10以下的。

那按照道理 dashboard 中是聚合的兩個 client 的 qps 總和,不應該超過10才對,經過與 Sentinel 的開發人員 樂有 的討論,他懷疑 dashboard 把 token-server 的值也統計進去了,我查看了實時數據返回的結果,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

從結果中發現統計結果確實聚合了三臺機器的統計值,再把 dashboard 請求 metrics 的結果打印出來看一下:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

8720 作為 token-server 是不應該去統計 metric 結果的,那為什麼會把它的結果統計進去了呢?

但是從兩臺 cluster-client 的 metric 日誌中可以看出來,整個集群的 qps 是沒有超過10的,這說明核心的功能沒有問題。

定位問題

經過樂有的指導,發現可能是我在同一臺機器中同時起了三個應用名相同的進程,而如果在本地啟動多個同名應用時,需要加入-Dcsp.sentinel.log.use.pid=true 參數,否則日誌和監控會被當成同一個應用的,都會混在一起,導致 dashboard 的統計結果出錯。

現在我把每個應用上都加上 -Dcsp.sentinel.log.use.pid=true 的參數,再次模擬該請求,觀察一下實時監控的結果,發現如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看 metrics 日誌文件,發現文件名也帶上了進程號:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

再看下每個文件中的實際統計結果:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

我們可以對兩個 metrics 日誌文件中同一時間點的值相加之後與 dashboard 中的值進行比較,兩者的值應該是相等的。

再看 MetricFetcher 中打印的日誌,發現也沒有再去請求 token-server 的 metric 了,如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

步驟總結

  • 先啟動好 nacos 服務,並將集群限流規則發佈到 nacos 中
  • 啟動好 dashboard,版本選擇 1.4.1
  • 啟動獨立模式運行的 token server,並配置與 dashboard 的連接,token server 會自動連接上 dashboard
  • 啟動兩個 token client,配置與 token server / dashboard 的連接,需模擬一次流量請求,client 才會初始化並連接上 dashboard
  • 通過 jmeter 模擬請求 token client 觀察 dashboard 上的實時監控

一個完整的集群請求流程如下圖所示:

Sentinel 實戰-集群限流環境搭建(詳細圖文描述)

避免踩坑

  • 所有版本請使用 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

作者: 逅弈

"

相關推薦

推薦中...