SpringCloud Alibaba Demo(Nacos,OpenFeign,Gatway,Sentinel)

开源地址:

ma/springcloud-alibaba-demo

简介

参考:https://www.cnblogs.com/zys2019/p/12682628.html

SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面

版本对应

项目前期准备

启动nacos.   ./startup.cmd -m standalone 

登陆nacos官方 localhost:8848   nacos/nacos

创建父工程spring-cloud-alibaba

pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.lgc</groupId>
  <artifactId>spring-cloud-alibaba</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
    <module>cloud-alibaba-consumer80</module>
    <module>cloud-alibaba-provider8081</module>
    <module>cloud-alibaba-provider8082</module>
    <module>cloud-alibaba-sentinel</module>
    <module>cloud-alibaba-config-client</module>
    <module>cloud-alibaba-getway</module>
  </modules>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.boot.version>2.2.2.RELEASE</spring.boot.version>
    <spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
    <spring.cloud.version>Hoxton.SR1</spring.cloud.version>
  </properties>

  <!--  依赖管理,父工程锁定版本-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring.cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <!--<fork>true</fork>-->
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Nacos

Nacos集成了Ribbon实现了负载均衡。

创建服务提供者子模块cloud-alibaba-provider8001

pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.lgc</groupId>
        <artifactId>spring-cloud-alibaba</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-alibaba-provider8081</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--springcloud alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

application.yml如下

server:
  port: 8001
spring:
  application:
    name: cloud-alibaba-nacos-provider
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        server-addr: ${spring.cloud.nacos.server-addr}
management:
  endpoints:
    web:
      exposure:
        include: "*"

 其中management这一段是属于端口暴露

创建启动类

@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabaProvider8081Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudAlibabaProvider8081Application.class, args);
    }

}

Nacos注册服务需要在启动类中加上@EnableDiscoveryClient,意思就是服务注册发现

创建controller接口

@RestController
public class UserController {

    @Value("${server.port}")
    private int port;

    @GetMapping("/user/get")
    public String get(){
        return "provider port is :"+port;
    }
}

这样去取server.port是从application.yml去取。

启动服务提供者,在nacos界面上就能看到服务已经注册进来了。

同理,创建cloud-alibaba-provider8002,端口为8002.启动后发现nacos的集群的实例数为2.

OpenFeign

创建服务调用实例

创建服务消费者子模块cloud-alibaba-consumer80

pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.lgc</groupId>
        <artifactId>spring-cloud-alibaba</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <version>1.0-SNAPSHOT</version>
    <artifactId>cloud-alibaba-consumer80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--springcloud alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>


</project>

application.yml如下

server:
  port: 80
spring:
  application:
    name: cloud-alibaba-nacos-consumer
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        server-addr: ${spring.cloud.nacos.server-addr}
feign:
  client:
    #指定全局
    default:
      #连接超时时间
      connectTimeout: 5000
      #服务等待时间
      readTimeout: 5000
      loggerLevel: full
logging:
  level:
    com.lgc.cloudalibabaconsumer80.client: debug

需要把consumer这个服务也放到nacos中,就像把这些服务放到一个大容器中,大容器的服务之间可以相互调用、

创建启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class CloudAlibabaConsumer80Application {

    public static void main(String[] args) {
        SpringApplication.run(CloudAlibabaConsumer80Application.class, args);
    }

}

@EnableFeignClients这个代表当前服务作为OpenFeign客户端。

创建Client接口,用于端口映射,可以调用其他服务中的接口(接口在其他服务中已存在)

@FeignClient(value = "cloud-alibaba-nacos-provider")
public interface UserClient {

    @GetMapping("/user/get")
    String get();
}

@FeignClient中 的Value值为目标服务的名字,也就是目标服务的spring.application.name

接口的路由也得对应上目标服务的请求url,也就是说cloud-alibaba-nacos-provider的controller中也有个/user/get的接口才可以。

创建controller

@RestController
@RequestMapping("/consumer")
public class UserController {

    @Autowired
    private UserClient userClient;

    @GetMapping("/get")
    public String get() {
        return userClient.get();
    }
}

启动服务,在nacos中就可以看到

访问localhost:80/consumer/get,看到的是8001和8002在进行轮训负载,因为nacos默认支持负载均衡,原因是他默认引入了ribbon.

为了引入nacos的动态参数,我们新建一个cloud-alibaba-config-client模块,pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-cloud-alibaba</artifactId>
        <groupId>com.lgc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>cloud-alibaba-config-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--springcloud alibaba nacos-->
        <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>
    </dependencies>
</project>

新建bootstrap.yml:系统级别的配置,主要配置配置中心的相关信息,优先加载

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        server-addr: ${spring.cloud.nacos.server-addr}
      config:
        server-addr: ${spring.cloud.nacos.server-addr}
        file-extension: yaml
        group: DEFAULT_GROUP
        #namespace: 5a2f851c-8639-4acb-98f1-d5e76cd46457
management:
  endpoints:
    web:
      exposure:
        include: '*'

 值得一提的是namespace填的是Id,而不是你新建的命名空间的汉字名称。

application.yml如下

spring:
  application:
    name: nacos-config-client
  profiles:
#    active: dev #开发环境
#    active: test 测试环境
    active: info #info??

注意一下这里的profiles选的是info级别,那么在加载nacos的配置文件的时候是以info为后缀的。

创建启动类

 

@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabaConfigClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudAlibabaConfigClientApplication.class, args);
    }

}

创建controller接口

@RestController
@RefreshScope //类上加了@RefreshScope注解,用于自动刷新。若不添加,则无法进行自动的配置刷新
public class UserController {

    @Value("${config.info}")
    private String info;

    @GetMapping("/config/get")
    public String get() {
        return "The config info is :" + info;
    }
}

@RefreshScope用于参数的自动刷新,如果你nacos中的配置更改,能够自动同步过来,不需要再重启服务。

nacos中的配置文件命名规则为:${prefix}-${spring.profile.active}.${file-extension}。

prefix :默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profile.active :即为当前环境对应的 profile。
file-exetension: 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

假如spring.application.name=nacos-config-client,环境为dev,后缀名是yaml,那么dataID就是nacos-config-client-dev.yaml。这里不存在主/从配置文件的说法,只指定不同环境的配置,公共的配置都放在自己的环境中。另外,dataId后缀必须是yaml或properties。

测试

启动3344,访问http://localhost:3344/config/get,可以看到配置的信息。然后修改配置中的config.info内容,再刷新页面,发现配置信息也更新了。此时就做到了配置实时刷新。

Gatway

新建cloud-alibaba-gatway模块

pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.lgc</groupId>
        <artifactId>spring-cloud-alibaba</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>cloud-alibaba-getway</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--服务网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>


</project>

application.yml如下

server:
  port: 7001
spring:
  application:
    name: cloud-gateway-service
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        server-addr: ${spring.cloud.nacos.server-addr}
        #namespace: 5a2f851c-8639-4acb-98f1-d5e76cd46457
    gateway:
      routes:
        - id: provide
          uri: lb://cloud-alibaba-nacos-provider
          predicates:
            - Path=/user/**
        - id: consumer
          uri: lb://cloud-alibaba-nacos-consumer
          predicates:
            - Path=/consumer/**
management:
  endpoints:
    web:
      exposure:
        include: '*'

 lb:代表loadbalance负载均衡

lb://cloud-alibaba-nacos-provider    目标cloud-alibaba-nacos-provider服务

拦截请求/user/**    拦截/user下的所有请求,指向cloud-alibaba-nacos-provider服务。

创建启动类

@SpringBootApplication
public class CloudAlibabaGetwayApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudAlibabaGetwayApplication.class, args);
    }

}

Sentinel

下载地址Releases · alibaba/Sentinel · GitHub,选择对应的版本下载即可。这里以1.8.2版本为例

可以下载压缩包,也可以直接下载jar。本章节在Windows中说明,就直接下载jar进行说明。

下载到本地执行

java -jar sentinel-dashboard-1.7.2.jar

在浏览器访问http://localhost:8080   sentinel/sentinel

登录后看到仪表盘是空的,因为现在没有监控任何的服务。

创建cloud-alibaba-sentinel模块

pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-cloud-alibaba</artifactId>
        <groupId>com.lgc</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>cloud-alibaba-sentinel</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--springcloud alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--springcloud alibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--springcloud alibaba sentinel-datasource-nacos-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>


</project>

application.yml如下

server:
  port: 8401
spring:
  application:
    name: cloud-alibaba-sentinel-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        server-addr: ${spring.cloud.nacos.server-addr}
    sentinel:
      transport:
        # sentinel dashboard的地址
        dashboard: 127.0.0.1:8080
        # sentinel dashboard内部通信端口,默认为8719,如果被占用会自动+1,直到找到为止
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: "*"

创建启动类

@SpringBootApplication
@EnableDiscoveryClient
public class CloudAlibabaSentinelApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudAlibabaSentinelApplication.class, args);
    }

}

创建controller

 

package com.zys.cloud.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA(){
        return "--------testA";
    }

    @GetMapping("/testB")
    public String testB(){
        return "--------testB";
    }


}

测试。先启动nacos服务,再启动sentinel服务,再启动8401。访问http://localhost:8401/testA后会在仪表盘看到生成了一个服务:

主要讲解:流控,熔断,热点,授权

其中QBS表示1秒的请求数,QPS表示1秒的拒绝请求数。

流控

流量控制(flow control),其原理是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

QPS表示每秒的请求数。可在簇点链路中选择链路的点击流控按钮添加,也可在流控规则中添加。其他的功能类似。这里以/testA的流控为例:

上图的配置,也就是说对于请求/testA,当每秒请求的次数超过阈值,那么会直接返回失败的信息。保存后显示列表如下:

访问localhost:8401/testA结果是正常的,若快速的刷新几次,会发现返回了流控的信息:

对于针对来源,默认使用default,那么也可以指定来源,那么当指定的这个来源调用/testA请求时会进行流控,其他服务调用/testA时不进行流控,也就是对来源进行针对性的流控。

也可设置并发线程的阈值,当某一时刻并发线程数量超过时会进行流控。

使用Jmeter对/testA发送超过阈值的并发请求,那么在发送的同时再访问/testA就会出现流控。

 流控模式-关联(言简意赅:两个服务共同参与限制条件原来是:A<C,现在是A+B<C)

1)说明:前面的两种的流程模式都设置为直接,这种模式是默认的,也就是说流量控制规则到达阈值时直接触发流量控制。本小节说明关联模式,均以QPS类型说明,后同。

2)关联:当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。关联的关系是反向关联。

3)上述代码中的/testA和/testB就是关联关系,它们在同一个controller中,占用相同的资源,编辑配置如下:

使用Jmeter对/testB发送超过阈值的并发请求,那么在发送的同时再访问/testA就会出现流控。原因是两个请求相互争抢资源,进行了流控。

流控模式-链路:

链路模式也就是对某一条链路进行流控。如用户服务会调用订单服务,商品服务也会调用订单服务,就存在两条链路。在某个时刻,对商品服务->订单服务这条链路进行流控,从而保证订单服务的正常使用,最终让用户服务可以正常调用订单服务,虽然限流了商品服务这条链路,但不影响用户服务这条链路。

流控效果-快速失败:

默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。前面已经使用过多次。

流控效果-Warm Up

预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。它有一个冷加载因子,值是3。曲线图如下

新加/testA的流控规则如下:

当1秒同时有20个请求,预热时间是10秒。那么服务会先处理7个请求(20/3),后面依次处理,当达到20秒时处理完所有的请求。

流控效果-排队等待

让请求以均匀的速度通过。修改/testA的规则

也就是说,当有大量的请求来时,每秒只处理20个请求,其他的请求进行排队等待,依次类推。当后面排队的时间超过5秒时就报错,显示流控信息。

熔断降级

一个服务常常会调用别的模块,如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。而Sentinel在服务出现不稳定情况时,会对其进行限制,请求快速失败,避免影响到其他资源而导致级联错误。当资源被降级后,在接下来的时间窗口内,对该资源的调用都自动熔断。

(1)慢调用比例:当单位统计时长内请求数目大于设置的最小请求数目,并且平均响应时间超过最大RT的请求的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。

经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成则结束熔断,否则会再次被熔断。

说明:在1000ms内请求数超过5个,且平均响应时间超过300ms的请求的比例(超过300ms的请求占总请求的比例)大于0.4,则该资源自动熔断10s。10s后根据下一个请求判断是否再次被熔断。

(2)异常比例:当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。

经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成则结束熔断,否则会再次被熔断。

说明:在1000ms内请求数超过5个,且异常的请求超过6个,那么该资源将自动熔断20s。20s后根据下一个请求判断是否再次被熔断。

@SentinelResource的使用

前面的所讲的流控或降级,其返回的数据都是 Blocked by Sentinel (flow limiting) ,当然可以自定义。@SentinelResource和@HystrixCommand的作用是类似的,都是来指定流控或降级时返回的信息。

在方法上加@SentinelResource注解,且使用blockHandler(或者blockHandlerClass)指定流控或降级时的自定义提示,而blockHandler函数访问范围需要是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数(类型是BlockException),且和原方法在同一个类中。使用fallback 指定未流控或降级发生异常时的自定义提示,其方法必须是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配

下面通过对/testC进行流控和降级来说明:

1)流控配置:

2)降级配置:

修改controller

package com.lgc.cloudalibabasentinel.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @GetMapping("/testB")
    public String testB(){
        return "--------testB";
    }

    @GetMapping("/testC")
    @SentinelResource(value = "aaa",blockHandler = "testCBlockHandler",fallback = "testCFallback")
    public String testC(Integer id){
        if (id < 0) {
            throw new RuntimeException("参数值格式错误");
        }
        return "--------testC";
    }
    //自定义降级或熔断时的提示信息
    public String testCBlockHandler(Integer id, BlockException exception){
        //判断异常的类型
        if (exception instanceof FlowException){
            return "你被限流了,请稍后再试";
        } else if (exception instanceof DegradeException) {
            return "你被降级了,请稍后再试";
        }
        return "当前服务不可用";
    }
    //自定义未限流时发生  异常  的提示信息
    public String testCFallback(Integer id){
        return "参数不合法";
    }
}

在@SentinelResource指定了value,其值就是要流控或降级的资源名,必须配置。

当访问/testC?id=8时,快速刷新,会出现流控提示信息。

当问/testC?id=-5时,刷新1此,会出现错误提示信息。

当问/testC?id=-5时,刷新5次以上,会出现降级提示信息。

规则持久化

每次无论重启sentinel服务还是要监控的服务,sentinel页面的配置规则都会消失,这是因为这些规则没有持久化,对应大量的配置规则,持久化也非常重要,可将其配置到nacos中。

这里直接在cloud-alibaba-sentinel模块进行说明:

1)导入依赖:

        <!--springcloud alibaba sentinel-datasource-nacos-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

2)在yml配置,已存在配置省略:

spring:
  cloud:
      # 流控规则持久化到nacos
      datasource:
        dsl:
          nacos:
            server-addr: ${spring.cloud.nacos.server-addr}
            data-id: ${spring.application.name}
            group-id: DEFAULT_GROUP
            data-type: json
            rule-type: flow

3)在nacos中添加配置文件,如下图:

json内容:

[
    {
        "resource": "/testA",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

可看到json中是一个数组,数组中只有一个元素,那么针对/test的请求的配置规则会存下来,不会因为重启而丢失,而其他的请求的配置规则还是丢失。针对这些请求,都按照这种规则配置在数组中即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/116527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data Redis + RabbitMQ - 基于 string + hash 实现缓存,计数(高内聚)

目录 一、Spring Data Redis 1.1、缓存功能(分析) 1.2、案例实现 一、Spring Data Redis 1.1、缓存功能(分析) hash 类型存储缓存相比于 string 类型就有更多的更合适的使用场景. 例如,我有以下这样一个 UserInfo 信息 假设这样一个场景就是:万一只想获取其中某一个…

【蓝桥杯省赛真题42】Scratch舞台特效 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch舞台特效 一、题目要求 编程实现 二、案例分析 1、角色分析

uni-app---- 点击按钮拨打电话功能点击按钮调用高德地图进行导航的功能【安卓app端】

uniapp---- 点击按钮拨打电话功能&&点击按钮调用高德地图进行导航的功能【安卓app端】 先上效果图&#xff1a; 1. 在封装方法的文件夹下新建一个js文件&#xff0c;然后把这些功能进行封装 // 点击按钮拨打电话 export function getActionSheet(phone) {uni.showAct…

基于设深度学习的人脸性别年龄识别系统 计算机竞赛

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…

MySQL中表的增删改查

目录 一、CRUD 二、新增&#xff08;Create&#xff09; &#xff08;1&#xff09;语法 &#xff08;2&#xff09;单行数据全列插入 &#xff08;3&#xff09;多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09; &#xff08;1&#xff09;语法 …

Win11新电脑启动无无线网络连接解决办法

Win11新电脑启动无无线网络连接解决办法 前言一、解决方法 前言 今天笔者在使用学校实验室分配的新电脑时候&#xff0c;发现在新激活的时候需要让我连接到无线网络&#xff0c;但不管鼠标怎么点都操作不了&#xff0c;于是在卡在这里了&#xff0c;唯一的办法就是跳过此页面&…

ZZ038 物联网应用与服务赛题第D套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (D卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用的各类软件工具、软件安装文件等,都…

吴恩达《机器学习》5-6:向量化

在深度学习和数值计算中&#xff0c;效率和性能是至关重要的。一个有效的方法是使用向量化技术&#xff0c;它可以显著提高计算速度&#xff0c;减少代码的复杂性。接下来将介绍向量化的概念以及如何在不同编程语言和工具中应用它&#xff0c;包括 Octave、MATLAB、Python、Num…

2023辽宁省数学建模B题数据驱动的水下导航适配区分类预测完整原创论文分享(python求解)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模B题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B用Python&#xff0b;SPSSPRO求解&…

蓝桥杯每日一题2023.11.3

题目描述 承压计算 - 蓝桥云课 (lanqiao.cn) 题目分析 将重量存入a中&#xff0c;每一层从上到下进行计算&#xff0c;用d进行计算列的重量&#xff0c;当前d的重量应为正上数组和右上数组的个半和并加上自身的重量 计算到30层记录最大最小值&#xff0c;进行比例运算即可 …

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化

业务流程是由“活动”&#xff08;或称“工作任务”&#xff09;构成的&#xff0c;在企业里的所有工作是不是都叫流程&#xff0c;或者属于流程的一部分&#xff0c;这个概念很绕&#xff0c;我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性&#xff08;产…

2023年金融科技建模大赛(初赛)开箱点评-基于四川新网银行数据集

各位同学大家好&#xff0c;我是Toby老师。2023年金融科技建模大赛&#xff08;初赛&#xff09;从今年10月14日开始&#xff0c;11月11日结束。 比赛背景 发展数字经济是“十四五”时期的重大战略规划。2023年&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》…

20.5 OpenSSL 套接字RSA加密传输

RSA算法同样可以用于加密传输&#xff0c;但此类加密算法虽然非常安全&#xff0c;但通常不会用于大量的数据传输&#xff0c;这是因为RSA算法加解密过程涉及大量的数学运算&#xff0c;尤其是模幂运算&#xff08;即计算大数的幂模运算&#xff09;&#xff0c;这些运算对于计…

想学计算机编程从什么学起?零基础如何自学计算机编程?中文编程开发语言工具箱之渐变标签组构件

想学计算机编程从什么学起&#xff1f;零基础如何自学计算机编程&#xff1f; 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;…

【每日一题】数组中两个数的最大异或值

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希集合 其他语言python3 写在最后 Tag 【哈希集合】【位运算-异或和】【数组】【2023-11-04】 题目来源 421. 数组中两个数的最大异或值 题目解读 找出数组中两个数的最大异或结果。 解题思路 一看数据量达到了 …

【深度学习基础】Pytorch框架CV开发(1)基础铺垫

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Docker的简单安装

安装环境 CentOS Linux release 8.1.1911 (Core)内核4.18.0-147.el8.x86_64Mini Installation 安装前的准备工作 切换国内源 由于centos源已经过期&#xff0c;所以切换为阿里云的yum源&#xff0c;第二个是docker的仓库 wget -O /etc/yum.repos.d/CentOS-Base.repo https:…

vue需求:实现签章/签字在页面上自由定位的功能(本质:元素在页面上的拖拽)

目录 第一章 效果展示 第二章 了解工具 2.1 draggable 2.1.1 了解draggable 2.1.2 draggable方法 2.1.3 利用例子理解方法 第三章 效果实现 3.1 实现思路 3.2 代码实现 3.2.1 涉及到的点 3.2.2 源代 第一章 效果展示 效果描述&#xff1a;通过点击左边栏的签名和…

C#,数值计算——积分方程与逆理论,构造n点等间隔求积的权重的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 构造n点等间隔求积的权重 /// Constructs weights for the n-point equal-interval quadrature /// from O to(n-1)h of a function f(x) times an arbitrary /// (pos…

十年JAVA搬砖路——Linux搭建Ldap服务器。

1.安装命令 yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel2.启动ldap systemctl start slapd systemctl enable slapd3.修改密码 slappasswd Aa123456获得返回的密码加密密码串&#xff1a; {SSHA}DkSw0…