一. 介绍
Sentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩”效应,为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。

通常情况,Hystrix采用线程池对服务的调用进行隔离,Sentinel采用了用户线程对接口进行隔离,二者相比,Hystrxi是服务级别的隔离,Sentinel提供了接口级别的隔离,Sentinel隔离级别更加精细,另外Sentinel直接使用用户线程进行限制,相比Hystrix的线程池隔离,减少了线程切换的开销。另外Sentinel的DashBoard提供了在线更改限流规则的配置,也更加的优化。

二. 特征
丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。

完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
————————————————

1.引入pom依赖:

    <!--<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.2</version>
</dependency>--> <dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-netty-http</artifactId>
<version>1.8.2</version>
</dependency>

2. 启动类加初始化:InitExecutor.doInit()。

(3)监听ApolloConfig的流控规则;

package com.siebel.api.server.config.rest;

import com.aswatson.common.sentinel.parameter.flow.datasource.ApolloDataSourceRuleManager;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration; @Configuration
@Slf4j
public class ApolloConfig { Logger logger = LoggerFactory.getLogger(getClass()); @ApolloConfigChangeListener(value = {"siebel-api-server_rules"}, interestedKeys = {"siebel-api-server-flow-rules"})
public void loadRules(ConfigChangeEvent changeEvent) {
ConfigChange change;
for (String key : changeEvent.changedKeys()) { change = changeEvent.getChange(key);
// 打印出新增或者变化的配置 相关信息
logger.info(String.format("Change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
change.getPropertyName(), change.getOldValue(), change.getNewValue(),
change.getChangeType())); ApolloDataSourceRuleManager.loadRules(change.getNewValue()); }
} @ApolloConfigChangeListener(value = {"siebel-api-server_rules"}, interestedKeys = {"siebel-api-server-param-rules"})
public void loadParamRules(ConfigChangeEvent changeEvent) {
ConfigChange change;
for (String key : changeEvent.changedKeys()) { change = changeEvent.getChange(key);
// 打印出新增或者变化的配置 相关信息
logger.info(String.format("Change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
change.getPropertyName(), change.getOldValue(), change.getNewValue(),
change.getChangeType())); ApolloDataSourceRuleManager.loadParamRules(change.getNewValue()); }
} @Value("${siebel-api-server-flow-rules:}")
public void initLoadRules(String flowRulesJsonStr) {
ApolloDataSourceRuleManager.loadRules(flowRulesJsonStr);
} @Value("${siebel-api-server-param-rules:}")
public void initLoadParamRules(String rulesJsonStr) {
ApolloDataSourceRuleManager.loadParamRules(rulesJsonStr);
} }

(4)apollo配置如图:siebel-api-server_rules 是自动生成到apollo的

(5)定义限流资源,(有5种方式)1.抛出异常的方式;改造接口代码: filterSentinelRules (限流的代码)

    public ASWPOSInboundLoyaltyMember_Output aSWPOSInboundLoyaltyMember(ASWPOSInboundLoyaltyMember_Input input) throws Exception {
String buId = buManager.getBuId(input.getBUID());
Assert.hasText(buId, () -> String.format("get buId failed,can't find buId base on given input.input=%s", input.getBUID()));
try {
filterSentinelRules(ASWPOSInboundLoyaltyMember, buId);
} catch (SentinelException e) {
e.printStackTrace();
return getSentinelRulesOutPut(new ASWPOSInboundLoyaltyMember_Output());
}
sendRequestOperationLog(ASWPOSInboundLoyaltyMember, input.getMessageXML(), input.getCardNumber(), buId, input.getBUID());
ASW_spcPOS_spcInboundSkeletonInterface asw_spcPOS_spcInboundSkeleton = getASW_spcPOS_spcInboundSkeletonInstance();
ASWPOSInboundLoyaltyMember_Output output = asw_spcPOS_spcInboundSkeleton.aSWPOSInboundLoyaltyMember(input);return output;
} private void filterSentinelRules(String requestApiName, String buId) {
Entry entry = null;
try {
entry = SphU.entry(requestApiName, EntryType.IN, 1, buId);
       Thread.sleep(2000); //模拟断开连接测试
} catch (BlockException ex) {
log.error("Current requestApiName limiting SentinelRules: apiName|{}, buId|{}, msg|{}", buId,
requestApiName, ex.getMessage());
throw new SentinelException(ex.getMessage());
} finally {
if (entry != null) {
entry.exit(1, buId);
}
}
}

(6)sentinel控制台定义规则:

2.

 测试结果:

1. 必须要先配置sentinel的环境变量,也可以在IDEA中配置:

-Djava.net.preferIPv4Stack=true
##Sentinel Dashboard 通过此端口获取 应用流控统计数据
-Dcsp.sentinel.api.port=8443
##Sentinel Dashboard 访问url
-Dcsp.sentinel.dashboard.server=10.95.35.93:32289
#配置appid=cdcsit.cdc,@项目名
-Dproject.name=cdcsit.cdc@siebel-api-server
##配置sentinel控制台对应ip,默认的,可以不配
-Dcsp.sentinel.heartbeat.client.ip=10.95.33.131

2. 同一个bu类型,同时去访问,因为配置限流,8s内只能有一个线程访问成功,所以另一个请求返回失败,提示 异常 limit by sentinel rule:

服务降级,限流等--sentinel(SpringCloud Alibaba)的更多相关文章

  1. springcloud3(六) 服务降级限流熔断组件Resilience4j

    代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-gateway/src/test/java/com/ ...

  2. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  3. springBoot整合Sentinel实现降级限流熔断

    由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...

  4. Spring Cloud微服务限流之Sentinel+Apollo生产实践

    Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高的情况下,由于网络调用之间存 ...

  5. 限流神器Sentinel,不了解一下吗?

    概述 书接上回:你来说说什么是限流? ,限流的整体概述中,描述了 限流是什么,限流方式和限流的实现.在文章尾部的 分布式限流,没有做过多的介绍,选择了放到这篇文章中.给大伙细细讲解一下 Sentine ...

  6. 阿里巴巴开源限流组件Sentinel初探

    1 Sentinel主页 https://github.com/alibaba/Sentinel/wiki/主页 1.1 Sentinel介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要. ...

  7. 阿里限流神器Sentinel夺命连环 17 问?

    1.前言 这是<spring Cloud 进阶>专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产 ...

  8. 微服务熔断限流Hystrix之流聚合

    简介 上一篇介绍了 Hystrix Dashboard 监控单体应用的例子,在生产环境中,监控的应用往往是一个集群,我们需要将每个实例的监控信息聚合起来分析,这就用到了 Turbine 工具.Turb ...

  9. 令牌桶、漏斗、冷启动限流在sentinel的应用

    分布式系统为了保证系统稳定性,在服务治理的限流中会根据不同场景进行限流操作,常见的限流算法有: 令牌桶:可容忍一定突发流量的速率的限流,令牌桶算法的原理是系统以恒定的速率产生令牌,然后把令牌放到令牌桶 ...

  10. 微服务组件--限流框架Spring Cloud Hystrix分析

    Hystrix的介绍 [1]Hystrix是springCloud的组件之一,Hystrix 可以让我们在分布式系统中对服务间的调用进行控制加入一些调用延迟或者依赖故障的容错机制. [2]Hystri ...

随机推荐

  1. 【Android】无法通过drawable下的selector类型改变背景颜色?

    举例 我在darwable目录下创建了selector文件,并设置了如下内容 <?xml version="1.0" encoding="utf-8"?& ...

  2. WPF 绑定binding都有哪些事件

    在WPF中,源属性(Source Property)指的是提供数据的属性,通常是数据模型或者其他控件的属性,而目标属性(Target Property)则是数据绑定的目标,通常是绑定到控件的属性,例如 ...

  3. 通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)

    目录 1. 概述 2. NodePort 方式 3. Ingress 方式 4. 救命稻草 5. 其他 1. 概述 今天聊点啥呢,话说,你有没有想过怎样用 VS Code 连上 K8s 集群内的某个 ...

  4. 聊一聊 .NET高级调试 内核模式堆泄露

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下: 在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已 ...

  5. 5s!用浏览器打造一个开箱即用的Linux系统

    做为Linux系统管理员.或者是系统运维工程师,肯定会在工作遇到这样的需求:需要开发环境.测试环境.准生产环境等等环境,有时候建一个环境费时间不说,还容易出各种错误,好不容易建好了,可能还用不了几天. ...

  6. hwclock详解

    linux下hwclock命令详解 hwclock(hardware clock) 功能说明:显示与设定硬件时钟. 语 法:hwclock [--adjust][--debug][--directis ...

  7. electron入门之试调工具remote(三)

    electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...

  8. Docker 使用及常见问题总结

    一.使用 1.docker run -it 命令中的 it 参数是什么含义 在Docker中,-it是两个选项的组合,用于在交互式模式下运行容器.让我解释一下它们的含义: -i 或 --interac ...

  9. 在xml中比较运算符

    SQL 中,可以使用比较运算符来比较两个值,如使用小于运算符 < 比较两个值大小.但是,在 SQL 查询中,有时候需要将小于运算符 < 用于 XML 或 HTML 语法中,这会导致语法冲突 ...

  10. 云图说|ModelArts开发环境,让AI开发、探索、教学更简单

    摘要:ModelArts开发环境,以云原生的资源使用和开发工具链的集成,目标为不同类型AI开发.探索.教学用户. 本文分享自华为云社区<[云图说]| 第280期 ModelArts开发环境,让A ...