当前位置: 首页 > news >正文

微服务-sentinel的理论与集成springcloud

Sentinel

服务雪崩

  • 服务雪崩定义:一个服务失败,导致整条链路的所有服务都失败的连锁反应,就像雪山崩塌一样,小范围的问题引发整体崩溃。【即服务C一直没有响应给服务B,导致一直等待,占用资源,那么其他的访问服务则也会被阻塞】
  • 解决手段:服务熔断和服务降级。比如当链路中某个服务(如 Service C)异常时,及时 “熔断”(切断请求)或 “降级”(返回兜底逻辑),防止故障像多米诺骨牌一样蔓延,避免整条链路的服务都瘫痪。

举个例子,若 Service C 故障且没有保护措施,上游的 Service A、Service B 等调用它的服务会因等待响应而阻塞,最终导致整个服务链路的资源耗尽、全部失效,这就是服务雪崩。而服务熔断和降级能在 Service C 出问题时,快速隔离故障,保障其他服务正常运行。

服务限流

  • 核心逻辑:当系统能处理的并发量(比如 1 万)小于实际请求并发量(比如 2 万)时,限流机制会保障其中 1 万用户的请求正常处理,避免因请求量过大拖垮系统可用性。
  • 限流目的:通过限制 “并发访问数” 或 “时间窗口内的请求数量” 来保护系统。当流量达到限制时,会对超出的请求采取拒绝策略,比如跳转错误页面、请求排队、服务降级等。

可以类比生活中的 “地铁限流”:地铁站能容纳的客流是有限的,当客流超过承载量时,会通过分批放行、设置围栏等方式限流,避免站内拥挤瘫痪,保障整体秩序和安全。

熔断和降级

一、服务熔断

  • 定义:当服务提供者故障时,为防止雪崩,暂时隔离故障接口,后续请求直接失败,直到服务恢复。
  • 机制:基于断路器模式,分为 Closed(正常)、Open(熔断)、Half Open(半开试探)三种状态,是框架级的被动防护(类似电路断路器,达到故障阈值后自动触发)。

二、服务降级

  • 定义:为保障核心服务,主动舍弃非核心业务的处理能力。比如下游服务响应慢时,主动停掉非核心功能;或服务不可用时,上游调用本地降级逻辑快速返回。
  • 特点:是**业务级的主动策略(类似“开关”,通过配置中心控制哪些服务降级,如淘宝双11关闭退货功能**保障交易核心链路)。

三、核心区别

维度服务熔断服务降级
触发原因服务故障(被动触发)资源不足/保障核心(主动触发)
处理层面框架级(底层自动隔离)业务级(人工配置非核心功能降级)
目的防止故障蔓延(避免雪崩)保障核心服务可用性(牺牲非核心)
机制断路器模式(Closed→Open→Half Open)开关策略(配置中心控制降级范围)

简单总结:熔断是“被动防故障扩散”,降级是“主动保核心服务”,两者都是应对服务故障的手段,但触发逻辑和处理层面不同。

限流算法

一、各限流算法介绍

1. 计数器算法
  • 原理:在固定时间周期(如3秒)内累加请求数,若达到限流阈值则触发限流;周期结束后计数器清零。
  • 问题:存在“临界缺陷”。例如,若阈值是150请求/3秒,可能在2-3秒内涌入150请求,3-4秒内又涌入150请求,导致2秒内实际处理300请求,超过系统承载能力。

2. 滑动窗口算法
  • 原理:将固定时间窗口拆分为多个小窗口(如把3秒窗口拆成3个1秒小窗口),每个小窗口独立计数;窗口随时间滑动,总请求数为所有小窗口计数之和,若超过阈值则限流。
  • 作用:解决计数器算法的临界问题,使流量控制更平滑。

3. 令牌桶算法
  • 原理:系统以恒定速率向“令牌桶”中放入令牌;请求需先从桶中获取令牌才能被处理,无令牌则被限流;桶有最大容量,满时多余令牌会被丢弃。
  • 特点:允许一定程度的“突发流量”(只要桶中有令牌,可一次性处理多个请求),同时长期速率受控。

4. 漏桶算法
  • 原理:请求先进入“漏桶”,漏桶以恒定速率向外处理请求;若桶满,新请求会被丢弃或拒绝。
  • 特点:严格控制流量的流出速率,无论流入多快,流出速率始终恒定;能平滑突发流量,但无法处理合理的突发请求(灵活性低于令牌桶)。

二、算法区别对比

维度计数器算法滑动窗口算法令牌桶算法漏桶算法
流量控制粒度固定时间周期细分的小时间窗口令牌生成速率+桶容量恒定流出速率
突发流量支持不支持(临界缺陷)部分支持(窗口越小越灵活)支持(桶存令牌可突发处理)不支持(严格匀速流出)
实现复杂度简单中等(需拆分小窗口)中等(需维护令牌生成和桶状态)简单
典型应用场景简单场景临时限流对精度要求较高的限流需兼容突发流量的场景(如API网关)需严格匀速处理的场景(如消息中间件)

简单总结:

  • 计数器是“入门级”限流,易实现但有缺陷;
  • 滑动窗口是计数器的改良版,精度更高;
  • 令牌桶兼顾“速率控制”和“突发流量”;
  • 漏桶则是“严格匀速”的流量整形工具。

sentinel介绍

启动

一、准备工作

  1. 下载 Sentinel Dashboard
    Sentinel 提供了可视化控制台(Dashboard),用于监控和配置规则。
    下载地址:Sentinel 官方 Releases
    选择适合的版本(如 sentinel-dashboard-1.8.6.jar

二、启动 Sentinel Dashboard(控制台)

  1. 命令行启动
    打开终端,执行以下命令启动控制台:
java -jar sentinel-dashboard-1.8.6.jar
- 默认端口:`8080`  
- 默认账号密码:`sentinel` / `sentinel`
  1. 自定义配置(可选)
    如需修改端口、账号密码,可添加参数:
# 示例:修改端口为 8081,账号为 admin,密码为 123456
java -Dserver.port=8081 -Dsentinel.dashboard.auth.username=admin -Dsentinel.dashboard.auth.password=123456 -jar sentinel-dashboard-1.8.6.jar
  1. 验证启动
    访问 http://localhost:8080(或自定义端口),使用账号密码登录,能看到控制台界面即启动成功。

三、配置应用连接 Sentinel Dashboard

  1. 添加依赖
    在 Spring Boot/Cloud 项目的 pom.xml 中添加:
<!-- Sentinel 核心依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置连接信息
    application.ymlapplication.properties 中添加:
spring:cloud:sentinel:transport:# Sentinel Dashboard 地址和端口dashboard: localhost:8080# 应用与 Dashboard 通信的端口(默认 8719,如被占用会自动+1)port: 8719

四、启动应用并触发监控

  1. 启动应用
    启动你的 Spring Boot 应用,此时应用会自动连接 Sentinel Dashboard。
  2. 触发资源监控
    Sentinel 采用“懒加载”机制,首次访问受保护的资源后才会在控制台显示
    例如访问之前定义的接口:http://localhost:8001/foo1
    访问后,刷新 Sentinel Dashboard,即可在左侧“簇点链路”中看到 foo1 资源。

总结流程

  1. 启动 Sentinel Dashboard(控制台)
  2. 配置应用连接 Dashboard 并启动应用
  3. 访问受保护的资源,触发监控
  4. 在控制台配置规则并测试效果

通过以上步骤,即可完成 Sentinel 的启动和基础使用。生产环境中,还需考虑高可用配置(如规则持久化到 Nacos/Apollo 等)。

sentinel集成

一、编码方式

1. 引入 Maven 依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.1.1.RELEASE</version>
</dependency>
  • 作用:引入 Sentinel 的核心功能包,使项目具备 Sentinel 的限流、熔断、降级等能力。
2. 配置限流策略(通过 InitFunc 实现)

创建限流策略类 FlowRuleStrategy 实现 com.alibaba.csp.sentinel.init.InitFunc 接口:

package com.muse.sentinel.strategy;import java.util.ArrayList;
import java.util.List;import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;/*** 限流策略配置,实现 InitFunc 接口让 Sentinel 启动时自动加载规则*/
public class FlowRuleStrategy implements InitFunc {@Overridepublic void init() {List<FlowRule> rules = new ArrayList<>();FlowRule flowRule = new FlowRule();// 限流阈值(QPS 模式下表示每秒最多允许 1 个请求)flowRule.setCount(1);// todo:要限流的资源名称(需与 @SentinelResource 的 value 一致)flowRule.setResource("foo1");// 限流维度:QPS(每秒查询数)flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 限流针对的应用(default 表示不区分应用)flowRule.setLimitApp("default");rules.add(flowRule);// 将规则加载到 Sentinel 规则管理器FlowRuleManager.loadRules(rules);}
}
  • 作用:在应用启动时,自动初始化并加载限流规则,指定对资源 foo1QPS 模式 限流(每秒最多 1 个请求)。
3. 配置自动加载文件

在项目的 resources 目录下创建路径 META-INF/services/,并新建文件 com.alibaba.csp.sentinel.init.InitFunc,文件内容为限流策略类的全限定名:

com.muse.sentinel.strategy.FlowRuleStrategy
  • 作用:Sentinel 启动时会扫描该文件,自动加载并执行 FlowRuleStrategyinit 方法,完成限流规则的初始化。

4. 定义受保护的资源(通过 @SentinelResource 注解)

在 Controller 中定义接口,并通过 @SentinelResource 标记资源、指定限流后的处理方法:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {/*** 受 Sentinel 保护的资源接口,资源名为 "foo1",限流后执行 blockHandlerFoo1 方法*/@SentinelResource(value = "foo1", blockHandler = "blockHandlerFoo1")@GetMapping("/foo1")public String foo1() {return "-----foo1-----";}/*** 限流后的降级处理方法,参数需包含 BlockException*/public String blockHandlerFoo1(BlockException e) {return "request blocking!";}
}
  • 作用
    • @SentinelResource(value = "foo1"):将 /foo1 接口标记为资源 foo1,使 Sentinel 能对其应用限流规则。
    • blockHandler = "blockHandlerFoo1":指定限流发生时执行的降级方法,返回友好的提示信息,避免直接抛出异常影响用户体验。

以下是基于 Sentinel Dashboard 方式集成 Spring Cloud 的完整流程:

二、利用Sentinel Dashboard

1. 引入 Maven 依赖

在 Spring Cloud 项目的 pom.xml 中添加:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.1.1.RELEASE</version>
</dependency>
2. 配置 application.yml 连接 Dashboard
spring:application:name: sentinel-demo # 应用名称,会在Dashboard中显示cloud:sentinel:transport:dashboard: 127.0.0.1:8080 # 连接Sentinel Dashboard的地址和端口
3.定义受保护的资源接口

在 Controller 中定义需要被 Sentinel 监控的接口(以 /dashboard 为例):

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DashboardDemoController {/*** 受Sentinel监控的资源接口,资源名为"dashboard"*/@SentinelResource(value = "dashboard", blockHandler = "blockHandlerDashboard")@GetMapping("/dashboard")public String dashboard() {return "-----dashboard-----";}/*** 限流/熔断后的降级处理方法*/public String blockHandlerDashboard(BlockException e) {return "请求被限流,请稍后再试!";}
}
4.触发资源监控并配置规则
1. 启动项目并访问接口

启动 Spring Boot 项目后,访问 http://localhost:8001/dashboard(假设项目端口为 8001),多次访问以触发 Sentinel 的“懒加载”监控机制。

2. 在 Dashboard 中配置“簇点链路”规则
  • 登录 Sentinel Dashboard(http://localhost:8000),左侧选择你的应用(sentinel-demo)。
  • 点击簇点链路,找到资源 dashboard,点击右侧的流控按钮。
  • 配置限流规则(例如:QPS 阈值设为 2,表示每秒最多允许 2 个请求),点击“新增”。

3. 测试限流效果

快速多次访问 http://localhost:8001/dashboard,当请求频率超过 QPS 阈值时,会返回 blockHandlerDashboard 中定义的降级提示“请求被限流,请稍后再试!”,说明 Dashboard 方式的限流规则已生效。

三、集成 Nacos 流程

一、集成流程

Sentinel 集成 Nacos 主要是为了实现规则持久化(避免应用重启后规则丢失),同时支持动态更新规则。以下是完整流程:

1. 环境准备
  • 启动 Nacos 服务端:确保 Nacos 已启动(默认地址 127.0.0.1:8848,账号密码 nacos/nacos)。
  • 启动 Sentinel Dashboard:确保 Sentinel 控制台已启动(默认地址 127.0.0.1:8080,账号密码 sentinel/sentinel)。
2. 项目集成配置
(1)引入依赖

在 Spring Cloud 项目的 pom.xml 中添加以下依赖:

<!-- Sentinel 核心依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Sentinel 对接 Nacos 数据源的扩展依赖 -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
(2)配置 application.yml

根据你的配置,添加 Sentinel 连接 Dashboard 和 Nacos 的信息:

server:port: 8001
spring:application:name: sentinel-nacos-democloud:sentinel:# 连接 Sentinel Dashboardtransport:dashboard: 127.0.0.1:8080# 配置 Nacos 作为规则数据源datasource:- nacos:server-addr: 127.0.0.1:8848  # Nacos 地址data-id: sentinel-nacos-demo-sentinel-flow  # Nacos 中存储规则的配置IDgroup-id: DEFAULT_GROUP  # Nacos 配置的分组data-type: json  # 配置格式为 JSONrule-type: flow  # 规则类型(流控规则)
3. Nacos 中配置规则

登录 Nacos 控制台(http://127.0.0.1:8848/nacos),按照以下步骤添加流控规则配置:

  • 进入「配置管理」→「配置列表」,点击「+ 新建配置」。
  • 填写配置信息:
    • Data IDsentinel-nacos-demo-sentinel-flow(与 application.ymldata-id 一致)。
    • GroupDEFAULT_GROUP(与 application.ymlgroup-id 一致)。
    • 配置格式JSON
    • 配置内容:示例流控规则(可根据需要调整):
[{"resource": "foo1",  # 资源名(需与 @SentinelResource 或 URL 资源一致)
#  "resource": "/withnacos",  # 这里也可以指定接口路径"limitApp": "default","grade": 1,  # 1 表示 QPS 限流,0 表示并发线程数限流"count": 2,  # 限流阈值(QPS 模式下表示每秒最多 2 个请求)"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]
  • 点击「发布」,完成 Nacos 中规则的配置。
4. 启动项目并验证

启动你的 Spring Boot 项目后,Sentinel 会自动从 Nacos 拉取规则并生效。

二、在 Sentinel 控制台的表现

完成集成后,在 Sentinel Dashboard 中会有以下体现:

1. 规则自动加载

启动项目后,访问 Sentinel Dashboard(http://127.0.0.1:8080),进入你的应用(sentinel-nacos-demo):

  • 点击「流控规则」,会看到从 Nacos 拉取的规则(如上述 foo1 资源的限流规则)已自动加载。
2. 规则动态同步(Nacos → Sentinel 控制台)

若在 Nacos 中修改规则配置(如调整 count 阈值)并发布,Sentinel 控制台会自动同步更新规则,无需重启应用。

3. 规则持久化保障

即使重启应用,Sentinel 也会从 Nacos 重新拉取规则,避免规则丢失。

总结
  • 集成流程:准备环境 → 项目引入依赖 → 配置 Dashboard 和 Nacos 连接 → Nacos 中配置规则 → 启动项目验证。
  • 控制台表现:规则自动加载、动态同步更新、持久化不丢失,实现了“配置一次,永久生效(除非主动修改 Nacos 配置)”的效果。

URL资源清洗处理器

控制器接口
/*** 案例3:URL资源清洗* 两个示例URL:* http://localhost:8001/urlCleaner/1 * http://localhost:8001/urlCleaner/2*/
@GetMapping("/urlCleaner/{id}") // 路径包含动态参数{id}
public String urlCleaner(@PathVariable("id") int id) {return "-----urlCleaner-----";
}
URL资源清洗处理器
package com.muse.sentinel.handler;import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlCleaner;/*** URL资源清洗处理器* 实现Sentinel的UrlCleaner接口,用于统一处理URL路径,将相似URL合并为同一资源*/
@Service // 交给Spring容器管理,使Sentinel能够自动识别并使用
public class MuseUrlCleaner implements UrlCleaner {@Overridepublic String clean(String s) {// 如果URL为空,直接返回if (StringUtils.isBlank(s)) {return s;}// 核心逻辑:将所有以/urlCleaner/开头的URL统一处理为/urlCleaner/*if (s.startsWith("/urlCleaner/")) {return "/urlCleaner/*";}// 其他URL不做处理,返回原始路径return s;}
}
核心作用

MuseUrlCleaner 实现了 Sentinel 的 UrlCleaner 接口,核心作用是:
对 URL 路径进行“清洗”(标准化处理),将动态参数不同但结构相同的 URL 识别为同一资源

例如:

  • 原始 URL:/urlCleaner/1/urlCleaner/2(仅动态参数 id 不同)
  • 清洗后:统一识别为 /urlCleaner/*(视为同一个资源)

这样 Sentinel 会将这些 URL 当作同一个资源进行限流/熔断等规则控制,避免因参数不同而被识别为多个资源,导致规则配置失效。

使用场景

主要解决 “动态参数 URL 被重复识别为不同资源” 的问题,典型场景包括:

  1. 路径包含动态参数的接口
    如:
    • /user/123/user/456(用户ID不同)
    • /order/789/order/012(订单ID不同)
      这些 URL 业务逻辑相同,但因参数不同,默认会被 Sentinel 识别为多个资源。通过 UrlCleaner 可将其统一为 /user/*/order/*,便于统一配置规则。
  2. 需要按 URL 前缀统一管控的场景
    例如希望对所有 /api/v1/* 路径的接口应用相同的限流规则,可通过清洗将 /api/v1/user/api/v1/order 统一为 /api/v1/*
  3. 避免资源数量爆炸
    若不对动态参数 URL 清洗,当参数值无限多时(如用户ID、订单ID),Sentinel 会生成大量资源,导致控制台难以管理,甚至影响性能。
生效效果

以案例中的接口为例:

  1. 访问 http://localhost:8001/urlCleaner/1http://localhost:8001/urlCleaner/2 时,Sentinel 会将它们识别为同一资源 /urlCleaner/*
  2. 在 Sentinel Dashboard 中,只需为 /urlCleaner/* 配置一次限流规则,就会对所有 urlCleaner 开头的动态参数 URL 生效。
  3. 若不配置 UrlCleaner,则会生成两个资源 /urlCleaner/1/urlCleaner/2,需要分别配置规则(显然不合理)。
总结
  • 作用:将结构相同但参数不同的 URL 标准化为同一资源,实现统一的规则管控。
  • 核心场景:处理含动态参数的 URL(如 /path/{id}),避免资源重复识别,简化规则配置。
  • 优势:减少资源数量,降低管理成本,确保规则对同类接口批量生效。

自定义URL级限流/熔断全局处理器

package com.muse.sentinel.handler;import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;/*** 自定义URL级限流/熔断全局处理器* 实现Sentinel的UrlBlockHandler接口,用于统一处理URL资源被限流时的响应*/
@Service // 让Spring容器管理该类,使其生效
public class MuseBlockHandler implements UrlBlockHandler {@Overridepublic void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,BlockException e) throws IOException {// 设置响应格式为JSON,编码为UTF-8httpServletResponse.setHeader("Content-Type", "application/json;charset=UTF-8");// 自定义限流响应内容String message = "{\n"+ "\t\"code\":\"400\",\n"+ "\t\"message\":\"请求已被限流!\"\n"+ "}";// 将响应写入输出流httpServletResponse.getWriter().write(message);}
}
一、核心作用

MuseBlockHandler 实现了 Sentinel 提供的 UrlBlockHandler 接口,主要作用是:
统一处理所有通过 URL 访问的资源被限流/熔断时的异常响应。

当客户端访问的 URL 触发了 Sentinel 的限流、熔断等规则时,Sentinel 会拦截请求并调用该类的 blocked 方法,返回自定义的响应结果(而非默认的错误页面或异常信息)。

例如代码中定义了 JSON 格式的响应:

{"code":"400","message":"请求已被限流!"
}

这样前端可以更友好地处理限流场景(如显示“当前请求过频,请稍后再试”)。

二、应用场景

该处理器主要用于 URL 级别的资源保护,即未通过 <font style="color:#DF2A3F;">@SentinelResource</font> 注解标记的接口(或直接通过 URL 匹配的资源)。

具体应用场景对比:

  1. @SentinelResourceblockHandler 区别
    • @SentinelResource(blockHandler = "...")局部处理,仅针对被注解标记的资源生效(如之前的 foo1 资源)。
    • UrlBlockHandler全局处理,对所有通过 URL 访问的资源生效(无需注解标记)。
  2. 典型使用场景
    当项目中需要对大量接口进行统一限流处理(如所有 /api/* 路径),且不想为每个接口单独定义 blockHandler 时,可通过 UrlBlockHandler 实现全局统一响应。
三、生效条件(如何让它起作用)

要使 MuseBlockHandler 生效,需要满足:

  1. 项目中引入了 Sentinel 的 Servlet 适配器依赖(通常包含在 spring-cloud-starter-alibaba-sentinel 中):
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId>
</dependency>
  1. 该类被 Spring 容器扫描并管理(通过 @Service 注解已满足)。
  2. 触发 URL 级别的限流规则:
    • 在 Sentinel Dashboard 中为某个 URL 路径(如 /dashboard)配置限流规则。
    • 当访问该 URL 触发限流时,MuseBlockHandlerblocked 方法会被自动调用,返回自定义 JSON 响应。

:::color4
- 只要触发限流/熔断,没有被异常响应处理的,都会执行

:::

总结
  • 作用:全局统一处理 URL 资源被限流/熔断时的响应,返回自定义格式(如 JSON)。
  • 应用位置:对所有通过 URL 访问的接口生效,无需单独注解标记,适合全局统一异常处理场景。
  • 与局部 handler 对比:互补关系,局部 handler 优先级高于全局 handler(若接口同时配置了 @SentinelResource(blockHandler),则优先执行局部方法)。

网络模型

http://www.dtcms.com/a/390728.html

相关文章:

  • C++学习:哈希表unordered_set/unordered_map的封装
  • 圆柱永磁体磁场及梯度快速计算与可视化程序
  • 种群演化优化算法:原理与Python实现
  • 基于IPDRR模型能力,每个能力的概念及所要具备的能力产品
  • NUST技术漫谈:当非结构化数据遇见状态跟踪——一场静默的技术革命
  • 在技术无人区开路,OPPO的指南针是“人”
  • AI与NPC发展过程及技术
  • Redis数据库(三)—— 深入解析Redis三种高可用架构:主从复制、哨兵与集群模式
  • (leetcode) 力扣100 13最大子序和(动态规划卡达内算法分治法)
  • SpringBoot整合JUnit:单元测试从入门到精通
  • MySQL三范式详细解析
  • GitHub 仓库权限更改
  • 卷积神经网络(CNN)核心知识点总结
  • Python数据挖掘之基础分类模型_朴素贝叶斯
  • 数字工业化的终极形态:人、机器与算法的三重奏
  • [x-cmd] 在 Linux 与 MacOS 安装与使用 x-cmd
  • wkhtmltopdf 命令参数及作用大全
  • Windows路径转换成Cygwin中的Unix路径的方法
  • JavaWeb之Web资源与Servlet详解
  • [视图功能8] 图表视图:柱状图、折线图与饼图配置实战
  • TDengine IDMP 基本功能——数据可视化(5. 表格)
  • ViTables 安装与 HDF5 数据可视化全指南
  • Python爬虫实战:研究Pandas,构建最新网游数据采集与智能推荐系统
  • 在.NET中实现RabbitMQ客户端的优雅生命周期管理及二次封装
  • .NET自定义数据操作日志
  • 从“连不上网”到“玩转路由”:路由器配置与静态路由实战(小白也能轻松掌握)
  • R语言 生物信息如何解读geo数据集的说明,如何知道样本分类, MDA PCa 79(n = 3)n的含义
  • 你的第一个Node.js应用:Hello World
  • 【LVS入门宝典】LVS核心原理与实战:Real Server(后端服务器)高可用配置指南
  • TPAMI 25 ICML 25 Oral | 顶刊顶会双认证!SparseTSF以稀疏性革新长期时序预测!