风暴俱乐部|Sentinel:分布式系统流量防卫兵( 二 )


风暴俱乐部|Sentinel:分布式系统流量防卫兵链路:只记录指定链路上的流量 。 我写了两个测试接口test-a 和 test-b , 以及一个service方法common() , 代码如下:
@GetMapping("test-a")public String testa(){testService.common();return "test-a";}@GetMapping("test-b")public String testb(){testService.common();return "test-b";}@SentinelResource("common")public String common(){log.info("common.....");return "common";}此时我们设置链路规则:
风暴俱乐部|Sentinel:分布式系统流量防卫兵现在 , 我们请求/test-a请求 , 当超过阈值时就被限流了 , 但是/test-b不受影响 。
四、降级规则什么是降级?平均响应时间(秒级统计)超出阈值且在时间窗口内通过的请求大于某一值 , 就会触发降级(断路器打开) , 时间窗口结束 , 就会关闭降级 。 我们看一下sentinel控制台:
风暴俱乐部|Sentinel:分布式系统流量防卫兵关于降级源码 , 因为篇幅太长的缘故 , 我把图贴出来 , 感兴趣的朋友可以去看看:
风暴俱乐部|Sentinel:分布式系统流量防卫兵五、代码配置规则上面 , 我们都是在控制台配置规则 , 这儿我们用代码演示配置流控规则 , 只要编写这段代码就行啦 。 另外 , 其他规则配置方式可参考:如何使用#流量控制规则-flowrule
private void initFlowQpsRule() {List rules = new ArrayList<>();FlowRule rule = new FlowRule("/shares/1");// set limit qps to 20rule.setCount(20);rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setLimitApp("default");rules.add(rule);FlowRuleManager.loadRules(rules);}到这儿呢 , 我们已经可以配置一些规则来保证我们的应用不被猪队友拖死了哈哈 , 但是大家肯定想知道Sentinel 是如何与控制台通信的 , 控制台是如何获取到微服务的监控信息?又是如何将配置规则发送到各个微服务的呢?
六、Sentinel与控制台通信原理Sentinel 是如何与控制台通信的 , 大家先看一幅图:
风暴俱乐部|Sentinel:分布式系统流量防卫兵首先 , 微服务需要集成sentinel-transport-simple-http模块 , 每10秒发送一次心跳到Sentinel-Dashboard , 这样控制台就可以获取到微服务的监控信息了;同理 , 当控制台配置规则之后 , 又会将规则发送各个微服务 。 注册/心跳发送的源码大家可以到com.alibaba.csp.sentinel.transport.heartbeat中看一下:
public SimpleHttpHeartbeatSender() {List newAddrs = this.getDefaultConsoleIps();RecordLog.info("[SimpleHttpHeartbeatSender] Default console address list retrieved: " + newAddrs, new Object[0]);this.addressList = newAddrs;}通信api的源码 , 大家可以到com.alibaba.csp.sentinel.command.handler的实现类看一下 。
七、Feign整合Sentinel1、整合很简单 , 加配置即可
feign:sentinel:#为feign整合Sentinelenabled: true2、修改代码 , 编写fallback处理类 , 并在原来的feignclient注解上添加fallback属性 , 如下面代码所示 , 这样 , 当内容中心在调用用户中心接口出现流控或者降级时 , 会默认返回一个“默认用户”的User 。