開發者說:Sentinel 流控功能在 SpringMVC/SpringBoot 上的實踐

Jason_Joo_jpeg

從用戶的視角來感覺一個開源項目的成長,是咱們推出「開發者說」專欄的初衷,即在開發者進行開源項目選型時,提供更爲立體的項目信息。專欄全部內容均來自做者原創/投稿,本文是「開發者說」的第6篇,做者 Jason Joo,@友樂活(北京),Sentinel Committer.web

1st:《深度剖析開源分佈式事務方案 Seata 的事務協調器》安全

2nd:《RocketMQ 消息發送的高可用設計》框架

3st:《消息隊列 Kafka 和 RocketMQ 之我見》運維

4th:《如何參與定義一款 IDE 插件》異步

5th:《基於 Nacos 的網關灰度路由和服務權重灰度》分佈式

集成 Sentinel 前生

流控在分佈式系統中是較爲基本的需求,其須要在系統負載、服務質量、流量甄別、安全⻛控等⽅⾯進⾏保障,並根據業務需求,進⾏動態調整或⼈工臨時介入,尤爲是在⼀些事件性的時期,以實現快速控制和恢復服務的效果。優化

流控手段通常掛載在流量網關和業務內的邏輯。url

流量網關常見於 Nginx 這類代理層,經過擴展插件、Lua腳本進⾏針對 IP/Path/Query 等形式的流控。業務內則⼤多在局部或框架層進行信號量、線程池、超時時間或其它邏輯來實現流控。前者主要體如今運維的可操做性,不侵⼊業務線,然後者則針對性更強,但有侵⼊性或修改時須要部署,⾯向業務團隊可控。spa

兩種類型的流控每每⽐較割裂(由不同的團隊在不共享的空間內進行控制),常出現指標的不協調性。插件

爲了解決這⼀問題,咱們開始彙總現有的需求,調研相關的系統,並準備實現⼀套能夠同時面向業務和運維,進行應用級隔離和知足基本規則類型需求的流控實現,預期是在 Nginx 端利用LuaJIT實現一套更爲強大的流控模塊。

調研過程當中,適逢 Sentinel 0.1/0.2的發佈,⽀持servlet集成(URL限流),帶有操做⾯板(Dashboard),支持基本的實時情況查看、實時的修改分發規則、全局負載和單點熔斷,能基於QPS、信號量等形式進行流控。除了零侵入之外,基本滿⾜咱們的需求,因此準備基於 Sentinel 進行方案落地嘗試。

集成 Sentinel 的實踐

咱們的基本需求以下:

  • 基於 URL 作流控
  • 基於 Dashboard 作動態修改規則
  • 業務端針對 SpringMVC/SpringBoot
  • ⽀持異步 Servlet (後續提出)
  • sentinel-transport 監聽端⼝可定製(涉及防⽕牆配置、同⼀節點多服務)

集成適配
基於 Sentinel 所提供的功能、適配方式,須要進行基本的配置和修改。

集成方式
現有項⽬流量⼊口部分⼤多爲基於 SpringMVC 的項目,少部分爲 SpringBoot 項目,而且從運維部署的角度看,⽬前主要有普通運⾏方式(JVM/Tomcat)和容器化方式。

  • 普通運行方式:盡量避免修改 JVM 啓動參數,參數經過集中配置中心或 properties ⽂件來定義;
  • 容器化⽅式:參數⼤可能是經過 ENV 環境變量進行定義。

因此咱們根據實際的需求,將 Sentinel 初始化⼯做進⾏了封裝,基於 SpringMVC 提供了XML初始化方式,基於 SpringBoot 提供了註解初始化方式,例如:

@InitDefaults(

          projectName = "demo",

          sentinelPort = 19000,

          sentinelGroup = "test"

     )

集成框圖

Sentinel_SpringMVC_SpringBoot_jason

集成要點

  • ⾃動判斷是否引⼊了對應的 Sentinel 依賴
  • ⾃動配置
  • 採用ZooKeeper爲規則存儲中心(重⽤現有基建)
  • 節點端支持對規則的讀和寫
  • 集成sentinel-transport-netty-http來支持Dashboard
  • 利用 Dashboard 經過 API 操做單⼀節點的能⼒間接地將規則寫入Zookeeper,從而分發⾄全部節點

主要使⽤了sentinel-web-servlet,採用這個方案,⽆需對Dashboard作任何⼆次開發,可跟隨升級,對業務侵入較少

對 Sentinel 的期待

  • 簡化不同場景下的流控集成與落地
  • 更簡單非嚴格的集羣限流,引入⾼可⽤
  • Dashboard
  • 實現 Dubbo/ZooKeeper/Spring/Servlet 相關適配標準的開箱即用

本文做者:

Jason Joo,Sentinel Committer,@友樂活(北京),hblzxsj@163.com,擁有超過⼗年的軟硬件體系技術實踐,傍身技能:Java/C/Golang,數據中間件/分佈式系統設計/容器編排調度熟悉TCP/IP協議棧與優化(*nix),Linux內核⼆次開發。

 

本文做者:中間件小哥

原文連接

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索