一. 介绍
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. UNCTF-Crypto wp

    2020年 easy_rsa 题目 from Crypto.Util import number import gmpy2 from Crypto.Util.number import bytes_t ...

  2. STM32一个定时器输出四路不同频率和占空比PWM波的方法

    一般来说,一个定时器输出4路频率相同.占空比不同的PWM波是比较容易的,使用PWM模式即可实现.如果说是输出4路频率不同.占空比不同的PWM就没有现成的模式,是不是无法实现了呢?答案肯定是" ...

  3. 如何理解微服务体系结构中的 CQRS

    本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII. 问题描述 在典型的软件应用程序中,有一个负责写入和读取操 ...

  4. Qt官网开源最新版下载安装保姆级教程

    什么是Qt(了解请跳过) Qt 基本介绍 Qt 是一个跨平台C++图形用户界面应用程序开发框架. 有关 Qt 的详细介绍,可以参考这篇文章: Qt是什么?Qt简介(非常全面) - 李清龙的文章 - 知 ...

  5. [算法考研笔记]mm算法随笔[成绩划分][回溯0-1][得分][字段和][聪明小偷][股票买卖]

    mm算法随笔 学习笔记(回溯算法) 回溯 <---->递归1.递归的下面就是回溯的过程 回溯法是一个 纯暴力的 搜索.有的时候暴力求解都没有办法,用回溯可以解决. 回溯法解决的问题: 组合 ...

  6. [CF403E]Two Rooted Trees

    Two Rooted Trees 题面翻译 题目描述 你有两棵有根树,每棵树都有 \(n\) 个结点.不妨将这两棵树上的点都用 \(1\) 到 \(n\) 之间的整数编号.每棵树的根结点都是 \(1\ ...

  7. 企业应用开发中.NET EF常用哪种模式?

    前言 本篇文章来源于微信技术群小伙伴的提问,在企业应用开发中.NET ORM EF常用哪种模式进行开发?今天我们一起来了解一下EF开发的三种模式. EF/EF Core介绍 Entity Framew ...

  8. 关于SpringBoot中出现的循环依赖问题

    环境: SpringBoot2.7.8 背景: 在增加出库订单时需要对物品表的的数量进行修改 因此我在OutboundController中创建了几个公共方法,并将其注入到Spring中,结果给我报了 ...

  9. 整一个工具类【根据URL地址获取file文件对象】

    整一个工具类[根据URL地址获取file文件对象] 直接将网络url文件转换为file对象 import java.io.*; import java.net.URL; public class Im ...

  10. 从零玩转QQ登录-clwzqqdlu

    title: 从零玩转QQ登录 date: 2021-05-01 15:55:39.951 updated: 2023-03-30 13:29:03.865 url: https://www.yby6 ...