关于sentinel

(一)介绍

官网

(二)下载地址

在这里下载,我这里下载的是1.8.1版本

(三)使用

1、sentinel客户端配置

1.1、添加依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
	<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependencyManagement>
	<dependencies>
		<dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>Hoxton.SR1</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-dependencies</artifactId>
			<version>2.1.0.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

1.2、yml配置

server:
  port: 8011
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
  profiles:
    active: dev

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

2、sentinel控制台

2.1、启动控制台

我是在Windows系统启动的,所以这里打开cmd命令窗口,使用java -jar E:\sentinel\sentinel-dashboard-1.8.1.jar,启动过程没有报错就OK了。
在Linux系统上启动的方式是一样的。
sentinel启动默认端口是8080,所以在浏览器上输入localhost:8080就能打开sentinel的登录页面
在这里插入图片描述
用户名和密码都是sentinel,点击登录进入页面
在这里插入图片描述
在这里我们会看到整个页面空空如也,即便你的微服务已经启动了,但这里依旧什么都没有。
不必惊慌,这不是程序BUG,也不是配置出了问题,而是sentinel采用了懒加载的方式加载服务信息,也就是说,我们需要访问一次服务接口,这里就会显示服务的信息了。

2.2、创建客户端服务

pom和yml配置就和上边提过的一样
首先创建服务提供者
依赖和配置文件就按照上边说的配置就好(提供者可以不用feign,看你想不想用,反正我没用)
服务名称

spring.application.name=service-provider
server.port=8001

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

Controller类

@RestController
@RequestMapping("/provider")
public class ProviderController {

    @GetMapping("/getProviderStr")
    ///@SentinelResource("/getProviderStr")
    public String getProviderStr(){
        System.out.println(Thread.currentThread().getName() + "........");
        return "fucking idiot";
    }
}

创建服务消费者
依赖和配置文件就按照上边的配置
服务名称及端口

spring.application.name=service-consumer
server.port=8011

启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

调用提供者的Feign接口

@FeignClient(value = "service-provider")
public interface ProviderService {
    @GetMapping(value = "/provider/getProviderStr")
    public String getProviderStr();
}

controller类

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Autowired
    private ProviderService providerService;

    @GetMapping("/testFeign1")
    public String testFeign1(){
        return providerService.getProviderStr();
    }
}

启动服务提供者服务,和消费者服务,然后在浏览器中调用消费者接口localhost:8011/consumer/testFeign1,执行成功后我们再看Sentinel的控制台
在这里插入图片描述
这里出现了两个服务,然后我们依次点开实时监控项
在这里插入图片描述
在这里插入图片描述
我们可以看到被调用的接口(甚至是调用链路中的接口)被调用的情况,证明sentinel已经生效了

3、限流熔断降级

限流的目的是出于对系统资源的保护,免于其因高强度的访问而导致对系统性能产生影响。
熔断是当目标不可达或调用失败率高于容忍度时,对其采取断路操作,当达到此种状态,再调用目标时直接拒绝访问。
降级则是伴随着服务调用错误或服务熔断时,将一个友好的结果或提示返回给客户端,而不是直接把报错返回前端

3.1、控制台配置

点开簇点链路,我们能看到这里有四个配置,分别是流控,降级,热点和授权
在这里插入图片描述
这四个配置在控制台左侧菜单中也有
在这里插入图片描述
先说流控规则
点击新增流控规则
在这里插入图片描述
资源名:我们要访问的请求名,例:/consumer/testFeign1
针对来源:即调用者,填写微服务的服务名,默认是default
阈值类型
QPS:每秒请求数
线程数:每秒存在的因请求产生的线程数(线程数不一定等于QPS,有可能在一秒内第二次请求发生时,第一次请求产生的线程就已经结束了)
流控模式
直接:顾名思义,既是对直接调用资源的流控
关联:这种模式主要是针对多个请求同时对统一资源有争抢时,优先通过其中一方,限制其他的访问的流量,比如,有两个请求都对数据库的同一张表有操作,一个是写一个是读,我们为了保证写入的效率,可以配置写请求的流控规则,关联资源填写读请求的,这样写请求将被优先通过,读请求将被限流
链路:当有多个链路对我们当前配置的资源进行调用时,我们可以指定一条链路的入口进行配置,这样就只对我们配置的链路进行限流,其他的链路则不会
流控效果
直接:当限流效果产生时,直接返回(或降级,降级需要在服务中编写相应的代码)
WarmUp:冷启动,选择该选项时下方还会出现一个预热时长的输入框。它的效果是,不会把QPS(或线程数)放宽至我们设置的值,而是在配置的预热时长内由一个很低的阈值逐渐到我们设定的阈值,这么做的目的是防止长时间处于低访问量的资源突然访问量暴涨而导致服务压力陡增而产生宕机或其他的不良影响
排队等待:选择该选项时,下方会出现超时时长的输入框。它的效果是当有大于设置的阈值的访问量访问时,阈值以外的请求将等待阈值内的请求结束后执行,超时时长就是设置它们的等待时间,当超过等待时间仍没有被放行时,访问失效。

降级规则
在这里插入图片描述
资源名:不解释了
熔断策略
慢调用比例:在统计时长内,在访问量大于等于最小请求数时,如果调用时长超过最大RT的请求数占全部请求的比例超过比例阈值时,发生熔断,在经过熔断时长设置的时间后链路恢复
异常比例:在统计时长内,在访问量大于等于最小请求数时,如果请求失败的数量占全部请求数量的比例超过比例阈值时,发生熔断,在经过熔断时长设置的时间后链路恢复
异常数:在统计时长内,在访问量大于等于最小请求数时,如果请求失败的数量大于设置的异常数则发生熔断,在经过熔断时长设置的时间后链路恢复

热点规则
热点规则可以看做是一种流控规则,只不过相比流控规则更加细化
在这里插入图片描述
资源名:不解释了
单机阈值:统计窗口时长内单机被访问的上限
参数索引:热点规则不仅关注被访问的资源,更是关注被访问的资源是以哪一个参数被访问的,举例说明:我们有一个接口方法

@GetMapping("/methodA")
public void methodA(String str1,Integer int1){
	System.out.println("被访问啦!");
}

配置的参数索引为1,单机阈值为2
当我们以地址localhost:8080/methodA?int1=2以每秒超过两次的手速访问接口时,访问将被限制
索引数也是从0开始的
参数例外项:当我们限制的参数在某些特定的值的情况下需要被放行或阈值有别于其他值的时候,就需要配置参数例外项。还是拿上述的方法举例,当int1参数值等于100时,我们需要设置阈值为3,那就在参数类型中选择int,然后设置参数值为100,限流阈值为3,最后点击添加就可以了。如果有多个值需要特殊配置可配置多条

授权规则
在这里插入图片描述
资源名:不解释
流控应用:填写调用方的服务名称
授权类型:白名单是指只允许填写的服务访问该资源,黑名单是指不允许填写的服务访问该资源

3.2、客户端服务降级

在ConsumerController中增加一个方法

@GetMapping("/getConsumer2")
public String getConsumer2(@RequestParam(value = "p1",required = false)String p1, @RequestParam(value = "p2",required = false)String p2){
    return "1234567890-";
}

我们依据上一节点中描述方式为其配置流控规则(或降级规则或热点规则,都行)
然后我们在浏览器上输入localhost:8011/consumer/getConsumer2,然后狂点刷新,浏览器上会出现如下返回值
在这里插入图片描述
这种返回对客户端造成的效果就是用户一脸蒙圈,我们需要一个友好的返回,这时就需要服务降级来发挥作用了
我们将getConsumer2方法做如下改造

@GetMapping("/getConsumer2")
@SentinelResource(value = "getConsumer2", blockHandler = "block_consumer2")
public String getConsumer2(@RequestParam(value = "p1",required = false)String p1, @RequestParam(value = "p2",required = false)String p2){
    return "1234567890-";
}

public String block_consumer2(String p1, String p2, BlockException e){
    return "consumer2 is blocked!";
}

如上所示,我们在getConsumer2方法上增加了@SentinelResource注解,value的值可以看做是为资源起的别名,按照上边的代码我们在配置规则的时候,填写资源名称就可以直接填写getConsumer2了,否则的话我们必须填写/consumer/getConsumer2才能使规则生效
blockHandler的值填写的是降级方法的名称,block_consumer2就是我们的降级方法,这样在资源被限流或熔断的时候,就会返回降级方法所返回的内容
在这里插入图片描述
这样虽然能返回友好内容,但是,一个类中需要降级的方法可能不止一个,这样的话,就需要在业务类中增加一大堆降级方法,容易造成类内方法膨胀,导致代码混乱。但是别担心,这点sentinel也替大家想到了,我们可以创建一个类专门用于降级

public class CustomBlockHandler {
    public static String blockB(BlockException e){
        return "blockB----" + e.getMessage();
    }
}

然后再将@SentinelResource注解做如下改造

@GetMapping("/getConsumer2")
@SentinelResource(value = "getConsumer2", blockHandlerClass = CustomBlockHandler.class, blockHandler = "blockB")
public String getConsumer2(@RequestParam(value = "p1",required = false)String p1, @RequestParam(value = "p2",required = false)String p2){
    return "1234567890-";
}

blockHandlerClass指向用于处理降级的类,blockHandler指向降级类中的降级方法

4、配置持久化

玩到现在不知道读者们有没有重启过sentinel服务,如果重启过的话,相信大家都遇到之前的配置不见了的问题,怎么样,坑吧?配置老半天一重启全没了,这显然不符合真实上线标准,我们必须要对配置持久化。
我们这里先讲一种持久化方式,剩下的等我会了再来补充吧。
我们要讲的这种持久化方式是结合nacos,将配置持久化到nacos中,这样就不用担心每次重启都需要重新配置的问题了。
具体操作
结合nacos持久化配置就不是在sentinel的控制台配置了,而是在nacos控制台上生成一个配置,然后由客户端拉取,再回显至sentinel的控制台上。

添加依赖:

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

yml配置文件中修改配置如下:

server:
  port: 8011
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: ${spring.application.name}
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow #flow流控规则 #degrade降级规则 #paramFlow热点规则
  profiles:
    active: dev

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

比原来在sentinel下一级增加了datasource项
server-addr是nacos服务的地址
dataId是在nacos上的配置名称,我们这里就直接取的服务名,生产使用的时候不建议这么做
groupId和nacos的配置中的groupId含义一样了,就是配置所在的组
data-type是配置的数据格式,要和nacos中配置的数据格式一致
rule-type对应的是sentinel的规则配置:flow流控规则 degrade降级规则 paramFlow热点规则

接下来在nacos中生成配置就好了
我们的服务名称是consumer_service,所以我们生成的配置名称也叫consumer_service,配置格式选择json,然后在配置内容中输入:

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

然后点击发布就可以了
解释一下上述的参数含义
resource:资源名称
limitApp:针对来源
grade:0是线程数,1是QPS
count:阈值
strategy:流控模式,0是直接,1是关联,2是链路
controlBehavior:流控效果,0是快速失败,1是WarmUp,2是排队等待
clusterMode:是否集群

如果觉得这些东西不好记,我们也可以采用F12大法,具体就是在sentinel控制面板上添加配置,点击提交时看F12窗口中调用的方法都传了什么参数,可以把这些参数按照json的格式直接粘贴到nacos的配置中,发布即可,简单粗暴还有效

你好!关于 Sentinel 在 Spring Boot 中的使用,我可以给你一些基本的信息。Sentinel 是阿里巴巴开源的一个轻量级的流量控制和熔断降级框架,它能够帮助开发者保护服务的稳定性和可靠性。 在 Spring Boot 中使用 Sentinel,首先需要引入 Sentinel 的依赖。可以在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-spring-boot-starter</artifactId> <version>1.8.2</version> </dependency> ``` 然后,在 Spring Boot 的配置文件中进行相应的配置。例如,在 `application.yaml` 中可以添加以下配置项: ```yaml spring: cloud: sentinel: transport: dashboard: localhost:8080 port: 8719 client-ip: ${spring.cloud.client.ip-address} heartbeat-interval-ms: 5000 heartbeat-tick-count: 3 ``` 其中,`dashboard` 配置项用来指定 Sentinel 控制台的地址,`port` 配置项用来指定 Sentinel 客户端的端口号。 接下来,在需要进行流量控制或熔断降级的方法上添加相应的注解,例如 `@SentinelResource` 注解用于标识一个资源,并配置相应的流控规则和降级规则。 ```java @RestController public class HelloController { @GetMapping("/hello") @SentinelResource(value = "hello", blockHandler = "handleBlock") public String hello() { return "Hello, Sentinel!"; } public String handleBlock(BlockException ex) { return "Blocked by Sentinel!"; } } ``` 以上是一个简单的示例,`@SentinelResource` 注解用于标识资源名为 "hello" 的方法,并指定了一个流控规则和一个降级规则。在流控或熔断发生时,会调用 `handleBlock` 方法进行处理。 最后,启动 Spring Boot 应用程序,Sentinel 将会自动生效,并在达到流控规则或熔断条件时进行相应的处理。 当然,以上只是 Sentinel 在 Spring Boot 中的基本使用方式,你还可以根据具体需求进一步配置和使用 Sentinel 的其他功能,如流控规则和降级规则的动态修改、持久化配置等。 希望能帮到你!如果还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值