Spring Boot集成 Sentinel 實現接口流量控制

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":1}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a0/a06c3e8469a5e93a3fc2bfa3009e43fb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Hello,大家好,我是麥洛,今天帶大家來了解一下SpringBoot如何繼承Sentinel來實現接口流量控制","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Sentinel控制檯搭建","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在我的上一篇文章阿里出品的Sentinel到底是個什麼玩意?中,已經介紹過如何準備Sentinel控制檯,大家可以直接參考;","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Sentinel 客戶端","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"項目搭建","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先我們來創建一個測試項目,這裏初始化項目的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"url","attrs":{}}],"attrs":{}},{"type":"text","text":"建議大家填寫","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"阿里雲","attrs":{}},{"type":"text","text":"的地址,會有驚喜😅","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"javascript"},"content":[{"type":"text","text":"http://start.aliyun.com\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/6a/6a76f70c81c56e9629e261a3eed80f0e.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來就是常規操作,一路next,在下圖的位置稍微注意一下","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/0a/0aa83f5ecaf957ac4a427d1c1c6a8fdb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說明:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同大家以前創建項目一樣,只需要在這裏勾選Sentinel就可以啦🚀","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"項目創建好以後,我們發現pom文件中引入了下面的依賴","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e0/e026fa6cd5b1858d4823aad3a9f818a6.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有的小夥伴看網上博客,也會有下面的方式,指定版本號","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"xml"},"content":[{"type":"text","text":" \n \n com.alibaba.cloud\n spring-cloud-starter-alibaba-sentinel\n 2.1.0.RELEASE\n \n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你使用我推薦的阿里雲的Url,會發現Sentinel的版本號都定義父工程,Cloud的各個組件的兼容性就不要大家操心了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"xml"},"content":[{"type":"text","text":" \n \n \n org.springframework.boot\n spring-boot-dependencies\n ${spring-boot.version}\n pom\n import\n \n \n com.alibaba.cloud\n spring-cloud-alibaba-dependencies\n ${spring-cloud-alibaba.version}\n pom\n import\n \n \n \n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"打開項目配置文件,會發現它已經爲我們自動加好了配置,真的超級方便👏","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"properties"},"content":[{"type":"text","text":"server.port=8083\n# 應用名稱\nspring.application.name=springcloud-sentinel\n# Sentinel 控制檯地址\nspring.cloud.sentinel.transport.dashboard=localhost:8080\n# 取消Sentinel控制檯懶加載\n# 默認情況下 Sentinel 會在客戶端首次調用的時候進行初始化,開始向控制檯發送心跳包\n# 配置 sentinel.eager=true 時,取消Sentinel控制檯懶加載功能\nspring.cloud.sentinel.eager=true\n# 如果有多套網絡,又無法正確獲取本機IP,則需要使用下面的參數設置當前機器可被外部訪問的IP地址,供admin控制檯使用\n# spring.cloud.sentinel.transport.client-ip=# sentinel 配置\nspring.application.name=frms\nspring.cloud.sentinel.transport.dashboard=localhost:8080\nspring.cloud.sentinel.transport.heartbeat-interval-ms=500\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"如何定義資源","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"編程式定義","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"官網提供的demo","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"package com.milo.sentinel;\n\nimport com.alibaba.csp.sentinel.Entry;\nimport com.alibaba.csp.sentinel.SphU;\nimport com.alibaba.csp.sentinel.slots.block.BlockException;\nimport com.alibaba.csp.sentinel.slots.block.RuleConstant;\nimport com.alibaba.csp.sentinel.slots.block.flow.FlowRule;\nimport com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 項目入口\n * @author Milo Lee\n * @date 2021-3-20 19:07\n *\n */\n@SpringBootApplication\npublic class SentinelApplication {\n\n public static void main(String[] args) {\n SpringApplication.run(SentinelApplication.class, args);\n\n // 配置規則.\n initFlowRules();\n while (true) {\n // 1.5.0 版本開始可以直接利用 try-with-resources 特性\n try (Entry entry = SphU.entry(\"HelloWorld\")) {\n // 被保護的邏輯\n Thread.sleep(300);\n System.out.println(\"hello world\");\n } catch (BlockException | InterruptedException ex) {\n // 處理被流控的邏輯\n System.out.println(\"blocked!\");\n }\n }\n\n }\n\n private static void initFlowRules(){\n List rules = new ArrayList<>();\n FlowRule rule = new FlowRule();\n rule.setResource(\"HelloWorld\");\n rule.setGrade(RuleConstant.FLOW_GRADE_QPS);\n // Set limit QPS to 20.\n rule.setCount(20);\n rules.add(rule);\n FlowRuleManager.loadRules(rules);\n }\n\n}\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"註解式定義","attrs":{}}]},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"@SpringBootApplication\npublic class Application {\n\n public static void main(String[] args) {\n SpringApplication.run(ServiceApplication.class, args);\n }\n}\n\n@Service\npublic class TestService {\n\n @SentinelResource(value = \"sayHello\")\n public String sayHello(String name) {\n return \"Hello, \" + name;\n }\n}\n\n@RestController\npublic class TestController {\n\n @Autowired\n private TestService service;\n\n @GetMapping(value = \"/hello/{name}\")\n public String apiHello(@PathVariable String name) {\n return service.sayHello(name);\n }\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"@SentinelResource","attrs":{}}],"attrs":{}},{"type":"text","text":" 註解用來標識資源是否被限流、降級。上述例子上該註解的屬性 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sayHello","attrs":{}}],"attrs":{}},{"type":"text","text":" 表示資源名。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"啓動控制檯","attrs":{}}]},{"type":"codeblock","attrs":{"lang":"bash"},"content":[{"type":"text","text":"java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a5/a58d33105e4217927c2711d86337b52c.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"控制檯操作介紹","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"控制檯的操作我們用編程式定義的例子來演示,大家啓動我們的服務","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/99/99abde6d2832808eca21ccb3f98aaa1c.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們會發現除了","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"sentinel-dashboard","attrs":{}},{"type":"text","text":"之外,多了一個","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"milolee-sentinel","attrs":{}},{"type":"text","text":",這個就是我們的服務,它的名稱其實對應我們配置文件定義的應用名稱:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"properties"},"content":[{"type":"text","text":"# 應用名稱\nspring.application.name=milolee-sentinel\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"點擊機器列表,這這裏如果能發現你的機器,那就是成功上線了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/11/117ca89cd10793fadd17147d20b3b556.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"實時監控","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/39/39c7de25a3d70bc67e81f3b5705c8bbc.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"簇點鏈路","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a6/a6e4edc0ecb0781e654a419bb4be66ab.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"流控規則配置","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"給我們的資源","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"HelloWorld","attrs":{}}],"attrs":{}},{"type":"text","text":"配置流控規則,它的","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"QPS","attrs":{}}],"attrs":{}},{"type":"text","text":"(每秒請求數)爲1,如圖:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/41/41cbe45bccfee76945eee0a1ffba06e8.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過查看實時監控,我們發現已經生效","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/9b/9b9df429cbb4d20662f3437075513fbd.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"降級規則配置","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"給我們的資源","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"HelloWorld","attrs":{}}],"attrs":{}},{"type":"text","text":"添加一個降級規則配置,如果","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"QPS","attrs":{}}],"attrs":{}},{"type":"text","text":"大於1,且平均響應時間大於","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"20ms","attrs":{}}],"attrs":{}},{"type":"text","text":",則接口下來接口在2秒鐘無法訪問,之後自動恢復。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/70/7001a183a6b712add2322f72e98e4d41.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目前這些規則","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"僅在內存態生效","attrs":{}},{"type":"text","text":",應用重啓之後,該規則會丟失。後續文章我們會繼續學習動態規則","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/30/30f91affb1fbbaa01ea509d9f933c86a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"關於控制檯的使用,大家可以參考官方文檔,比較詳細https://sentinelguard.io/zh-cn/docs/dashboard.html","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章