SpringCloud Sentinel 服务治理详解

news2024/11/28 9:38:25

雪崩问题

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

雪崩示例图

雪崩问题产生的原因:

  1. 微服务相互调用,服务提供者出现故障或阻塞。
  2. 服务调用者没有做好异常处理,导致自身故障。
  3. 调用链中的所有服务级联失败,导致整个集群故障。

解决问题的思路:

  • 尽量避免服务出现故障或阻塞。
    • 保证代码的健壮性;
    • 保证网络的畅通性;
    • 保障应对较高的并发请求;
  • 服务调用者做好远程调用的异常处理后备方案,避免故障的扩散。

服务保护方案

请求限流

限制访问接口的QPS请求并发量,避免服务因流量激增出现故障。

请求限流方案

线程隔离

俗称仓壁模式,模拟船舱隔板的防水原理,通常限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散。

线程隔离方案

服务熔断

由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。熔断期间,所有请求快速失败,全部都走fallback逻辑。

服务熔断方案

超时处理

设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。

超时处理方案

服务保护技术

Sentinel和Hystrix的对比图表

Sentinel是阿里巴巴推出的,而Hystrix出现的比较早期,由Netflix推出,兼容性和功能性都比较落后,Spring也有推出自己的技术方案Spring Cloud Circuit Breaker,实现依赖于Resilience4JSpring Retry这两个组件,目前常见应用于生产环境的还是Sentinel和Hystrix,但是需要注意的是Hystrix支持持SpringCloud 2020之前的版本,企业内部多数遵循能用老的就用老的,所以还是非常常见到Hystrix的身影。

Sentinel

Sentinel官方网站:https://sentinelguard.io/zh-cn/index.html

Sentinel 控制台

1、获取 Sentinel 控制台

方式一:可以从 release 页面 下载最新版本的控制台 jar 包。

方式二:可以从最新版本的源码自行构建 Sentinel 控制台:

  • 下载 控制台 工程
  • 使用以下命令将代码打包成一个 fat jar: mvn clean package

2、启动 Sentinel 控制台

注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

使用如下命令启动控制台:

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=0.0.0.0:8090 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123456 -Dserver.servlet.session.timeout=7200 -jar sentinel-dashboard-1.8.8.jar

参数选项解释:

-Dserver.port=8090:用于指定 Sentinel 控制台端口为8090,不指定时默认为8090;

-Dcsp.sentinel.dashboard.server=0.0.0.0:8090:用于指定 Sentinel 控制台监听地址为0.0.0.0:8090,不指定时默认为0.0.0.0:8090;

-Dproject.name:用于指定 Sentinel 控制台显示名称,不指定时默认为sentinel-dashboard;

-Dsentinel.dashboard.auth.username:用于指定 Sentinel 控制台访问的认证用户,不指定时默认为sentinel;

-Dsentinel.dashboard.auth.password:用于指定 Sentinel 控制台访问的认证密码,不指定时默认为sentinel;

-Dserver.servlet.session.timeout:用于指定 Sentinel 控制台会话超时时间,不指定时默认为7200;

3、访问 Sentinel 控制台

http://127.0.0.1:8090

Sentinel 控制台

微服务整合

引入依赖
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
服务配置Sentinel
spring:
  cloud:
    sentinel:
      # 取消控制台懒加载
      eager: false
      transport:
        # 控制台地址
        dashboard: 127.0.0.1:8090
      # 开启请求方式前缀
      http-method-specify: true

请求限流配置

找到我们要进行流控管理的微服务应用,然后按照路径“簇点链路 -> 流控 -> 对应的请求路径 -> 单机阈值”,阈值类型以QPS每秒请求为单位,我们这里为了能够体现出效果,所以设置为每秒请求不能超过两次

请求限流配置图

设置好上述配置后,我们进行测试,发现每秒超出2次请求后,服务端会返回状态码为429Blocked by Sentinel (flow limiting)结果,说明我们的配置生效了~

线程隔离配置

找到我们要进行流控管理的微服务应用,然后按照路径“簇点链路 -> 流控 -> 对应的Fegin客户请求 -> 单机阈值”,阈值类型以并发线程数为单位,我们这里为了能够体现出效果,提前在对应的位置增加了sleep的操作,并设置并发线程不能超过两个

线程隔离配置

设置好上述配置后,我们进行测试,发现我们同时发送超出2次请求后,服务端会返回状态码为429Blocked by Sentinel (flow limiting)结果,说明我们的配置生效了~

服务熔断配置

熔断降级是解决雪崩问题非常有效且重要手段,思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务,即拦截访问该服务的一切请求,而当服务恢复时,断路器会放行该服务的请求。

断路器的三种状态机

断路器熔断策略有三种:

  • 慢调用比例:超过指定时长的调用为慢调用,统计单位时长内慢调用的比例,超过阈值则熔断
  • 异常比例:统计单位时长内异常调用的比例,超过阈值则熔断
  • 异常数:统计单位时长内异常调用的次数,超过阈值则熔断

服务熔断配置图上面配置的意思就是,当请求超过200毫秒的调用是慢调用,统计最近1000毫秒内的请求,如果请求量超过2次,并且慢调用比例不低于0.5,也就是两个请求里面有一半的请求命中,则触发熔断,熔断时长为20秒。然后进入half-open状态,放行一次请求做测试。

以下是熔断后返回的结果:

{
  "code": 500,
  "msg": "获取用户失败:null",
  "data": null,
  "time": "2024-10-30T15:36:40.456031"
}

授权规则配置

Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的,授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

想要实现授权规则的配置,那么我们就要在业务服务实现parseOrigin接口,例如,我们尝试从request中获取一个名为origin的请求头,作为origin的值

package com.if010.common.nacos.config;

import cn.hutool.core.util.StrUtil;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;

/**
 * Sentinel 授权规则实现类
 * Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的
 * 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式
 * @author Kim同学
 */

@Component
public class HeaderOriginParserConfig implements RequestOriginParser {
    @Override
    public String parseOrigin(javax.servlet.http.HttpServletRequest httpServletRequest) {
        String origin = httpServletRequest.getHeader("origin");
        if (StrUtil.isEmpty(origin)) {
            return "blank";
        }
        return origin;
    }
}

实现完接口后,我们还需要在gateway服务中,利用网关的过滤器添加名为gateway的origin头

spring: 
  cloud:
    gateway:
      default-filters:
        # 添加名为origin的请求头,值为gateway
        - AddRequestHeader=origin,gateway

最后我们配置上规则

授权规则配置图

配置好之后,我们测试可以发现除了头部请求携带了origin=if010-test外,请求都会被拒绝掉,返回了fallback处理的结果

{
  "code": 500,
  "msg": "获取用户失败:[429 ] during [GET] to [http://if010-system/sys/user/8888888888888888888] [SysUserClient#getSystemUserInfoById(Long)]: [Blocked by Sentinel (flow limiting)]",
  "data": null,
  "time": "2024-10-30T21:32:35.326395"
}

FeignClient的两种Fallback方式

  • 方式一: FallbackClass,无法对远程调用的异常做出处理
  • 方式二: FallbackFactory,可以对远程调用的异常做处理,通常都会选择这种

Fallback降级处理实现

步骤一: 自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑

package com.if010.system.api.factory;

import com.if010.common.core.entity.R;
import com.if010.system.api.SysUserClient;
import com.if010.system.entity.bo.SysUserBo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;

/**
 * 【降级处理】系统用户远程调用出现异常时,熔断或超时处理
 * @author Kim同学
 */

@Slf4j
public class SysUserClientFallbackFactory implements FallbackFactory<SysUserClient> {
    @Override
    public SysUserClient create(Throwable throwable) {
        // 记录异常信息,可以返回空,或者直接抛出异常
        log.error("系统用户服务远程调用异常:{}", throwable.getMessage());

        // 创建 SysUserClient 接口的实现类,实现其中的方法,编写失败降级的处理逻辑
        return new SysUserClient() {
            @Override
            public R<SysUserBo> getSystemUserInfoById(Long id) {
                return R.fail("获取用户失败:" + throwable.getMessage());
            }
        };

    }
}

步骤二: 将刚刚定义的FallbackFactory注册成一个Bean

注册成Bean的方式有很多种,具体根据自己的业务和系统框架进行调整,这里是抽取出来成为了一个模块,所以我们将注册bean是以imports文件方式定义

/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

com.if010.system.api.factory.SysUserClientFallbackFactory

步骤三: 在服务接口中使用FallbackFactory

package com.if010.system.api;

import com.if010.common.core.entity.R;
import com.if010.system.api.factory.SysUserClientFallbackFactory;
import com.if010.system.entity.bo.SysUserBo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 【API】系统用户管理模块
 * @author Kim同学
 */
@FeignClient(value = "if010-system", fallbackFactory = SysUserClientFallbackFactory.class)
public interface SysUserClient {

    /**
     * 【GET】获取系统用户列表
     */
    @GetMapping("/sys/user/{id}")
    R<SysUserBo> getSystemUserInfoById(@PathVariable("id") Long id);
}

步骤四: 测试

根据测试结果,我们可以看到返回了我们自己自定义的Fallback内容

{
  "code": 500,
  "msg": "获取用户失败:timeout executing GET http://if010-system/sys/user/8888888888888888888",
  "data": null,
  "time": "2024-10-30T14:40:33.814556"
}

持久化配置

当应用重启后,Sentinel 规则就消失了,生产环境需要将配置的规则进行持久化。

在官方文档中介绍的是API动态规则扩展DataSource动态规则扩展,API动态规则扩展指的是通过Sentinel提供的API接口实现直接修改loadRules,而DataSource动态规则扩展指的是通过拉模式或者推模式进行获取配置文件或者数据

DataSource扩展常见的实现方式

  • 拉模式: 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
  • 推模式: 规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

Sentinel支持的数据源扩展

  • Pull-based: 动态文件数据源、Consul, Eureka
  • Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd

接下来我们以 推模式,使用Nacos配置规则 为例:

添加依赖

<!-- Sentinel Nacos 规则动态扩展持久化依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>x.y.z</version>
</dependency>

Nacos规则配置

请求限流规则配置
[
  {
    // 资源名
    "resource": "GET:/sys/user/{id}",
    // 针对来源,若为 default 则不区分调用来源
    "limitApp": "default",
    // 限流阈值类型(1:QPS | 0:并发线程数)
    "grade": 1,
    // 阈值
    "count": 1,
    // 是否是集群模式
    "clusterMode": false,
    // 流控模式(0:直接 | 1:关联 | 2:链路)
    "strategy": 0,
    // 流控效果(0:快速失败 | 1:Warm Up(预热模式) | 2:排队等待)
    "controlBehavior": 0,
    // 预热时间(秒,预热模式需要此参数)
    "warmUpPeriodSec": 10,
    // 超时时间(毫秒,排队等待模式需要此参数)
    "maxQueueingTimeMs": 500,
    // 关联资源、入口资源(关联、链路模式)
    "refResource": "rrr"
  }
]
服务熔断规则配置
[
  {
    // 资源名
    "resource": "GET:/sys/user/{id}",
    // 针对来源,若为 default 则不区分调用来源
    "limitApp": "default",
    // 熔断策略(0:慢调用比例 | 1:异常比率 | 2:异常计数)
    "grade": 0,
    // 最大RT(毫秒)、比例阈值[0.0,1.0]、异常数
    "count": 200,
    // 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
    "slowRatioThreshold": 0.5,
    // 最小请求数
    "minRequestAmount": 5,
    // 单位统计时长(类中默认1000毫秒)
    "statIntervalMs": 1000,
    // 熔断时长(单位为秒)
    "timeWindow": 10
  }
]
授权访问规则配置
[
  {
    // 资源名
    "resource": "sentinel_spring_web_context",
    // 流控应用
    "limitApp": "test,test2",
    // 授权类型(0代表白名单|1代表黑名单)
    "strategy": 0
  }
]
网关 - 请求限流规则
[
  {
    // API名称、API分组名称
    "resource": "if010-service",
    // API类型 (0: RouteID | 1: API分组)
    "resourceMode": 1,
    // QPS阈值
    "count": 5,
    // 阈值类型
    "grade": 1
  }
]
网关 - API分组规则
[
  {
    // API分组名称
    "apiName": "if010-service",
    // 定义规则组,可以配置多条规则
    "predicateItems": [
      {
        // 匹配串, 这里表示匹配所有
        "pattern": ".*",
        // 匹配模式 (0: 精确 | 1: 前缀 | 2:正则)
        "matchStrategy": 2
      }
    ]
  }
]

业务服务配置文件

spring:
  cloud:
    sentinel:
      # 取消控制台懒加载
      eager: false
      # 开启请求方式前缀
      http-method-specify: true
      transport:
        # 控制台地址
        dashboard: 127.0.0.1:8849
      datasource:
        # [自定义] 配置数据源名称(流控规则)
        flow:
          nacos:
            # Nacos服务地址
            server-addr: 127.0.0.1:8848
            # Nacos认证用户
            username: nacos
            # Nacos认证密码
            password: 123456
            # Nacos配置所属命名空间 (默认为空,为空则表示使用的是public)
            namespace: ""
            data-id: ${spring.application.name}-flow-rules
            # Nacos配置所属Group
            group-id: SENTINEL_GROUP
            # Nacos配置格式
            data-type: json
            # flow(请求限流规则)、degrade(服务熔断规则)、authority(授权访问规则)、param-flow(热点规则)
            # 网关特殊的规则: gw-api-group(API分组规则)、gw-flow(gw-flow为网关流控,flow为普通流控)
            rule-type: flow

到此就算是配置完成啦,重新启动服务,我们可以看到规则还是存在的,但是有个小缺陷就是Sentinel控制台的新增、修改、删除等操作是无法保存到Nacos中的,解决办法有很多,可以Clone官方的代码下来进行修改,详情可以参考 星空流年-Sentinel规则持久化到Nacos及规则数据双向同步 这篇文章,根据这篇文章流控规则可以完美的实现效果,但是其他的授权规则、系统规则小编试了好像业务并不生效,主要是格式的问题,有兴趣的可以自行研究一下,另外一种办法就是自己写业务逻辑实现Nacos规则拉取回显然后修改推送,方法千千万,合适自己的业务场景最重要~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端基础-html-注册界面

&#xff08;200粉啦&#xff0c;感谢大家的关注~ 一起加油吧~&#xff09; 浅浅分享下作业&#xff0c;大佬轻喷~ 网页最终效果&#xff1a; 详细代码&#xff1a; ​ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(2)

《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;2&#xff09; 《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;2&#xff09;回声客户端的完美实现回声客户端的问题回声客户端问题的解决方…

使用 FFmpeg 进行音视频转换的相关命令行参数解释

FFmpeg 是一个强大的多媒体框架&#xff0c;能够解码、编码、转码、录制、播放以及流化几乎所有类型的音频和视频。它广泛应用于音视频处理任务中&#xff0c;包括格式转换、剪辑、合并、水印添加等。本文中简鹿办公将介绍如何使用 FFmpeg 进行一些常见的音视频转换任务。 安装…

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面&#xff1a; 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题&#xff0c;看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台&#xff0c;显示的cookie还是这样…

从0开始学习Linux——网络配置

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 上一个教程中&#xff0c;我们了解了…

python在word中插入图片

本文讲解python如何在word文档中插入图片&#xff0c;以及指定插入图片的段落。 1、在新建的word文档中插入图片 import win32com.client as win32 from win32com.client import constants # 1&#xff09;打开word应用程序 doc_app win32.gencache.EnsureDispatch(Word.App…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…

Linux qt下是使用搜狗輸入發

1.下载一个编译好的包 https://github.com/sixsixQAQ/fcitx5-qt 出处&#xff1a;这里 2.根据QT5&#xff0c;或者QT6选择下载 3.使用 把那个libfcitx5platforminputcontextplugin.so放到下面的路径&#xff1a; <你的Qt安装目录>/gcc_64/plugins/platforminputcontex…

linux命令详解,账号相关

账号相关 用户账号数据库相关文件 /etc/password 存储系统中所有用户账户的基本信息 /etc/shadow 用于存储用户账户的密码和其他安全相关信息 /etc/gshdow 用于存储用户组的密码和其他安全相关信息/etc/passwd: username:password:UID:GID:GECOS:home_directory:shell字段解…

Sentinel — 微服务保护

微服务架构将大型应用程序拆分为多个小而独立的服务&#xff0c;每个服务可以独立部署和扩展。然而&#xff0c;微服务系统需要面对的挑战也随之增加&#xff0c;例如服务之间的依赖、分布式环境下的故障传播和安全问题。因此&#xff0c;微服务保护措施是确保系统在高并发、资…

使用Qt制作一个流程变更申请流程进度以及未读消息提醒

1.1加载界面&#xff1a; 界面要素&#xff1a; 成员信息 变更位置申请 接受消息列表 根据角色加载对应界面。 1.2发起变更申请&#xff1a; 用户点击“发起变更申请”按钮。变更申请对话框可编辑&#xff0c;用户填写申请信息&#xff1a; 申请方&#xff08;自动填充&…

Markdown 全面教程:从基础到高级

Markdown 全面教程&#xff1a;从基础到高级 Markdown 是一种轻量级的标记语言&#xff0c;它的设计目标是使书写和阅读文档变得简单而直观。无论是撰写博客、编写文档还是创建 README 文件&#xff0c;Markdown 都是一个非常实用的工具。 目录 Markdown 简介Markdown 的基…

无插件H5播放器EasyPlayer.js关于硬解码和软解码的详细介绍

在当今这个多媒体内容日益丰富的时代&#xff0c;视频播放体验的重要性不言而喻.EasyPlayer.js H5播放器作为一款专为现代Web环境设计的播放器&#xff0c;它不仅提供了流畅的播放体验&#xff0c;还特别注重性能优化。EasyPlayer.js支持多种解码方式&#xff0c;包括硬解码和软…

Multi‐modal knowledge graph inference via media convergenceand logic rule

摘要 媒体融合通过处理来自不同模式的信息并将其应用于不同的领域来实现。传统的知识图很难利用多媒体特征&#xff0c;因为从其他模态引入大量信息降低了表示学习的有效性&#xff0c;并降低了知识图推理的有效性。为了解决这一问题&#xff0c;提出了一种基于媒体融合和规则…

大模型应用编排工具Dify二开之工具和模型页面改造

1.前言 简要介绍下 dify&#xff1a; ​ 一款可以对接市面上主流大模型的任务编排工具&#xff0c;可以通过拖拽形式进行编排形成解决某些业务场景的大模型应用。 背景信息&#xff1a; ​ 环境&#xff1a;dify-0.8.3、docker-21 ​ 最近笔者在做 dify的私有化部署和二次…

【数学】通用三阶矩阵特征向量的快速求法 超简单!!!

目录 三个定理1、3个特征值&#xff08;即根互不相等&#xff09;例题实践2、2个特征值&#xff08;即有一个双重根&#xff09;3、1个特征值&#xff08;即有一个三重根&#xff09;定理证明 三个定理 本定理适用于 所有三阶矩阵 的特征向量求法&#xff01; 1、3个特征值&…

MapReduce 的 Shuffle 过程

MapReduce 的 Shuffle 过程指的是 MapTask 的后半程&#xff0c;以及ReduceTask的前半程&#xff0c;共同组成的。 从 MapTask 中的 map 方法结束&#xff0c;到 ReduceTask 中的 reduce 方法开始&#xff0c;这个中间的部分就是Shuffle。是MapReduce的核心&#xff0c;心脏。 …

【WebRTC】视频采集模块中各个类的简单分析

目录 1.视频采集模块中的类1.1 视频采集基础模块&#xff08;VideoCaptureModule&#xff09;1.2 视频采集工厂类&#xff08;VideoCaptureFactory&#xff09;1.3 设备信息的实现&#xff08;DeviceInfoImpl&#xff09;1.4 视频采集的实现&#xff08;VideoCaptureImpl&#…

江协科技STM32学习- P40 硬件SPI读写W25Q64

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

智慧场馆:安全、节能与智能化管理的未来

在当今社会&#xff0c;智慧场馆已经成为了现代场馆建设的一种重要模式。通过整合先进技术和智能系统&#xff0c;智慧场馆致力于提供全方位的解决方案&#xff0c;以实现场馆的安全性、节能性和智能化管理。本文将深入探讨智慧场馆如何实现安全、节能和全面智能化&#xff0c;…