一. 介绍
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. 深入了解HMAC加密技术:原理、应用与实践

    一.引言 在网络安全领域,消息认证码(MAC)是一种重要的技术手段.Hash-based Message Authentication Code(HMAC)作为其中的一种,凭借其简单.高效.安全的特性 ...

  2. Go笔记(1)-变量的详细用法

    变量 (1)变量的定义 Go语言是静态类型的语言,所有类型都需要明确的定义. var是声明变量的关键字 使用格式:var 变量名 变量类型 变量命名规范:遵循驼峰格式,首个单词小写,每个新单词的首字母 ...

  3. 解决Spring Boot Mail无法发送HTML格式的邮件

    Spring Boot版本:2.6.2 查阅spring-boot-starter-mail源码的MimeMessageHelper.setText方法,发现有个Boolean类型参数控制是否是HTM ...

  4. .NET开源且好用的权限工作流管理系统

    前言 系统权限管理.工作流是企业应用开发中很常见的功能,虽说开发起来难度不大,但是假如从零开始开发一个完整的权限管理和工作流平台的话也是比较耗费时间的.今天推荐一款.NET开源且好用的权限工作流管理系 ...

  5. .NET微信网页开发之网页授权获取用户基本信息

    开发背景 当用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑.我们一般通过用户网页授权来无感实现用户登录,并获取用户的微信信息. 注意:用户管理类 ...

  6. Tensorflow2.0实战之Auto-Encoder

    autoencoder可以用于数据压缩.降维,预训练神经网络,生成数据等等 Auto-Encoder架构 需要完成的工作 需要完成Encoder和Decoder的训练 例如,Mnist的一张图片大小为 ...

  7. LIS和LCS算法分析

    LIS(最长上升子序列) 常规的解法就是动态规划. mx[ j ]表示长度为j的上升子序列最小的值a[i]; dp[ i ]表示前i个数的最长上升子序列长度多少. 1 for(int i=1;i< ...

  8. 最新消息:OpenAI GPT Store 正式上线,GPTs 应用商店来了!

    OpenAI推出的两款新产品和服务:GPT Store和ChatGPT Team,提供了许多全新的解决方案和功能,旨在帮助用户更轻松地使用和构建GPT工具,同时也增加了公司的收入来源.GPT Stor ...

  9. Mysql在sql中截取时间类型字段的年月日和时间

    DATE_FORMAT() 函数 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式.我们使用 NOW() 来获得当 ...

  10. GaussDB(DWS)函数不同写法引发的结果差异

    本文分享自华为云社区<GaussDB(DWS)函数结果差异案例之greatest>,作者: 你是猴子请来的救兵吗. GaussDB(DWS)支持多种兼容模式,为了兼容目标数据库,各模式之间 ...