83-137-springcloud-stream-nacos-sentinel

83-137-springcloud-stream-nacos-sentinel:

Stream

常见MQ(消息中间件):ActiveMQ,RabbitMQ,RocketMQ,Kafka

Cloud Stream:屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。

spring cloud stream: https://spring.io/projects/spring-cloud-stream#overview

中文文档:https://m.wang1314.com/doc/webapp/topic/20971999.html

1、什么是Spring Cloud Stream?

官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。

应用程序通过inputs或者 outputs 来与Spring Cloud Stream中binder对象交互。通过我们配置来binding(绑定),而Spring Cloud Stream 的binder对象负责与消息中间件交互。
Spring Cloud Stream为一些供应商的消息中间件产品提供了个性化的自动化配置实现,引用了发布-订阅、消费组、分区的三个核心概念。目前仅支持RabbitMQ、 Kafka。

2、Stream的设计思想

2.1标准MQ

83-137-springcloud-stream-nacos-sentinel_第1张图片

生产者/消费者之间靠消息媒介传递信息内容
消息必须走特定的通道 - 消息通道 Message Channel
消息通道里的消息如何被消费呢,谁负责收发处理 - 消息通道MessageChannel的子接口SubscribableChannel,由MessageHandler消息处理器所订阅。

2.2为什么用Cloud Stream?

比方说我们用到了RabbitMQ和Kafka,由于这两个消息中间件的架构上的不同,像RabbitMQ有exchange,kafka有Topic和Partitions分区。

83-137-springcloud-stream-nacos-sentinel_第2张图片

83-137-springcloud-stream-nacos-sentinel_第3张图片

通过定义绑定器Binder作为中间层,实现了应用程序与消息中间件细节之间的隔离

Binder

  • INPUT对应于消费者
  • OUTPUT对应于生产者

83-137-springcloud-stream-nacos-sentinel_第4张图片

Stream中的消息通信方式遵循了发布-订阅模式

Topic主题进行广播

  • 在RabbitMQ就是Exchange
  • 在Kakfa中就是Topic
2.3、Stream编码常用注解简介

Spring Cloud Stream标准流程套路

83-137-springcloud-stream-nacos-sentinel_第5张图片

83-137-springcloud-stream-nacos-sentinel_第6张图片

Binder - 很方便的连接中间件,屏蔽差异。

Channel - 通道,是队列Queue的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过Channel对队列进行配置。

Source和Sink - 简单的可理解为参照对象是Spring Cloud Stream自身,从Stream发布消息就是输出,接受消息就是输入。

编码API和常用注解

组成 说明
Middleware 中间件,目前只支持RabbitMQ和Kafka
Binder Binder是应用与消息中间件之间的封装,目前实行了Kafka和RabbitMQ的Binder,通过Binder可以很方便的连接中间件,可以动态的改变消息类型(对应于Kafka的topic,RabbitMQ的exchange),这些都可以通过配置文件来实现
@Input 注解标识输入通道,通过该输乎通道接收到的消息进入应用程
@Output 注解标识输出通道,发布的消息将通过该通道离开应用程序
@StreamListener 监听队列,用于消费者的队列的消息接收
@EnableBinding 指信道channel和exchange绑定在一起

git:相关路径即项目

cloud-stream-rabbitmq-provider8801 cloud-stream-rabbitmq-consumer8802 cloud-stream-rabbitmq-consumer8803

2.4、stream重复消费以及解决方案

原理:微服务应用放置于同一个group中,就能够保证消息只会被其中一个应用消费一次。不同的组是可以重复消费的,同一个组内会发生竞争关系,只有其中一个可以消费。8802/8803都变成不同组,group两个不同。group: A_Group、B_Group

Sleuth,调用链路(了解)

cloud-provider-payment8001(服务方) cloue-consumer-order80(消费方)

1、Sleuth是什么

  • https://github.com/spring-cloud/spring-cloud-sleuth
  • Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案
  • 在分布式系统中提供追踪解决方案并且兼容支持了zipkin

2、Sleuth之zipkin搭建安装

1.zipkin下载

SpringCloud从F版起已不需要自己构建Zipkin Server了,只需调用jar包即可
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

https://repo1.maven.org/maven2/io/zipkin/zipkin-server/

java -jar zipkin-server-2.12.9-exec.jar

http://localhost:9411/zipkin/

CloudAlibaba

官网:https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

1、alibaba能干嘛

服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

2、含有那些技术

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

Spring Cloud Alibaba学习资料获取

官网:https://spring.io/projects/spring-cloud-alibaba#overview
英文:https://github.com/alibaba/spring-cloud-alibaba
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
中文:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Nacos

1、什么是nacos

  • Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus

  • https://github.com/alibaba/nacos/releases

  • https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring%20cloud%20alibaba%20nacos_discovery

各中注册中心比较

服务注册与发现框架 CAP模型 控制台管理 社区活跃度
Eureka AP 支持 低(2.x版本闭源)
Zookeeper CP 不支持
consul CP 支持
Nacos AP 支持

2、nacos安装

  • Java8+Maven环境

  • 从官网:https://github.com/alibaba/nacos/releases下载Nacos

  • 解压安装包,直接运行bin目录下的startup.cmd

  • 命令运行成功后直接访问http://localhost:8848/nacos,默认账号密码都是nacos

  • 结果页面

    83-137-springcloud-stream-nacos-sentinel_第7张图片

3、nacos服务和消费

官网文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

cloudalibaba-provider-payment9001,cloudalibaba-provider-payment9002,cloudalibaba-consumer-nacos-order83

测试

  • 启动nacos控制台
  • http://localhost:83/Eonsumer/payment/nacos/13

4、Nacos和CAP

Nacos与其他注册中心特性对比

83-137-springcloud-stream-nacos-sentinel_第8张图片

Nacos服务发现实例模型

83-137-springcloud-stream-nacos-sentinel_第9张图片

5、Nacos支持AP和CP模式的切换

cap(Consistency一致性,Availability 可用性,Partition tolerance 分区容忍性)

何时选择使用何种模式?

—般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

切换命令:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

6、nacos基础配置

cloudalibaba-config-nacos-client3377

在Nacos中添加配置信息,Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则

官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

说明:之所以需要配置spring.application.name,是因为它是构成Nacos配置管理dataId 字段的一部分。

在 Nacos Spring Cloud中,dataId的完整格式如下:

${spring.application.name)}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
spring.profile.active即为当前环境对应的 profile,详情可以参考 Spring Boot文档。注意:当spring.profile.active为空时,对应的连接符 - 也将不存在,datald 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
file-exetension为配置内容的数据格式,可以通过配置项spring .cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。
通过Spring Cloud 原生注解@RefreshScope实现配置自动更新。
83-137-springcloud-stream-nacos-sentinel_第10张图片

7、Nacos之命名空间分组和DataID三者关系

问题1:实际开发中,通常一个系统会准备,dev开发环境,test测试环境,prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?

1、是什么

类似Java里面的package名和类名最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑上区分两个目标对象。

2、三者情况

83-137-springcloud-stream-nacos-sentinel_第11张图片

默认情况:Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

Namespace是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务:一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ) ,给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。最后是Instance,就是微服务的实例。

8、nacos集群

nacos集群文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

集群部署架构图

因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面

http://ip1:port/openAPI直连ip模式,机器挂则需要修改ip才可以使用。

http://VIP:port/openAPI挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。

http://nacos.com:port/openAPI域名+VIP模式,可读性好,而且换ip方便,推荐模式

83-137-springcloud-stream-nacos-sentinel_第12张图片

83-137-springcloud-stream-nacos-sentinel_第13张图片

按照上述,我们需要mysql数据库。

官网说明

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

Nacos支持三种部署模式
单机模式-用于测试和单机试用。
集群模式-用于生产环境,确保高可用。
多集群模式-用于多数据中心场景。
Windows
cmd startup.cmd或者双击startup.cmd文件
单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
安装数据库,版本要求:5.6.5+
初始化mysq数据库,数据库初始化文件: nacos-mysql.sql
修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.10.101:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=mysql

再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql。

8.1、nacos持久化配置
Nacos默认自带的是嵌入式数据库derby,nacos的pom.xml中可以看出。
derby到mysql切换配置步骤:
nacos-server-1.1.4\nacos\conf录下找到nacos-mysql.sql文件,执行脚本。
nacos-server-1.1.4\nacos\conf目录下找到application.properties,添加以下配置(按需修改对应值)。
8.2、nacos-linux集群安装

注:记得备份原来的文件

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
请确保是在环境中安装使用:
64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
64 bit JDK 1.8+;下载.配置。
Maven 3.2.x+;下载.配置。
3个或3个以上Nacos节点才能构成集群。
https://github.com/alibaba/nacos/releases/tag/1.1.4
nacos-server-1.1.4.tar.gz 解压后安装

8.2.1、Linux服务器上mysql数据库配置

SQL脚本在哪里 - 目录nacos/conf/nacos-mysql.sql,执行sql脚本

8.2.1.2、application.properties配置

修改自己的mysql信息

8.2.1.3、Linux服务器上nacos的集群配置cluster.conf

梳理出3台nacos集器的不同服务端口号,设置3个端口:

192.168.10.101:3333
192.168.10.101:4444
192.168.10.101:5555

修改./startup.sh

但是,集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。
命令: ./startup.sh -p 3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。

83-137-springcloud-stream-nacos-sentinel_第14张图片

执行方式 - startup.sh - p 端口号

./startup.sh - p 3333

./startup.sh - p 4444

./startup.sh - p 5555

8.2.3.4、Nginx的配置,由它作为负载均衡器

修改nginx的配置文件 - nginx.conf

83-137-springcloud-stream-nacos-sentinel_第15张图片

#启动
./nginx -c /usr/local/nginx/conf/nginx.cong

截止到此处,1个Nginx+3个nacos注册中心+1个mysql

测试,启动3个nacos注册中心
startup.sh - p 3333
startup.sh - p 4444
startup.sh - p 5555
查看nacos进程启动数ps -ef | grep nacos | grep -v grep | wc -l
启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf
查看nginx进程ps - ef| grep nginx
测试通过nginx,访问nacos - http://192.168.111.144:1111/nacos/#/login
#nacos新建一个配置测试后查询sql“select * from config;”

Sentinel

官网githug:https://gitcode.net/mirrors/alibaba/sentinel?utm_source=csdn_github_accelerator

官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html

https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D#sentinel-%E6%98%AF%E4%BB%80%E4%B9%88

1、Sentinel 是什么?

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

83-137-springcloud-stream-nacos-sentinel_第16张图片

2、Hystrix与Sentinel比较

cloudalibaba-sentinel-service8401

Hystrix:
需要我们程序员自己手工搭建监控平台
没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级
Sentinel:
单独一个组件,可以独立出来。
直接界面化的细粒度统一配置。

约定 > 配置 > 编码

官方文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel

服务使用中的各种问题:
		服务雪崩
		服务降级
		服务熔断
		服务限流
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
安装步骤:
下载
https://github.com/alibaba/Sentinel/releases
下载到本地sentinel-dashboard-1.7.0.jar
运行命令
前提
		Java 8 环境
		8080端口不能被占用
命令
		java -jar sentinel-dashboard-1.7.0.jar
访问Sentinel管理界面
localhost:8080
登录账号密码均为sentinel

Sentinel采用的懒加载说明
执行一次访问即可
http://localhost:8401/testA
http://localhost:8401/testB
效果 - sentinel8080正在监控微服务8401

3、Sentinel流控规则

83-137-springcloud-stream-nacos-sentinel_第17张图片

进一步解释说明:

资源名:唯一名称,默认请求路径。
针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
阈值类型/单机阈值:
	QPS(每秒钟的请求数量)︰当调用该API的QPS达到阈值的时候,进行限流。
	线程数:当调用该API的线程数达到阈值的时候,进行限流。
是否集群:不需要集群。
流控模式:
	直接:API达到限流条件时,直接限流。
	关联:当关联的资源达到阈值时,就限流自己。
	链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
流控效果:
	快速失败:直接失败,抛异常。
	Warm up:根据Code Factor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
	排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

Sentinel流控-QPS直接失败
直接 -> 快速失败(系统默认)

配置及说明

83-137-springcloud-stream-nacos-sentinel_第18张图片

表示1秒钟内查询1次就是OK,若超过次数1,就直接->快速失败,报默认错误

测试:快速多次点击访问http://localhost:8401/testA

结果:返回页面 Blocked by Sentinel (flow limiting)

源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

4、基本配置同流控

QPS直接失败,线程数直接失败,关联,预热,排队等待

5、降级和熔断

熔断降级alibaba链接:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

83-137-springcloud-stream-nacos-sentinel_第19张图片

RT(平均响应时间,秒级):
	平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级。
	窗口期过后关闭断路器。
	RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)。
异常比列(秒级):
	QPS >= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 。
异常数(分钟级):
	异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

Sentinei的断路器是没有类似Hystrix半开状态的。(Sentinei 1.8.0 已有半开状态)

半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。

5.1、Sentinel降级-RT

是什么?

平均响应时间(DEGRADE_GRADE_RT):当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阈值( count,以ms为单位),那么在接下的时间窗口(DegradeRule中的timeWindow,以s为单位)之内,对这个方法的调用都会自动地熔断(抛出DegradeException )。注意Sentinel 默认统计的RT上限是4900 ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。

注意:Sentinel 1.7.0才有平均响应时间DEGRADE_GRADE_RT),Sentinel 1.8.0的没有这项,取而代之的是慢调用比例 (SLOW_REQUEST_RATIO)。

5.2、Sentinel降级-异常比例

是什么?

异常比例(DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值( DegradeRule中的 count)之后,资源进入降级状态,即在接下的时间窗口( DegradeRule中的timeWindow,以s为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是[0.0, 1.0],代表0% -100%。

注意,与Sentinel 1.8.0相比,有些不同(Sentinel 1.8.0才有的半开状态),Sentinel 1.8.0的如下:

异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

5.3、Sentinel降级-异常数

是什么?

异常数( DEGRADE_GRADF_EXCEPTION_COUNT ):当资源近1分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若timeWindow小于60s,则结束熔断状态后码可能再进入熔断状态。

注意,与Sentinel 1.8.0相比,有些不同(Sentinel 1.8.0才有的半开状态),Sentinel 1.8.0的如下:

异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

接下来讲解Sentinel 1.7.0的。

异常数是按照分钟统计的,时间窗口一定要大于等于60秒。

83-137-springcloud-stream-nacos-sentinel_第20张图片

5.4、Sentinel降级-热点key

6、Sentinel服务熔断

6.1、sentinel整合ribbon+openFeign+fallback

Ribbon系列

  • 启动nacos和sentinel
  • 提供者9003/9004
  • 消费者84

提供者9003/9004

新建cloudalibaba-provider-payment9003/9004,两个一样的做法

测试地址 - http://localhost:9003/paymentSQL/1

消费者84:新建cloudalibaba-consumer-nacos-order84

目的

fallback管运行异常
blockHandler管配置违规
测试地址 - http://localhost:84/consumer/fallback/1
没有任何配置
只配置fallback
只配置blockHandler
fallback和blockHandler都配置
忽略属性

Sentinel服务熔断OpenFeign

修改84模块

84消费者调用提供者9003

Feign组件一般是消费侧

POM


    org.springframework.cloud
    spring-cloud-starter-openfeign

YML,激活Sentinel对Feign的支持

feign:
  sentinel:
    enabled: true
业务类

带@Feignclient注解的业务接口,fallback = PaymentFallbackService.class

测试 - http://localhost:84/consumer/paymentSQL/1

测试84调用9003,此时故意关闭9003微服务提供者,84消费侧自动降级,不会被耗死。

6.2、熔断框架比较
- Sentinel Hystrix resilience4j
隔离策略 信号量隔离(并发线程数限流) 线程池隔商/信号量隔离 信号量隔离
熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率 基于异常比率、响应时间
实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于RxJava) Ring Bit Buffer
动态规则配置 支持多种数据源 支持多种数据源 有限支持
扩展性 多个扩展点 插件的形式 接口的形式
基于注解的支持 支持 支持 支持
限流 基于QPS,支持基于调用关系的限流 有限的支持 Rate Limiter
流量整形 支持预热模式匀速器模式、预热排队模式 不支持 简单的Rate Limiter模式
系统自适应保护 支持 不支持 不支持
控制台 提供开箱即用的控制台,可配置规则、查看秒级监控,机器发观等 简单的监控查看 不提供控制台,可对接其它监控系统
6.3、sentinel持久化

一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化。

将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上sentinel上的流控规则持续有效。

yml中配置

datasource: #<---------------------------关注点,添加Nacos数据源配置
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

83-137-springcloud-stream-nacos-sentinel_第21张图片

[{
    "resource": "/rateLimit/byUrl",
    "IimitApp": "default",
    "grade": 1,
    "count": 1, 
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
}]
resource:资源名称;
limitApp:来源应用;
grade:阈值类型,0表示线程数, 1表示QPS;
count:单机阈值;
strategy:流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群。
启动8401后刷新sentinel发现业务规则有了

学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

你可能感兴趣的:(java,spring,cloud,sentinel,java)