栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloudAlibaba

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloudAlibaba

SpringCloudAlibaba
    • 官方文档
    • 主要功能
    • 组件
    • Nacos
    • 服务注册
    • 配置中心
    • 微服务配置分组管理
    • Nacos集群搭建
    • Sentinel
    • 流量监控
    • 流控规则简介
    • 服务降级
    • 降级规则简介

官方文档

中文文档
英文文档

主要功能

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

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

下载地址

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
替代Eureka做服务注册中心,替代Config做服务配置中心

Nacos与其他注册中心对比

Nacos支持AP和CP模式的切换

C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
—般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

服务注册

引入依赖


         
       com.alibaba.cloud
       spring-cloud-alibaba-dependencies
       2.1.0.RELEASE
       pom
       import
     

       
           com.alibaba.cloud
           spring-cloud-starter-alibaba-nacos-discovery
       

配置文件

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider # 微服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

开启配置

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient //将微服务注册进nacos
@SpringBootApplication
public class PaymentMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9002.class, args);
    }
}

查看是否注册成功

  1. 启动微服务
  2. 启动nacos
  3. 打开nacos管理页面(http://localhost:8848/nacos),输入账号密码nacos
  4. 点击服务列表就会出现,注册进来的微服务
配置中心

引入依赖

  
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

配置文件
注:Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap.yml优先级高于application.yml,所以对于全局微服务的配置,全部放在bootstrap.yml中,而对于nacosConfig自己的配置则存在于application.yml中。

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定所有微服务配置文件的格式
      #  group: DEV_GROUP
       # namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4



#Data ID为: nacos-config-client-dev.yaml

application.yml

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: info

Nacos中添加配置信息
Nacos中的Data ID的组成格式

Data ID的配置格式为:${prefix}-${spring-profile.active}.${file-extension}
解析后配置格式为:${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。即上文application.yml中配置的spring.profile.active。注意:当spring.profile.active为空时,对应的连接符 - 也将不存在,datald 的拼接格式变成 ${prefix}.${file-extension},不建议为空
  • file-exetension为配置内容的数据格式,可以通过配置项spring .cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。
  • 过Spring Cloud 原生注解@RefreshScope实现配置自动更新

打开nacos,图中箭头所指即为Data ID,按照图中步骤,在Nacos中添加配置信息

开启配置

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDiscoveryClient //将服务注册到nacos
@SpringBootApplication
public class NacosConfigClientMain3377
{
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope //实现配置自动更新
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

查看是否配置成功
1.访问接口,查看配置信息(http://localhost:3377/config/info),若能返回
上图中配置的 nacos version 1.0,则说明配置成功
2.将上述配置文件中的config.info 改成nacos version 2.0,再次访问http://localhost:3377/config/info,查看有无变化,若改变则配置成功

微服务配置分组管理

实际开发中,通常一个系统会准备,dev开发环境,test测试环境,prod生产环境。为了保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件,所以Nacos通过,Namespace(命名空间)+Group(分组)+Data lD,对微服务配置进行管理。

  • 通过dataId进行分组管理

    在application.yml中指定开发环境
spring:
  profiles:
   # active: dev  #开发环境
    active: test  # 测试环境

  • 通过Group进行分组

    bootstrap.yml中指定分组名
# nacos配置
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定所有微服务配置文件的格式
        group: TEST_GROUP #指定配置文件所处分组

在application.yml中指定开发环境

spring:
  profiles:
   # active: dev  #开发环境
   # active: test  # 测试环境
    active: info  # 其他分组配置文件

  • 通过Namespace进行分组
    点击命名空间,新建命名空间

    点击dev命名空间,新建配置文件

    点击test命名空间,新建配置文件

    复制命名空间ID

    bootstrap.yml中指定命名空间ID,分组名
# nacos配置
server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定所有微服务配置文件的格式
        namespace: f8c4f405-b29e-4f88-ad3b-553030b02239 #指定命名空间ID
        group: DEV_GROUP #指定分组

application.yml中指定开发环境

spring:
  profiles:
    active: dev  #开发环境
Nacos集群搭建

官网搭建说明

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

持久化切换配置(windos版本)
将原有的Derby数据库切换到mysql
1.在nacos的安装目录nacos-server-1.1.4nacosconf下找到nacos-mysql.sql文件,创建名为nacos_config的数据库,在该数据库中执行脚本
2.在nacos的安装目录nacos-server-1.1.4nacosconf目录下找到application.properties,添加以下配置,将数据库用户名密码改为自己的

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234

  • Linux中Nacos集群搭建
    1.下载linux版本的nacos
    2.将文件上传到linux后并解压安装
    3.在nacon的安装目录nacos/conf/中找到nacos-mysql.sql,在该linux的mysql中新建名为nacos_config的数据库,并执行nacos-mysql.sql脚本
    4.在nacon的安装目录nacos/conf/中找到application.properties,添加如下配置,将数据库用户名密码改为自己的
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=1234

5.在nacon的安装目录nacos/conf/目录下执行如下命令,将集群配置文件拷贝一份出来

 cp cluster.conf.example cluster.conf

6.执行如下命令,复制IP

 hostname -i

7.将cluster.conf文件中的内容改为如下配置

#it is ip
#example
#10.10.109.214
#11.16.128.34
#11.16.128.36
################以上为原来的内容,注释掉#########################
#### 这里的172.31.126.115是步骤6的当中复制的IP,端口号可以自定义
172.31.126.115:3333
172.31.126.115:4444
172.31.126.115:5555

8.切换到nacos安装目录/nacos/bin执行如下命令,拷贝startup.sh文件

 cp startup.sh startup.sh.info

9.更改startup.sh文件,平时单机版的启动,都是./startup.sh即可
但是,集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例,所以需要作出更改

#!/bin/sh

# Copyright 1999-2018 Alibaba Group Holding Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME

if [ -z "$JAVA_HOME" ]; then
  if $darwin; then

    if [ -x '/usr/libexec/java_home' ] ; then
      export JAVA_HOME=`/usr/libexec/java_home`

    elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
      export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
    fi
  else
    JAVA_PATH=`dirname $(readlink -f $(which javac))`
    if [ "x$JAVA_PATH" != "x" ]; then
      export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
    fi
  fi
  if [ -z "$JAVA_HOME" ]; then
        error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
  fi
fi

export SERVER="nacos-server"
export MODE="cluster"
export FUNCTION_MODE="all"
while getopts ":m:f:s:p:" opt
do
    case $opt in
        m)
            MODE=$OPTARG;;
        f)
            FUNCTION_MODE=$OPTARG;;
        s)
            SERVER=$OPTARG;;
		p)
            PORT=$OPTARG;;
        ?)
        echo "Unknown parameter"
        exit 1;;
    esac
done

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=`cd $(dirname $0)/..; pwd`
export DEFAULT_SEARCH_LOCATIONS="classpath:/,classpath:/config/,file:./,file:./config/"
export CUSTOM_SEARCH_LOCATIONS=${DEFAULT_SEARCH_LOCATIONS},file:${BASE_DIR}/conf/

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

fi

if [[ "${FUNCTION_MODE}" == "config" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
elif [[ "${FUNCTION_MODE}" == "naming" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
fi


JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/1/p')
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
  JAVA_OPT="${JAVA_OPT} -cp .:${BASE_DIR}/plugins/cmdb/*.jar:${BASE_DIR}/plugins/mysql/*.jar"
  JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400"
else
  JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:${BASE_DIR}/plugins/cmdb:${BASE_DIR}/plugins/mysql"
  JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi

JAVA_OPT="${JAVA_OPT} -Dnacos.home=${BASE_DIR}"
JAVA_OPT="${JAVA_OPT} -Dloader.path=${BASE_DIR}/plugins/health -jar ${BASE_DIR}/target/${SERVER}.jar"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} --spring.config.location=${CUSTOM_SEARCH_LOCATIONS}"
JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/nacos-logback.xml"
JAVA_OPT="${JAVA_OPT} --server.max-http-header-size=524288"

if [ ! -d "${BASE_DIR}/logs" ]; then
  mkdir ${BASE_DIR}/logs
fi

echo "$JAVA ${JAVA_OPT}"

if [[ "${MODE}" == "standalone" ]]; then
    echo "nacos is starting with standalone"
else
    echo "nacos is starting with cluster"
fi

# check the start.out log output file
if [ ! -f "${BASE_DIR}/logs/start.out" ]; then
  touch "${BASE_DIR}/logs/start.out"
fi
# start
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"

修改内容如下:


10.配置nginx.conf实现负载均衡,将一下内容添加到nginx.conf的http {}节点下,此处配置的3333,4444,5555端口号为步骤7当中配置的端口号

#配置一组服务,轮询以下节点
	upstream cluster { 
		server 127.0.0.1:3333;
		server 127.0.0.1:4444;
		server 127.0.0.1:5555;
	}


    server {
        listen       1111;
        server_name  localhost;
        location / {
            proxy_pass http://cluster;  
        }
    }

11.重启nginx
12.在nacos安装目录/nacos/bin下执行如下命令,启动nacos

startup.sh - p 3333
startup.sh - p 4444
startup.sh - p 5555

13.测试是否搭建成功,http://172.31.126.115:1111/nacos/#/login

Sentinel

官网

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

下载安装
下载地址
1.下载对应版本的jar文件
2.使用如下命令直接运行该文件

java -jar sentinel-dashboard-1.7.0.jar

3.访问Sentinel管理界面(localhost:8080),输入账号密码为sentinel
注:启动环境需保证8080端口不被占用,java环境为1.8+

流量监控
  • 引入依赖
 
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            com.alibaba.csp
            sentinel-datasource-nacos
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        
        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        
  • 编写配置文件
server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719 #指定应用与Sentinel控制台交互的端口

management:
  endpoints:
    web:
      exposure:
        include: '*'

feign:
  sentinel:
    enabled: true # 激活Sentinel对Feign的支持


  • 开启配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient // 将当前微服务注册到nacos
@SpringBootApplication
public class MainApp8401 {
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}


  • 编写接口
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
@Slf4j
public class FlowLimitController {
    @GetMapping("/testA")
    public String testA()
    {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB()
    {
        log.info(Thread.currentThread().getName()+"t"+"...testB");
        return "------testB";
    }
}

  • 测试
    1.启动nacos
    2.启动sentinel
    3.启动微服务
    4.访问一次接口,从而达到激活sentinel的目的(http://localhost:8401/testA),因为sentinel采用的是懒加载的机制,所以若在初始化没有对接口进行访问,那么sentinel将无法查看到对应的微服务信息
流控规则简介

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

  • 例1:QPS直接失败

    以上配置表示/testA这个接口,1秒钟内查询1次就是OK,若超过次数1,就直接->快速失败,报默认错误

  • 例2:线程数直接失败

    以上配置表示/testA这个接口,调用线程数为1就是OK,若超过1,比如有多个线程调用,就直接->快速失败,报默认错

  • 例3:关联快速失败

    以上配置表示,1秒内如果请求对 /testB接口的请求次数超过1,触发阀值,那么就会对/testA进行限流,相当于是,a服务调用b服务,如果b服务触发阀值,那么就限流a

  • 例4:链路快速失败

    以上配置表示,只有当通过/testB接口来用调用的/testA,每秒超过1个请求才会对/testA触发限流

  • 例5:Warm Up(预热)

    以上配置表示系统初始化的阀值为10/ 3约等于3,即系统前5秒阀值刚为3;然后过了5秒后阀值才慢慢升高恢复到10,此处的3为官方默认值(默认coldFactor为3,即请求QPS 从 threshold / 3开始,经预热时长逐渐升至设定的QPS阈值)

  • 例6:排队等待


以上配置表示,对来自/testB的请求实行排队机制,每秒只允许处理1当前面的请求执行时间超过2秒时,那么就会对后面排队的请求抛出超时异常

服务降级

官网

熔断降级概述:
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

降级规则简介

Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。Sentinei在1.8.0版本以上新增了半开状态,半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。

RT:(平均响应时间,秒级),平均响应时间 超出阈值 且 在1m内通过的请求>=5,两个条件同时满足后触发降级。窗口期过后关闭断路器。RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)。
Sentinel 1.7.0才有平均响应时间(DEGRADE_GRADE_RT),Sentinel 1.8.0的没有这项,取而代之的是慢调用比例 (SLOW_REQUEST_RATIO)。
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比列(秒级):QPS >= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级 。
异常数(分钟级):异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

  • 例1:降级策略RT

    以上配置表示,对/testD接口的调用如果在200毫秒以内都没有响应,且在1秒内请求数大于等于5,那么将会在时间窗口期触发降级

  • 例2:降级策略-异常比例

以上配置表示,对/testD接口的调用如果有20%的次数都是错误时,且一秒访问接口的数量大于等于5,那么将会在时间窗口期内对服务实行降级

  • 例3:降级策略-异常数

    以上配置表示,对/testD接口的调用如果有近1分钟的异常数目超过阈值5之后就会进行熔断
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号