学习Spring Cloud 技术第十二篇-Sentinel

85 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情

相关阅读

  1. 带你学习Spring Cloud 技术第一篇-总览
  2. 带你学习Spring Cloud 技术第二篇-技术介绍
  3. 带你学习Spring Cloud 技术第三篇-服务注册中心
  4. 学习Spring Cloud 技术第四篇-服务调用
  5. 学习Spring Cloud 技术第五篇-服务降级
  6. 学习Spring Cloud 技术第六篇-服务网关
  7. 学习Spring Cloud 技术第七篇-服务配置
  8. 学习Spring Cloud 技术第八篇-服务总线
  9. 学习Spring Cloud 技术第九篇-消息驱动(Spring Cloud Stream)

一、Sentinel(分布式系统的流量防卫兵)

image.png

官网资料:

二、Sentinel 简介

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

Sentinel 具有以下特征:

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

Sentinel 的主要特性:

image.png

Sentinel 的开源生态:

image.png

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

三、软件下载地址

下载地址:github.com/alibaba/Sen… 本文使用的版本是:github.com/alibaba/Sen…

启动Sentinel控制台

java -jar -Xms128m -Xmx128m -Dserver.port=8080 sentinel-dashboard-1.7.0.jar

安装完成之后,访问http://localhost:8080/

出现下面的界面,表示我们安装是成功的。

image.png

用户名/密码:sentinel/sentinel进行登陆

image.png

接下来就到了配置我们的项目步骤!

四、代码实操

4.1 项目代码的修改

修改我们的项目spring-cloud-alibaba-provider8001

pom.xml

<!--   sentinel-datasource-nacos 后面的持久化会用到的  -->
<!--
        持久化的用到的地方
 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

<!--   spring-cloud-starter-alibaba-sentinel  -->

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

bootstrap.yml

server:
  port: 8001
spring:
  application:
    name: cloud-alibaba-prvider # 服务的名称
  cloud:
    nacos:
      # 服务注册与发现的配置信息
      discovery:
        server-addr: 127.0.0.1:8848 # 服务的地址
        #enabled: true # 是否进行服务注册与发现
        #service: ${spring.application.name} # 服务的名字 默认  ${spring.application.name}
      # 服务配置的配置信息
      config:
        server-addr:  127.0.0.1:8848 # 服务的地址
        file-extension: yaml
        #prefix: client # 默认 ${spring.application.name}
            # cloud-alibaba-prvider-dev.yaml
    # 修改的地方 加上我们的sentinel的配置
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 # 配置sentinel的 dashboard 的地址
        port: 8791 # 默认的端口是 8791 如果被占用 将会进行 +1 的扫描的操作,直至找到没有占用的端口
management:
  endpoints:
    web:
      exposure:
        include: "*"
#config:
#  info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"

4.2 请求测试

image.png

4.3 查看sentinel的控制台

image.png

如上面的所示,出现了我们访问的记录以及其他的信息。

sentinel的功能很多,这里举一个例子。其他的配置请移步到:github.com/alibaba/Sen…

4.4 配置访问的限流

image.png

找到我们的配置,进行流控的配置:

image.png

配置成访问的限流问1 req/s;

配置完成的展示

image.png

4.5 请求测试

image.png 根据上面的图片信息,我们发现,在1s内,当请求数量超过1次的时候,就会返回给我们Blocked by Sentinel (flow limiting)这样的信息。说明我们的配置是生效的。

五、自定义的错误信息返回

根据前面阐述,返回的信息是Blocked by Sentinel (flow limiting)这样的信息,但是,有的时候,不想返回这样的自带的信息,那么这个时候,如何处理呢?

5.1 修改代码

@Slf4j
@RefreshScope
@RestController
public class NacosController {
    @Value("${config.info}")
    private String configInfo;
    @SentinelResource(value = "getConfigInfo", blockHandler = "my_blockHandler")
    @GetMapping("/getConfigInfo")
    public String getConfigInfo() {
        return configInfo;
    }
    // 限流返回的方法
    public String my_blockHandler(BlockException blockException) {
        
        return "你好,我是自定义的返回    "+ configInfo;
    }
}

5.2 测试

首先我们发现,以前我们定义的限流规则没有了,是说明,我们的规则没有进行持久化的操作,后续的话,还是要进行之久化的。

image.png

新增我们的配置:

image.png

访问测试:

image.png

红色的部分就是我们的自定义的返回操作。

5.3 发生异常的时候,自定义的测试会有效果吗?

应当配置对应的策略,而且在@SentinelResource注解里面也有String fallback()这个属性,配置当发生错误的时候,应当如何的处理我们的业务的问题,如何进行降级的操作。

六、持久化的问题

正如前面的测试,我们重新启动的服务,配置的限流的规则以及其他的配置出现消失的问题。那如何进行配置持久化呢?目前,可以使用的持久化采用的是nacos辅助我们进行持久化。

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

这个依赖就是负责我们持久化的操作的。

首先登录一下我们的nacos:

image.png

上面的配置管理也可以配置我们的限流规则。

6.1 修改我们的项目

bootstrap.yml

server:
  port: 8001
spring:
  application:
    name: cloud-alibaba-prvider # 服务的名称
  cloud:
    nacos:
      # 服务注册与发现的配置信息
      discovery:
        server-addr: 127.0.0.1:8848 # 服务的地址
        #enabled: true # 是否进行服务注册与发现
        #service: ${spring.application.name} # 服务的名字 默认  ${spring.application.name}
      # 服务配置的配置信息
      config:
        server-addr:  127.0.0.1:8848 # 服务的地址
        file-extension: yaml
        #prefix: client # 默认 ${spring.application.name}
            # cloud-alibaba-prvider-dev.yaml
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080 # 配置sentinel的 dashboard 的地址
        port: 8791 # 默认的端口是 8791 如果被占用 将会进行 +1 的扫描的操作,直至找到没有占用的端口
      # 增加数据源的配置
      datasource:
        ds1:
          nacos:
           server-addr: 127.0.0.1:8848
           dataId: cloud-alibaba-prvider
           groupId: DEFAULT_GROUP
           data-type: json
           rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: "*"
#config:
#  info: "这是从服务提供者nacos的配置的信息 ${spring.application.name}:${server.port}"

image.png

上面的截图是我们修改的地方:

创建我们的新的配置:

image.png

里面的配置信息:

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

image.png

上面是配置的信息。

6.2 测试

重新启动项目。spring-cloud-alibaba-provider8001

image.png

访问几次看看,流控规则出现了:

image.png

image.png

配置的规则是生效的,说明持久化是配置也是生效的。

代码小结:github.com/zhaoligang5…


开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情