首页 > 其他分享 >一篇搞定Sentinel-搭建Spring Cloud Alibaba服务组件Sentinel实现服务资源控制

一篇搞定Sentinel-搭建Spring Cloud Alibaba服务组件Sentinel实现服务资源控制

时间:2023-11-01 10:46:45浏览次数:40  
标签:Spring 配置 nacos Alibaba sentinel 规则 Sentinel 控制台

1、Sentinel介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
官网地址

https://sentinelguard.io/zh-cn/

GitHub地址

https://github.com/alibaba/Sentinel

新手指南

https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97

2、首先下载Sentinel控制台

Sentinel下载地址

https://github.com/alibaba/Sentinel/releases

选择合适的Sentinel版本进行下载。下载版本需要和Spring Cloud Alibaba版本进行对比,以防下载的版本和其他组件不兼容。这里附加版本说明地址

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#2021x-%E5%88%86%E6%94%AF

我使用的Spring Cloud Alibaba Version为2.2.6.RELEASE版本,通过版本关系对比需要下载的Sentinel版本为1.8.1,找到该版本进行下载:

这里直接选择jar包下载,也可以自己下载源码进行编译。

3、启动Sentinel控制台

由于下载的为jar包所以需要有JDK安装环境,安装环境是学习java必备的技能这里不做介绍,直接启动jar包:

java  -jar sentinel-dashboard-1.8.1.jar

这里启动的默认端口号为8080。访问IP:8080登录sentinel,默认账号密码:sentinel

登录成功我们会发现控制台只有一个首页其他的什么的没有。因为目前没有服务程序接入,所以sentinel检测不到服务。我们可以修改启动命令,添加参数,让sentinel也能检测到自己。命令:

java -Dserver.port=8820 -Dcsp.sentinel.dashboard.server=localhost:8820 -Dcsp.sentinel.api.port=8719 -Dproject.name=spring-cloud -jar sentinel-dashboard-1.8.1.jar

-Dserver.port=8820 #指定控制台端口,不使用默认端口
-Dcsp.sentinel.dashboard.server=localhost:8820 #指定控制台地址和端口。
-Dcsp.sentinel.api.port=8719 #客户端监控 API 的端口默认是 8719,如果该端口占用,会在默认端口+1。如果+1后8020端口也被占用,则还会持续+1,直到发现没有占用的端口为止。
-Dproject.name=spring-cloud #指定应用的名称

这里只设置这几个参数。如果想要配置更多参数,可以查看官网启动配置项,文档地址

https://sentinelguard.io/zh-cn/docs/startup-configuration.html

执行上面Java命令,启动Sentinel。访问IP:8820登录sentinel,默认账号密码:sentinel

登录成功,我们会发现控制台多个一个应用程序,这个就是通过上面Java启动命令修改的应用名称,sentinel检测到的自己的服务。

4、客户端接入控制台

通过上面三步骤,Sentinel控制台就安装并启动成功了,接下来我们该通过代码接入客户端。首先打开我们的SpringCloud项目,在模块module的pom中添加sentinel依赖,这里我加到我项目的订单模块中order-module:

        <!--服务熔断降级-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

如果之前没有搭建过SpringCloud项目,可以查看我之前写的随笔进行搭建。点击文章链接

https://www.cnblogs.com/eternality/p/17757310.html

jar包引入成功后,就可以在配置文件中加入配置信息了。配置如下:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: order-service-model
  cloud:
    sentinel:
      enabled: true #开启Sentinel
      eager: true # 取消控制台懒加载,项目启动即连接Sentinel
      transport:
        dashboard: localhost:8080 #控制台地址

启动项目,查看sentinel控制台:

这里我启动了两个订单模块服务,可以发现,sentinel中显示了订单模块,说明在order-module中成功接入控制台了。

注意:

如果在配置文件中没有配置取消懒加载spring.cloud.sentinel.eager: true 则项目启动成功在sentinel控制台不会显示模块信息。需要访问一次接口才会显示,因为默认为懒加载模式。

接下来就可以测试Sentinel是否连接成功了,访问接口在实时监控和簇点链路中查看是否有接口信息。

如果想要对外暴露更多信息,我们可以集成SpringBoot的Actuator,对外暴露端点endpoint。Actuator可以了解服务的各种情况,健康检查,服务状态之类。

        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

在配置文件中加入暴露端点信息:

#暴露端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

5、规则配置

控制规则、降级规则、热点规则、系统规则、授权规则本次不做相关介绍,可以在官方上面学习。点击链接进行查看

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

6、Sentinel配置规则持久化

Sentinel配置的规则默认不是真实存在的,只要重新启动微服务项目,之前添加的规则都会消失,需要重新添加。所以需要配置规则持久化,将配置信息保存在注册中心nacos中,这样不管重启多少次项目,最初创建的规则还在。

首先在pom中加入依赖:

        <!-- Sentinel规则持久化至Nacos配置 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

依赖加入成功后,就可以在项目配置文件中加入配置信息了:

spring:
  profiles:
    active: dev
  application:
    # 服务名称
    name: order-service-model
  cloud:
    sentinel:
      enabled: true
      eager: true # 取消控制台懒加载,项目启动即连接Sentinel
      transport:
        dashboard: localhost:8080 #控制台地址
        #port: 8722
      datasource:
        #五种规则持久化到Nacos中 authority(授权规则)、degrade(降级规则)、flow(流控规则)、param-flow(热点规则)、system(系统规则)
        #sentinel 数据持久化-控流
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型 注意网关流控规则对应 gw-flow
            rule-type: flow #表示流控规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
        #sentinel 数据持久化-降级
        ds2:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel-demotion  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型
            rule-type: degrade #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
        #sentinel 数据持久化-热点
        ds3:
          nacos:
            server-addr: 127.0.0.1:8848 # 配置nacos server 注册中心地址
            dataId: order-service-model-sentinel-hotspot  # 和nacos中保持对应
            groupId: DEFAULT_GROUP # 和 nacos中保持对应
            data-type: json  # 规则类型:流控
            namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
            # 对于 nacos 数据类型
            rule-type: PARAM_FLOW #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group

在nacos的配置列表中添加相关配置文件:

控流文件:order-service-model-sentinel
降级文件:order-service-model-sentinel-demotion
热点规则文件:order-service-model-sentinel-hotspot

order-service-model-sentinel配置信息:

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

控流规则说明

https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E8%A7%84%E5%88%99-flowrule

order-service-model-sentinel-demotion配置信息:

[
  {
    "resource": "com.itmy.user.service.IUserExternalService:selectUserAll()",
    "grade": 0,
    "count": 100.0,
    "passCount": 0,
    "timeWindow": 20,
    "minRequestAmount":1,
    "statIntervalMs":2002,
    "slowRatioThreshold":0.1
  } 
]

降级规则说明

https://github.com/alibaba/Sentinel/wiki/熔断降级

order-service-model-sentinel-hotspot配置信息:

[
  {
    "resource": "sentinelTest",
    "count": 2,
    "paramIdx":0,
   "durationInSec":1000
  }
]

热点参数限流规则说明:

https://github.com/alibaba/Sentinel/wiki/热点参数限流

上面配置成功后,重新启动项目进行测试。我们可以看到不管重新启动多少次,配置的规则依然在。持久化规则就配置成功了。

注意:

如果后面需要更改配置规则,则需要在nacos的配置中进行修改。在Sentinel中更改如果重新启动项目则还会恢复原来的配置规则。

 

标签:Spring,配置,nacos,Alibaba,sentinel,规则,Sentinel,控制台
From: https://www.cnblogs.com/eternality/p/17802485.html

相关文章

  • Spring Boot - @Transactional 标注的方法如何使用 synchronized?
    这篇文章中有说到@Transactional标注的方法也有锁的情况下会出现一些问题,具体请看SpringBoot锁。而且Idea也会标一个黄色波浪线提示你。我是这样做的,仅供参考。file:[DiscussionService.java]@ServicepublicclassDiscussionServiceimplementsIDiscussionService{......
  • springboot web使用mybatis访问mysql库
    思想:重点:springboot项目可以配置mybatis必须的内容。默认配置文件为“main/resources/application.properties”(yml为其另一种写法,感兴趣自己去查)一切编码跟普通的mybatis相同。注意:xml文件最好放在资源文件夹resources下面,以便编译时直接复制。由此引起需要在springboot......
  • Spring Boot - ffmpeg 获得 m3u8 列表和 ts 文件,前端请求视频流进行播放
    安装ffmpegFFmpeg下载地址:GitHubreleases。请下载:ffmpeg-master-latest-win64-gpl-shared.zip压缩包。解压到你系统盘任意位置(前提是你以后找得到这玩意儿在哪)。接下来就是配置其环境变量,所有的环境变量都是配置它的启动文件的路径到你系统的Path,基本上都是(也有例外的?)。如......
  • Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.util
    我的项目是springboot架构,项目启动报错如下Exceptioninthread"main"java.lang.NoSuchMethodError:org.springframework.util.Assert.isInstanceOf(Ljava/lang/Class;Ljava/lang/Object;Ljava/util/function/Supplier;)V atorg.springframework.boot.logging.logback.Logb......
  • spring ApplicationContext版本的快速入门
     代码示例:publicinterfaceUserDao{}-------------------------------------------------------------publicclassUserDaoImplimplementsUserDao{}----------------------------------------------------------publicinterfaceUserService{}---------------------......
  • spring BeanFactory版本的快速入门
       代码示例:  publicstaticvoidmain(String[]args){//创建一个工厂对象DefaultListableBeanFactorybeanFactory=newDefaultListableBeanFactory();//创建一个读取器(读xml文件)XmlBeanDefinitionReaderreader=newXmlBeanDefinitionRead......
  • SpringMVC是什么?
    SpringMVC使用MVC架构模式的思想,将Web应用进行职责解构,把一个复杂的Web应用划分成模型(Model)、控制器(Contorller)以及视图(View)三层,有效地简化了Web应用的开发,降低了出错风险,同时也方便了开发人员之间的分工配合。SpringMVC各层的职责如下:Model:负责对请求进行处理,并将......
  • SpringMVC
    1.SpringMVC:特点1.1:基于MVC架构1.2:容易理解,上手快,使用简单1.3:方便与Spring整合1.4:SpringMVC强化注解的使用,控制层(Controller)@Controller2.第一个SpringMVC注解的程序的创建和使用注解式开发:在代码中通过类与方法的注解,完成处理2.1:创建项目,添加jar2.2:配置注册中央控制器(中央调度......
  • 微服务SpringCloud父工程pom依赖
    <!--设置为pom,管理依赖--><packaging>pom</packaging><properties><java.version>1.8</java.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8<......
  • spring发送邮件笔记
    文章目录引入依赖配置代码附件url地址为空会不会报错接收方邮件地址错误会不会报错引入依赖推荐用spring集成依赖,不用一个包一个包找了。<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>配......