物联网架构成长之路(53)-Sentinel流量控制中间件入门
0. 前言
1. 运行启动sentinel-dashboard
到这里 https://github.com/alibaba/Sentinel/releases/download/1.7.1/sentinel-dashboard-1.7.1.jar 下载sentinel-dashboard
运行 java -jar sentinel-dashboard-1.7.1.jar --server.port=8858
提供Docker方式部署
➜ sentinel cat docker-compose.yml
1 version: '3.7' 2 services: 3 sentinel: 4 image: bladex/sentinel-dashboard:latest 5 ports: 6 - "8858:8858" 7 environment: 8 - auth.username=sentinel 9 - auth.password=123456
2. Sentinel 客户端编码
pom.xml 增加
1 <dependency> 2 <groupId>com.alibaba.cloud</groupId> 3 <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> 4 </dependency>
application.properties
1 spring.application.name=demo 2 spring.cloud.sentinel.transport.dashboard=127.0.0.1:8858
Java代码提供了代码方式和注解方式集成
HelloProviderService.java
1 package com.wunaozai.demo; 2 3 import org.springframework.stereotype.Service; 4 5 import com.alibaba.csp.sentinel.annotation.SentinelResource; 6 7 @Service 8 public class HelloProviderService { 9 10 @SentinelResource(value="say") 11 public String sayHello(String msg) { 12 return "Hello " + msg; 13 } 14 }
HelloConsumerController.java
1 package com.wunaozai.demo; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.web.bind.annotation.GetMapping; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RestController; 7 8 import com.alibaba.csp.sentinel.Entry; 9 import com.alibaba.csp.sentinel.EntryType; 10 import com.alibaba.csp.sentinel.SphU; 11 import com.alibaba.csp.sentinel.annotation.SentinelResource; 12 import com.alibaba.csp.sentinel.slots.block.BlockException; 13 14 @RestController 15 @RequestMapping(value="/hello") 16 public class HelloConsumerController { 17 18 @Autowired 19 private HelloProviderService helloproviderService; 20 21 @SentinelResource(value="testResource") 22 @RequestMapping(value="/say") 23 public String sayHello(String msg) { 24 String ret = helloproviderService.sayHello(msg); 25 return ret; 26 } 27 28 @GetMapping(value="/testSentinel") 29 public String testSentinel() { 30 String resName = "testSentinel"; 31 Entry entry = null; 32 String retVal; 33 try { 34 entry = SphU.entry(resName, EntryType.IN); 35 retVal = "passed"; 36 } catch (BlockException e) { 37 retVal = "blocked"; 38 }finally { 39 if(entry != null) { 40 entry.exit(); 41 } 42 } 43 return retVal; 44 } 45 }
3. 运行及配置
由于是简单的应用,所以,在没有配置Sentinel的前提下,基本可以访问
1 http://127.0.0.1:8080/hello/testSentinel 2 http://127.0.0.1:8080/hello/say?msg=yyy
这两个路径,没有发生错误。
配置流控规则
配置流控后,再快速访问上面两个路径。
1 http://127.0.0.1:8080/hello/testSentinel 超出QPS=2时,会出现 blocked 2 http://127.0.0.1:8080/hello/say?msg=yyy 超出QPS=5时,会出现程序异常
从下图可以看到,超出QPS=5时,出现一次异常。
4. 持久化到Nacos
Sentinel Dashboard中添加的规则是存储在内存中的,只要项目一重启规则就丢失了
此处将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中;
pom.xml 增加
1 <dependency> 2 <groupId>com.alibaba.csp</groupId> 3 <artifactId>sentinel-datasource-nacos</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>com.google.guava</groupId> 7 <artifactId>guava</artifactId> 8 <version>15.0</version> 9 <scope>compile</scope> 10 </dependency>
application.properties 增加
1 spring.cloud.sentinel.datasource.ds.nacos.server-addr=127.0.0.1:8848 2 spring.cloud.sentinel.datasource.ds.nacos.data-id=mz-sentinel 3 spring.cloud.sentinel.datasource.ds.nacos.group-id=DEFAULT_GROUP 4 spring.cloud.sentinel.datasource.ds.nacos.data-type=json 5 spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow
nacos 增加
1 [ 2 { 3 "resource": "/hello", 4 "limitApp": "default", 5 "grade": 1, 6 "count": 5, 7 "strategy": 0, 8 "controlBehavior": 0, 9 "clusterMode": false 10 } 11 ]
启动后,过一会,就会出现
5. 其他
通过上面,配置基本实现Sentinel规则持久化,每次重启Sentinel后能恢复。但是这个时候,出现一个问题,就是在Sentinel-dashboard控制台修改时,不会保存到Nacos。但是Nacos在其客户端总有Listener监听器实现自动更新。所以在Nacos重新发布配置更新时,对应的Sentinel流控也会更新。基本实现动态化。
Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。
Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。
参考资料:
https://www.cnblogs.com/gyli20170901/p/11279576.html
http://blog.didispace.com/spring-cloud-alibaba-sentinel-2-1/
https://github.com/alibaba/Sentinel/blob/master/sentinel-dashboard/src/main/resources/application.properties
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
本文地址:https://www.cnblogs.com/wunaozai/p/12404712.html
本系列目录: https://www.cnblogs.com/wunaozai/p/8067577.html
个人主页:https://www.wunaozai.com/
作者:无脑仔的小明 出处:http://www.cnblogs.com/wunaozai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。有需要沟通的,可以站内私信,文章留言,或者关注“无脑仔的小明”公众号私信我。一定尽力回答。 |