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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvXn5jCQ-1670857125858)(png/image-20220516202841233.png)]

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

2.2为什么用Cloud Stream?

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6Z3bPEs-1670857125859)(png/image-20220516203004199.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odfmbmBp-1670857125859)(png/image-20220516203017561.png)]

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

Binder

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOQLbJRj-1670857125860)(png/image-20220516203143419.png)]

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

Topic主题进行广播

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

Spring Cloud Stream标准流程套路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoUJY7pA-1670857125860)(png/image-20220516203214716.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sfxj4avD-1670857125861)(png/image-20220516203241360.png)]

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

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

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

编码API和常用注解

组成说明
Middleware中间件,目前只支持RabbitMQ和Kafka
BinderBinder是应用与消息中间件之间的封装,目前实行了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模型控制台管理社区活跃度
EurekaAP支持低(2.x版本闭源)
ZookeeperCP不支持
consulCP支持
NacosAP支持

2、nacos安装

  • Java8+Maven环境

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

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

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

  • 结果页面

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OuKG9CIU-1670857125861)(png/image-20220516210913872.png)]

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与其他注册中心特性对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6v90BAzV-1670857125862)(png/image-20220516211333056.png)]

Nacos服务发现实例模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B6bGQoDD-1670857125862)(png/image-20220516211347017.png)]

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实现配置自动更新。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hs4oSrNv-1670857125862)(png/b3bffc4a646b30f9bf64fc649bf26f7d-16527073135572.png)]

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

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

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

1、是什么

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

2、三者情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhzxOK3w-1670857125863)(png/image-20220516212334895.png)]

默认情况: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方便,推荐模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmsBDM1r-1670857125863)(png/image-20220516212639045.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPFTQra6-1670857125864)(png/image-20220516212649882.png)]

按照上述,我们需要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配置的一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSWffjoO-1670857125864)(png/image-20220516213517635.png)]

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

./startup.sh - p 3333

./startup.sh - p 4444

./startup.sh - p 5555

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqkUpG7g-1670857125864)(png/image-20220516213742052.png)]

#启动
./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 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CAkB8ZVQ-1670857125865)(png/image-20220516214152756.png)]

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流控规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Zting4C-1670857125865)(png/image-20220516214631940.png)]

进一步解释说明:

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

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

配置及说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9mgYspN-1670857125866)(png/image-20220516214804605.png)]

表示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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTJ1l9k9-1670857125866)(png/image-20220516215459310.png)]

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秒。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZcpNcbE-1670857125867)(png/image-20220516220048350.png)]

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
<!--SpringCloud openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

YML,激活Sentinel对Feign的支持

feign:
  sentinel:
    enabled: true
业务类

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

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

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

6.2、熔断框架比较
-SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔商/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7dRvieYR-1670857125867)(png/image-20220516221518185.png)]

[{
    "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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Spring Cloud Alibaba 技术栈搭建项目手脚架可以提高开发效率和项目可维护性,以下是基于 Spring Cloud Alibaba 技术栈的项目手脚架搭建步骤: 1. 环境准备 确保已安装 JDK,Maven,Nacos,RocketMQ,Seata 和 Sentinel 等必需的软件。 2. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目,添加必需的依赖项: ```xml <!-- Spring Boot 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Cloud Alibaba 依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-dubbo</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> <!-- RocketMQ 依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-stream-rocketmq</artifactId> </dependency> ``` 3. 配置 Nacos 在 application.properties 文件中添加 Nacos 相关配置: ```properties spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=dev ``` 4. 配置 Dubbo 在 application.properties 文件中添加 Dubbo 相关配置: ```properties spring.application.name=service-provider spring.cloud.dubbo.application.name=service-provider spring.cloud.dubbo.registry.address=nacos://127.0.0.1:8848 spring.cloud.dubbo.protocol.name=dubbo spring.cloud.dubbo.protocol.port=20880 ``` 5. 配置 RocketMQ 在 application.properties 文件中添加 RocketMQ 相关配置: ```properties spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876 spring.cloud.stream.rocketmq.binder.group=group1 ``` 6. 配置 Seata 在 application.properties 文件中添加 Seata 相关配置: ```properties spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group ``` 7. 配置 Sentinel 在 application.properties 文件中添加 Sentinel 相关配置: ```properties spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080 ``` 8. 创建 Dubbo 服务接口 ```java public interface HelloService { String sayHello(String name); } ``` 9. 实现 Dubbo 服务接口 ```java @Service(version = "1.0.0") public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name; } } ``` 10. 配置 Dubbo 服务提供者 ```java @Configuration public class DubboProviderConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("service-provider"); return applicationConfig; } @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress("nacos://127.0.0.1:8848"); return registryConfig; } @Bean public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20880); return protocolConfig; } @Bean public ProviderConfig providerConfig() { ProviderConfig providerConfig = new ProviderConfig(); providerConfig.setTimeout(3000); return providerConfig; } @Bean public ServiceConfig<HelloService> helloServiceServiceConfig() { ServiceConfig<HelloService> serviceConfig = new ServiceConfig<>(); serviceConfig.setInterface(HelloService.class); serviceConfig.setRef(new HelloServiceImpl()); serviceConfig.setVersion("1.0.0"); return serviceConfig; } } ``` 11. 创建测试类 ```java @RunWith(SpringRunner.class) @SpringBootTest public class HelloServiceTest { @Reference(version = "1.0.0") private HelloService helloService; @Test public void sayHelloTest() { String result = helloService.sayHello("World"); Assert.assertEquals("Hello, World", result); } } ``` 12. 启动项目 正常启动项目,并在浏览器中访问 http://localhost:8848/nacos,可以看到 Nacos 控制台。 在 Dubbo 服务提供者启动后,在 Dubbo 服务消费者中调用 Dubbo 服务,验证服务调用成功。 在 Sentinel 控制台中配置相关规则,验证 Sentinel 报警和限流功能。 在 RocketMQ 控制台中创建一个主题,发送消息,验证消息发送和接收功能。 在 Seata 控制台中创建一个事务分组,验证分布式事务功能。 以上就是使用 Spring Cloud Alibaba 技术栈搭建项目手脚架的步骤,可以根据实际需求进行扩展和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值