SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则

目录
    • 一、前言
    • 二、版本选择和适配
      • 2.1、本文使用各组件版本
      • 2.2、官方推荐版本
    • 三、部署sentinel-dashboard
      • 3.1、下载 sentinel-dashboard jar包
      • 3.2、启动 sentinel-dashboard
    • 四、Gateway 集成 Sentinel实现控制台配置流控规则测试
      • 4.1、添加Gateway 集成 Sentinel 包
      • 4.2、添加 Gateway 服务启动JVM参数
        • 4.2.1、配置说明
        • 4.2.2、启动说明
          • 4.2.2.1、使用 jar 包启动Gateway添加JVM启动参数
          • 4.2.2.2、IDEA中配置JVM启动参数(IDEA版本2022.2.1)
      • 4.3、启动 Gateway 注册到 Sentinel-dashboard 实现接口流控规则动态配置
        • 4.3.1、启动 Gateway 注册到 Sentinel-dashboard
        • 4.3.2、通过 Sentinel-dashboard 配置指定接口限流
      • 4.4、注意事项
    • 五、Gateway 集成 Sentinel 常用配置
      • 5.1、热加载
      • 5.2、降级处理配置(这里提供代码配置和使用配置文件配置)
        • 5.2.1、通过代码配置(配置文件配置比代码配置优先级高)
        • 5.2.2、通过配置文件配置
    • 六、自定义本地加载流控规则
      • 6.1、通过代码加载流控规则
      • 6.2、通过本地配置文件加载流控规则
        • 6.2.1、API分组规则json文件编写(gateway-sentinel-api-groups.json)
        • 6.2.2、流控规则json文件编写(gateway-sentinel-flow-rules.json)
        • 6.2.3、配置文件配置加载API分组和流控规则json文件
    • 七、动态监听Nacos规则配置实时更新流控规则实现(推荐)
      • 7.1、添加sentinel集成nacos包
      • 7.2、Nacos配置中心添加API分组规则json(gateway-sentinel-api-groups)
      • 7.3、Nacos配置中心添加流控规则json(gateway-sentinel-flow-rules)
      • 7.4、配置文件配置加载Nacos配置中心API分组和流控规则json
      • 7.5、测试效果

一、前言

SentinelSpringCloud Alibaba 家族的服务保护组件,很多项目在前中期没有遇到流量突增不太注意服务保护的重要性,当流量突增打爆应用服务或数据库时束手无策,可以不配置流控规则,但是需要时一定可以热加载使用,本文会对集成Sentinel以及动态拉取Nacos配置规则实现热加载流控规则进行讲解。

官网地址

二、版本选择和适配

使用 SpringCloud Alibaba 家族组件,要注意一下版本兼容问题,避免出现一些奇怪的问题,这里会说明本文使用的各组件版本,以及 SpringCloud Alibaba 推荐的各版本适配。

2.1、本文使用各组件版本

部分组件对版本兼容要求其实没有那么高,比如Nacos,不一定要按照官方推荐版本,差几个小版本没有什么影响,我本地使用的一直是Nacos2.0.2,代码集成实现基本都一样。

JDK:1.8.0
Spring-Boot:2.3.12.RELEASE
Spring-Cloud:Hoxton.SR12
Spring-Cloud-Alibaba:2.2.9.RELEASE
Nacos:2.0.2
Sentinel:1.8.5

2.2、官方推荐版本

官方版本说明
在这里插入图片描述

三、部署sentinel-dashboard

3.1、下载 sentinel-dashboard jar包

这里使用sentinel-dashboard-1.8.5,这里提供两个下载地址,需要其它版本可以自行去github下载。
github下载地址
百度网盘地址
在这里插入图片描述

3.2、启动 sentinel-dashboard
java -Dserver.port=8180 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
  • -Dserver.port=8180
    sentine 服务控制台端口
  • -Dsentinel.dashboard.auth.username=sentinel
    sentine 控制台登录账号,不设置默认sentinel
  • -Dsentinel.dashboard.auth.password=123456
    sentine 控制台登录密码,不设置默认sentinel
  • -Dcsp.sentinel.dashboard.server=localhost:8180
    将控制台自身注册到server
  • -Dproject.name=sentinel-dashboard
    控制台服务自己项目名称

在这里插入图片描述
在这里插入图片描述

四、Gateway 集成 Sentinel实现控制台配置流控规则测试

4.1、添加Gateway 集成 Sentinel 包

在原有网关项目基础上添加上这两个包,这两个包会将gateway集成sentinel,并且默认是自动配置的,无需手动配置。

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
4.2、添加 Gateway 服务启动JVM参数
4.2.1、配置说明

Gateway 连接 Sentinel 控制台的配置,Sentinel1.7.0 版本以下不支持配置文件配置,推荐直接使用JVM参数配置。

  • 添加JVM启动参数:
    -Dcsp.sentinel.dashboard.server=127.0.0.1:8180
    -Dcsp.sentinel.api.port=18719
    -Dproject.name=kerwin-gateway
    -Dcsp.sentinel.app.type=1

  • 参数说明:
    -Dcsp.sentinel.dashboard.server:指定控制台地址和端口。
    -Dproject.name:在sentinel控制台中展示的项目名称。
    -Dcsp.sentinel.api.port:指定客户端监控 API 的端口(默认是 8719),如控制台修改规则,则会向该端口推送规则信息。
    -Dcsp.sentinel.app.type:从 1.6.3 版本开始,控制台支持网关流控规则管理。该启动参数设置成1会将您的服务标记为 API Gateway,在接入控制台时您的服务会自动注册为网关类型,然后您即可在控制台配置网关规则和 API 分组。

4.2.2、启动说明

这里提供服务打成jar包启动和使用IDEA开发工具添加JVM参数启动示例。

4.2.2.1、使用 jar 包启动Gateway添加JVM启动参数
java -Dcsp.sentinel.dashboard.server=127.0.0.1:8180 -Dcsp.sentinel.api.port=18719 -Dproject.name=kerwin-gateway -Dcsp.sentinel.app.type=1 -jar kerwin-gateway.jar
4.2.2.2、IDEA中配置JVM启动参数(IDEA版本2022.2.1)

不同版本IDEA可以配置入口不同,有需要可以自己查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3、启动 Gateway 注册到 Sentinel-dashboard 实现接口流控规则动态配置

这里需要注意,Gateway 集成 Sentinel-dashboard 默认是懒加载的,需要调用一次接口才能注册到 Sentinel-dashboard,也可以直接在 Gateway 中配置成热加载,添加spring.cloud.sentinel.eager:true实现服务器启动了自动心跳注册。

4.3.1、启动 Gateway 注册到 Sentinel-dashboard

在这里插入图片描述

4.3.2、通过 Sentinel-dashboard 配置指定接口限流

这里需要注意,这个流控规则是按照组级别来的,一个组内所有匹配规则会共用一个阈值,如果需要在网关应用配置单独接口流控规则目前来看只能配置多个分组,然后单独配置规则。

  • 1、新增 API 分组
    在这里插入图片描述

  • 2、自定义分组内 API 匹配规则
    在这里插入图片描述

  • 3、新增网关流控规则
    在这里插入图片描述

  • 4、配置网关流控规则(这里需要注意,这个流控规则是按照组级别来的,一个组内所有匹配规则共用一个阈值)
    在这里插入图片描述

  • 5、测试限流规则
    快速请求两次可以看到服务端响应 Blocked by Sentinel: ParamFlowException,响应内容也是可以自定义的,这个会在后面说明。
    在这里插入图片描述

PS1秒内同时请求一次 /user/info 接口 和 /user/list 接口,也会响应Blocked by Sentinel: ParamFlowException,因为同一个分组共用一个阈值,如果要单独配置某一个接口目前看只能整多个分组。

4.4、注意事项

需要注意:如果不做特殊处理,通过Sentinel控制台配置的规则在应用服务重启后就没了,通过Sentinel控制台配置流控规则的本质其实就是将编辑好的规则加载到应用服务缓存中,并不会进行持久化,如果想要持久化Sentinel控制台配置的规则需要特殊处理,后续会进行说明。

五、Gateway 集成 Sentinel 常用配置

5.1、热加载
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true
5.2、降级处理配置(这里提供代码配置和使用配置文件配置)
5.2.1、通过代码配置(配置文件配置比代码配置优先级高)
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;@Configuration
public class SentinelGatewayConfiguration {/*** 自定义降级处理响应*/@PostConstructpublic void init(){GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable throwable) {return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).bodyValue("{"code":500,"msg":"代码配置-被限流了!"}");}});}
}

在这里插入图片描述

5.2.2、通过配置文件配置
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: truescg:# 降级处理配置 也可以在代码中实现fallback:# 指定降级处理的模式为返回响应,也可以配置成重定向redirect,配置重定向需要指定重定向地址mode: 'response'response-status: 200response-body: '{"code":500,"msg":"配置文件配置-被限流了!"}'# mode 为 redirect 时使用redirect: 'https://blog.csdn.net/weixin_44606481'

在这里插入图片描述

六、自定义本地加载流控规则

因为 sentinel-dashboard 不会持久化手动配置的流控规则,一般情况下我们都会提前配置一些我们需要的规则,可以通过代码或者配置文件配置。

6.1、通过代码加载流控规则

Sentinel 的API管理存储在 GatewayApiDefinitionManager 类中,流控规则存储在 GatewayRuleManager 类中,添加好自己需要的配置即可。

import com.alibaba.csp.sentinel.adapter.gateway.common.SentinelGatewayConstants;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPathPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiPredicateItem;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.GatewayApiDefinitionManager;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule;
import com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayRuleManager;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.Set;@Configuration
public class SentinelGatewayRuleConfiguration {@PostConstructpublic void initRule(){// 加载根据路由 ID 配置限流规则this.initGatewayFlowRules();// 加载根据API分组配置限流规则this.initApiDefinitions();}private void initGatewayFlowRules() {// 存储限流规则的集合Set<GatewayFlowRule> rules = GatewayRuleManager.getRules();if(rules == null){rules = new HashSet<>();}// 根据路由 ID 配置限流规则GatewayFlowRule rule1 = new GatewayFlowRule("kerwin-user").setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID).setCount(1) // QPS阈值.setIntervalSec(1); // 间隔rules.add(rule1);// 加载限流规则GatewayRuleManager.loadRules(rules);}private void initApiDefinitions() {Set<ApiDefinition> apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions();if(apiDefinitions == null){apiDefinitions = new HashSet<>();}// 创建一个 API 分组ApiDefinition apiDefinition1 = new ApiDefinition("user服务API组");// API 分组 URL 匹配规则Set<ApiPredicateItem> apiPathPredicateItems = new HashSet<>();// 添加精确匹配 匹配为 /api-user/user/info 的urlapiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("/api-user/user/info").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_EXACT));// 添加前缀匹配 用于匹配以 /api-user/user 开头的URLapiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("/api-user/user/**").setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
//        // 添加正则匹配 用于匹配以 list 结尾的 URL
//        apiPathPredicateItems.add(new ApiPathPredicateItem().setPattern("^.*list$")
//                .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_REGEX));apiDefinition1.setPredicateItems(apiPathPredicateItems);apiDefinitions.add(apiDefinition1);// 根据 API 分组配置限流规则Set<GatewayFlowRule> rules = GatewayRuleManager.getRules();if(rules == null){rules = new HashSet<>();}GatewayFlowRule rule1 = new GatewayFlowRule(apiDefinition1.getApiName()).setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME).setCount(1) // QPS阈值.setIntervalSec(1); // 间隔rules.add(rule1);// 加载 API 分组定义GatewayApiDefinitionManager.loadApiDefinitions(apiDefinitions);// 加载限流规则GatewayRuleManager.loadRules(rules);}
}

项目启动后可以在Sentinel控制台看到代码配置的API分组和流控规则。

6.2、通过本地配置文件加载流控规则

通过代码手动配置会比较麻烦而且不易调整,Gateway集成Sentinel包提供了通过配置文件加载API分组和流控规则实现,这里会将API分组和流控规则都分别写入不同的json文件中,交由对于实现类去进行加载。

6.2.1、API分组规则json文件编写(gateway-sentinel-api-groups.json)

resource目录创建gateway-sentinel-api-groups.json将API分组规则内容填进去。

[{"apiName": "user服务API组","predicateItems": [{"pattern": "/api-user/user/info","matchStrategy": 0},{"pattern": "/api-user/user/**","matchStrategy": 1}]}
]

解释:

  • apiName:
    字符串,代表 API 组名称,这里是 “user服务API组”,用于统一管理相关 API。
  • predicateItems:
    数组,包含多个 predicateItem 对象,用于描述 API 的匹配模式。
  • predicateItem 内部元素:
    • pattern:
      字符串,使用不同风格的表达式。
      例如,“/api-user/user/info” 精确匹配该路径;“/api-user/user/**” 匹配 /api-user/user/ 下的所有路径(包括子路径)。
    • matchStrategy:
      整数,匹配策略:
      0:精确匹配,路径需与 pattern 完全一致。
      1:前缀匹配,路径以 pattern 开头即可。
      2:正则匹配,使用 pattern 作为正则表达式进行匹配。
6.2.2、流控规则json文件编写(gateway-sentinel-flow-rules.json)

resource目录创建gateway-sentinel-flow-rules.json将流控规则内容填进去。

[{"resource": "user服务API组","resourceMode": 1,"count": 1,"intervalSec": 1,"burst": 0,"paramItem": null,"controlBehavior": 0,"maxQueueingTimeoutMs": 0},{"resource": "kerwin-user","resourceMode": 0,"count": 1,"intervalSec": 1,"burst": 0,"paramItem": null,"controlBehavior": 0,"maxQueueingTimeoutMs": 0}
]

字段解释:

  • resource:资源名称,用于标识要进行流控的目标。可以是路由 ID、自定义 API 分组名称等。在网关场景中,资源可以代表一个具体的路由或者一组路由的集合。
  • resourceMode:
    • 0:代表资源模式,对应 SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID,表示基于 Route ID 进行资源匹配。
    • 1:API分组模式,对应 SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME,标识基于API分组进行资源匹配。
  • count:流控阈值,根据 grade 字段的不同,其代表的意义也不同。如果 grade 为 QPS 限流,count 表示每秒允许通过的请求数量;如果 grade 为并发线程数限流,count 表示允许的最大并发线程数。
  • grade:流控阈值类型,取值有两种。1 表示 QPS(每秒查询率)限流,0 表示并发线程数限流。
  • intervalSec:统计时间窗口,单位为秒。表示在多长时间内统计请求数量以判断是否触发流控。
  • controlBehavior:流控效果,即当请求超过阈值时的处理方式
    • 0:快速失败,请求超过阈值时直接拒绝并抛出异常
    • 2:匀速排队,请求会进入队列,按照固定速率处理,避免流量突发
  • burst:仅在 controlBehavior 为 0(快速失败)时有效,表示突发流量容忍值。在短时间内允许超过阈值的额外请求数量,用于应对突发流量场景。
  • maxQueueingTimeoutMs:仅在 controlBehavior 为 2(匀速排队)时有效,表示请求在队列中的最大排队时间,单位为毫秒。超过该时间的请求将被拒绝。
6.2.3、配置文件配置加载API分组和流控规则json文件

在配置文件中添加API分组和流控规则读取数据源配置,这里省略了其它Sentinel配置需要可以看之前配置内容添加。

spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# API分组&流控规则配置文件配置datasource:ds1:file:file: classpath:gateway-sentinel-api-groups.jsonruleType: gw-api-group # 网关API分组dataType: jsonds2:file:file: classpath:gateway-sentinel-flow-rules.jsonruleType: gw-flow # 网关流控规则dataType: json

这里就不贴图了,配置完成后启动看看Sentinel控制台是否有初始化这些配置,要记得开启热加载。

七、动态监听Nacos规则配置实时更新流控规则实现(推荐)

通过Nacos配置中心动态拉取加载流控规则和本地配置文件配置是类似的,编写的规则json是一样的,只是需要指定一下加载的数据源为Nacos读取,并且已经实现了动态加载,在Nacos配置中心修改规则会进行实时同步。

7.1、添加sentinel集成nacos包

sentinel读取nacos配置需要添加这个适配包。

        <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
7.2、Nacos配置中心添加API分组规则json(gateway-sentinel-api-groups)

配置的内容和本文6.2.1中一致。
在这里插入图片描述

7.3、Nacos配置中心添加流控规则json(gateway-sentinel-flow-rules)

配置的内容和本文6.2.2中一致。
在这里插入图片描述

7.4、配置文件配置加载Nacos配置中心API分组和流控规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# API分组&流控规则配置文件配置datasource:ds1:nacos:server-addr: 172.16.8.169:8848data-id: gateway-sentinel-api-groupsnamespace: springcloud-component-examplegroup-id: DEFAULT_GROUPusername: nacospassword: nacosdata-type: jsonrule-type: gw-api-groupds2:nacos:server-addr: 172.16.8.169:8848data-id: gateway-sentinel-flow-rulesnamespace: springcloud-component-examplegroup-id: DEFAULT_GROUPusername: nacospassword: nacosdata-type: jsonrule-type: gw-flow
7.5、测试效果
  • 1、启动网关服务,查看注册API分组和流控规则
    在这里插入图片描述
  • 2、Nacos配置中心修改流控规则
    在这里插入图片描述
  • 3、查看sentinel控制台同步情况
    在这里插入图片描述

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

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

相关文章

Linux八股【1】-----虚拟内存

参考&#xff1a;小林coding 虚拟内存存在的目的&#xff1f; 为了能够同时运行多个进程同时进程之间互不干扰 虚拟地址通过MMU找到物理地址 物理内存怎么映射的&#xff1f; 物理内存的映射方法主要有两种&#xff0c;内存分段和内存分页 内存分段 把程序的不同区&#…

惊艳呈现:探索数据可视化的艺术与科学

一张图表真能胜过千言万语&#xff1f;当超市销售数据变成跳动的热力图&#xff0c;当城市交通拥堵状况化作流动的光带&#xff0c;数据可视化正以超乎想象的方式重塑我们认知世界的维度。但你是否想过&#xff0c;那些看似精美直观的图表背后&#xff0c;藏着怎样精密的科学逻…

06-排序

排序 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键…

从失效文档到知识资产:Gitee Wiki 引领研发知识管理变革

在关键领域软件研发的复杂生态中&#xff0c;知识管理正成为制约行业发展的关键瓶颈。随着软件系统规模不断扩大、技术栈日益复杂&#xff0c;传统文档管理模式已难以满足现代软件工厂对知识沉淀、共享和传承的需求。Gitee Wiki作为新一代知识管理平台&#xff0c;通过技术创新…

MySQL 性能调优入门 - 慢查询分析与索引优化基础

MySQL 性能调优入门 - 慢查询分析与索引优化基础 性能问题诊断的通用思路 当数据库出现性能问题时,切忌盲目猜测或随意调整参数。一个科学的诊断流程通常包括: 基于数据,而非猜测 (Data-Driven, Not Guesswork):利用我们在上一篇讨论的性能监控指标和建立的基线。查看哪些…

8天Python从入门到精通【itheima】-73~74(数据容器“集合”+案例练习)

目录 73节-集合的基础定义和操作 1.学习目标 2.为什么要用集合 3.集合的定义 4.关于集合的常用操作 【1】添加新元素&#xff1a;add方法 【2】移除元素&#xff1a;remove方法 【3】随机取出元素&#xff1a;pop方法 【4】清空集合&#xff1a;clear方法 【5】取出两…

国芯思辰| AD7894的优质替代方案:SC1424模数转换器在分布式控制系统中的应用优势

分布式控制系统将控制任务分散至多个节点&#xff0c;各节点协同工作以实现复杂的控制目标。在这一架构下&#xff0c;系统ADC提出了严苛要求。高精度是精准采集各类模拟信号&#xff08;如传感器输出的电压、电流信号&#xff09;的基础&#xff0c;关乎控制决策的准确性&…

Unity基础-数学向量

Unity基础-数学向量 二、向量相关用法 概述 向量在Unity游戏开发中扮演着重要角色&#xff0c;用于表示位置、方向、速度等。Unity提供了Vector2、Vector3等结构体来处理向量运算。 1. 向量基础操作 1.1 向量创建和访问 // 创建向量 Vector3 position new Vector3(1, 2,…

Neo4j 数据建模:原理、技术与实践指南

Neo4j 作为领先的图数据库,其核心优势在于利用图结构直观地表达和高效地查询复杂关系。其数据建模理念与传统关系型数据库截然不同,专注于实体(节点)及其连接(关系)。以下基于官方文档,系统阐述其建模原理、关键技术、实用技巧及最佳实践: 一、 核心原理:以关系为中心…

volka 25个短语动词

以下是分句分段后的内容&#xff1a; 3,000. Thats 95% of spoken English. And I am teaching you all of these words. First, Ill teach you todays words. And then youll hear them in real conversations. With my brother. Stick around until the end, because witho…

服务器中日志分析的作用都有哪些

服务器日志是用来检测和排查可疑行为的主要工具&#xff0c;运维团队可以通过分析和解读日志文件&#xff0c;发现服务器中潜在的网络安全威胁或异常活动&#xff0c;下面&#xff0c;就让小编和大家一起来了解一下服务器中日志分析的作用都有什么吧&#xff01; 对于服务器中的…

嵌入式硬件篇---龙芯2k1000串口

针对串口错误 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解决方法 硬件方面 检查连接 确认串口设备(如串口线、连接的模块等)与龙芯设备之间的物理连接是否牢固,没有松动、脱落情况。尝试重新…

基于langchain的简单RAG的实现

闲来无事&#xff0c;想研究一下RAG的实现流程&#xff0c;看网上用langchain的比较多&#xff0c;我自己在下面也跑了跑&#xff0c;代码很简单&#xff0c;以次博客记录一下&#xff0c;方便回顾 langchain LangChain 是一个基于大型语言模型&#xff08;LLM&#xff09;开发…

视频监控平台建设方案

第三方视频监控平台是整合视频监控、门禁、报警等多业务的安防软件系统,具备兼容性、开放性、多业务整合和多级联网能力。其核心价值在于兼容友商编解码设备(如 IPC、DVR)、整合第三方子系统(如报警联动)、支持多级多域架构(适应平安城市等大规模场景)及提供集中存储方案…

天机学堂(学习计划和进度)

经过前面的努力&#xff0c;我们已经完成了《我的课程表》相关的功能的基础部分&#xff0c;不过还有功能实现的并不完善。还记得昨天给大家的练习题吗&#xff1f;《查询我正在学习的课程》&#xff0c;在原型图中有这样的一个需求&#xff1a; 我们需要在查询结果中返回已学习…

软件项目管理(3) 软件项目任务分解

一、相关概念 1.任务分解的方法和步骤 &#xff08;1&#xff09;方法 模板参照方法&#xff1a;参照有标准或半标准的任分解结构图类比方法&#xff1a;任务分解结构图经常被重复使用&#xff0c;具有相似性自顶向下方法&#xff1a;一般->特殊&#xff0c;演绎推理从大…

Vite 双引擎架构 —— Esbuild 概念篇

Vite 底层采用 双引擎架构&#xff0c;核心构建引擎是 Esbuild 和 Rollup&#xff0c;二者在开发和生产环境中分工协作&#xff0c;共同实现高性能构建。不可否认&#xff0c;作为 Vite 的双引擎之一&#xff0c;Esbuild 在很多关键的构建阶段(如依赖预编译、TS 语法转译、代码…

leetcode hot100 链表(二)

书接上回&#xff1a; leetcode hot100 链表&#xff08;一&#xff09;-CSDN博客 8.删除链表的倒数第N个结点 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* currhead;int len0;while(curr){currcurr->next;len;}int poslen-n…

Compose Multiplatform 实现自定义的系统托盘,解决托盘乱码问题

Compose Multiplatform是 JetBrains 开发的声明式 UI 框架&#xff0c;可让您为 Android、iOS、桌面和 Web 开发共享 UI。将 Compose Multiplatform 集成到您的 Kotlin Multiplatform 项目中&#xff0c;即可更快地交付您的应用和功能&#xff0c;而无需维护多个 UI 实现。 在…

C++11 Move Constructors and Move Assignment Operators 从入门到精通

文章目录 一、引言二、基本概念2.1 右值引用&#xff08;Rvalue References&#xff09;2.2 移动语义&#xff08;Move Semantics&#xff09; 三、移动构造函数&#xff08;Move Constructors&#xff09;3.1 定义和语法3.2 示例代码3.3 使用场景 四、移动赋值运算符&#xff…