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":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章