Sentinel原理与SpringBoot整合实战
前言
随着微服务架构的广泛应用,服务和服务之间的稳定性变得越来越重要。在高并发场景下,如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件,提供了从流量控制、熔断降级、系统负载保护等多个维度来保障服务稳定性的解决方案。
本文将详细介绍Sentinel的核心原理和基本功能点,并提供一个完整的SpringBoot整合Sentinel的案例,帮助读者快速掌握Sentinel的使用方法。
一、Sentinel简介
1.1 什么是Sentinel
Sentinel是阿里巴巴开源的,面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障服务的稳定性。
Sentinel的主要特性包括:
- 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel同时提供实时的监控功能。用户可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Apache Dubbo、gRPC、Quarkus的整合。用户只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。同时Sentinel提供Java/Go/C++等多语言的原生实现。
- 完善的SPI扩展机制:Sentinel提供简单易用、完善的SPI扩展接口。用户可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
1.2 Sentinel与其他熔断降级工具的对比
相比于其他熔断降级工具(如Hystrix),Sentinel具有以下优势:
- 丰富的流量控制:Sentinel提供了更丰富的流量控制策略,包括基于调用关系的流量控制、热点参数限流等。
- 实时监控:Sentinel提供了实时的监控功能,可以实时查看接入应用的运行情况。
- 轻量级设计:Sentinel采用轻量级设计,不依赖任何框架/库,能够运行于所有Java运行时环境。
- 多语言支持:Sentinel提供了Java/Go/C++等多语言的原生实现。
- 完善的SPI扩展机制:Sentinel提供了完善的SPI扩展接口,用户可以通过实现扩展接口来快速地定制逻辑。
二、Sentinel核心原理
2.1 基本工作原理
Sentinel的核心工作原理可以概括为:
-
资源定义:资源是Sentinel的核心概念,它可以是Java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过Sentinel API定义的代码,就是资源。
-
规则配置:Sentinel通过规则来指定资源的访问控制策略。规则包括流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和热点参数规则等。
-
统计与判断:Sentinel会实时统计资源的调用数据,并根据预设的规则进行判断,若超出阈值,则采取相应的流量控制措施。
2.2 Sentinel的执行流程
Sentinel的执行流程主要分为以下几个步骤:
- 资源埋点:通过
SphU.entry(resourceName)
和entry.exit()
方法对资源进行埋点。 - 规则判断:当资源被访问时,Sentinel会根据预设的规则进行判断。
- 流量控制:如果触发了规则条件,Sentinel会执行相应的流量控制措施,例如直接拒绝、排队等待或预热模式。
- 熔断降级:对于响应时间过长或异常比例过高的服务,Sentinel会进行熔断降级处理。
- 系统自适应保护:当系统负载过高时,Sentinel会自动进行系统保护。
2.3 Sentinel的核心组件
Sentinel的核心组件主要包括:
- Sentinel核心库:不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。
- Sentinel控制台:基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
三、Sentinel基本功能点
3.1 流量控制
流量控制(flow control)是Sentinel最核心的功能之一,其原理是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
流量控制主要有以下几个维度:
-
基于QPS/并发数的流量控制:
- 并发数控制:用于保护业务线程池不被慢调用耗尽。
- QPS控制:当QPS超过某个阈值的时候,采取措施进行流量控制。
-
流量控制效果:
- 直接拒绝:默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝。
- Warm Up:预热/冷启动方式,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限。
- 匀速排队:严格控制请求通过的间隔时间,让请求以均匀的速度通过,对应的是漏桶算法。
-
基于调用关系的流量控制:
- 根据调用方来源进行流量控制。
- 支持针对不同的调用方设置不同的流控策略。
3.2 熔断降级
熔断降级(circuit breaking)是Sentinel的另一个重要功能,它用于当调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
熔断降级主要有以下几个维度:
- 慢调用比例:当资源的响应时间超过阈值(慢调用)的比例超过设定的比例阈值时,触发熔断。
- 异常比例/异常数:当资源的异常比例或异常数超过阈值时,触发熔断。
- 恢复策略:熔断触发后,经过一段时间(即熔断超时时间),熔断器会进入探测恢复状态,若接下来的一个请求处理成功,则结束熔断,否则继续熔断。
3.3 热点参数限流
热点参数限流是一种更细粒度的流量控制,它允许用户针对某个热点参数进行限流,例如针对某个用户ID限流。
热点参数限流的特点:
- 可以针对某个参数的特定值单独设置限流阈值。
- 支持多种参数类型,包括基本类型和字符串类型。
- 可以设置参数例外项,对特定的参数值进行不同的限流处理。
3.4 系统自适应限流
系统自适应限流从整体维度对应用入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统规则包含以下几个重要的参数:
- Load:当系统load1超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。
- CPU使用率:当系统CPU使用率超过阈值即触发系统保护。
- 平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。
3.5 黑白名单控制
黑白名单控制根据资源的请求来源(origin)限制资源是否通过:
- 白名单:来源(origin)在白名单内的请求才可通过。
- 黑名单:来源(origin)在黑名单内的请求不允许通过。
3.6 实时监控
Sentinel提供实时的监控功能,用户可以实时查看接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。监控数据包括:
- 通过的请求数(pass):一秒内到来到的请求。
- 被阻止的请求数(blocked):一秒内被流量控制的请求数量。
- 成功处理的请求数(success):一秒内成功处理完的请求。
- 总请求数(total):一秒内到来的请求以及被阻止的请求总和。
- 平均响应时间(RT):一秒内该资源的平均响应时间。
- 异常数(exception):一秒内业务本身异常的总和。
3.7 动态规则配置
Sentinel支持多种动态规则源,包括:
- 文件配置:规则存储在文件中,定期轮询文件获取规则。
- Nacos配置中心:规则存储在Nacos配置中心,通过监听配置变更事件即时获取规则。
- ZooKeeper:规则存储在ZooKeeper中,通过监听节点变更事件即时获取规则。
- Apollo配置中心:规则存储在Apollo配置中心,通过监听配置变更事件即时获取规则。
- Redis:规则存储在Redis中,通过定期轮询获取规则。
四、SpringBoot整合Sentinel完整案例
下面我们将通过一个完整的案例,演示如何在SpringBoot项目中整合Sentinel。
4.1 项目结构
springcloud-sentinel
├── src
│ └── main
│ ├── java
│ │ └── com.example
│ │ ├── config
│ │ │ └── SentinelConfig.java
│ │ ├── controller
│ │ │ └── TestSentinelController.java
│ │ ├── service
│ │ │ └── HelloService.java
│ │ └── SentinelApplication.java
│ └── resources
│ └── application.properties
└── pom.xml
4.2 Maven依赖配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>springboot-sentinel-demo</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.8</java.version><spring-boot.version>2.6.3</spring-boot.version><spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><!-- Spring Boot 依赖管理 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 依赖管理 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Sentinel 依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
4.3 应用配置文件
# application.properties
spring.application.name=sentinel-demo
server.port=8080# Sentinel 控制台地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
# 取消Sentinel控制台懒加载
spring.cloud.sentinel.eager=true
# 设置应用与Sentinel控制台的心跳间隔时间
spring.cloud.sentinel.transport.heartbeat-interval-ms=3000
4.4 Sentinel配置类
package com.example.config;import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Sentinel配置类* 注册SentinelResourceAspect,用于支持@SentinelResource注解*/
@Configuration
public class SentinelConfig {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
}
4.5 服务类
package com.example.service;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;/*** 业务服务类* 使用@SentinelResource注解定义资源点*/
@Service
public class HelloService {/*** 定义一个资源点,指定blockHandler处理限流异常* @param name 参数* @return 返回结果*/@SentinelResource(value = "sayHello", blockHandler = "sayHelloExceptionHandler")public String sayHello(String name) {return "Hello, " + name;}/*** 定义一个资源点,同时指定blockHandler和fallback* blockHandler: 处理限流异常* fallback: 处理业务异常* @param name 参数* @return 返回结果*/@SentinelResource(value = "circuitBreaker", fallback = "circuitBreakerFallback", blockHandler = "sayHelloExceptionHandler")public String circuitBreaker(String name) {// 模拟业务逻辑,当name为"test"时抛出异常if ("test".equals(name)) {return "Hello, " + name;}throw new RuntimeException("发生异常");}/*** 熔断降级处理方法,处理业务异常* @param name 参数* @return 降级返回结果*/public String circuitBreakerFallback(String name) {return "服务异常,熔断降级,请稍后重试!";}/*** 限流降级处理方法,处理限流异常* @param name 参数* @param ex 限流异常* @return 限流返回结果*/public String sayHelloExceptionHandler(String name, BlockException ex) {return "访问过快,限流降级,请稍后重试!";}
}
4.6 控制器类
package com.example.controller;import com.example.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 测试Sentinel的控制器*/
@RestController
@RequestMapping("/sentinel")
public class TestSentinelController {@Autowiredprivate HelloService helloService;/*** 测试限流功能* @param name 参数* @return 返回结果*/@GetMapping("/hello")public String hello(@RequestParam("name") String name) {return helloService.sayHello(name);}/*** 测试熔断功能* @param name 参数* @return 返回结果*/@GetMapping("/circuit")public String circuitBreaker(@RequestParam("name") String name) {return helloService.circuitBreaker(name);}
}
4.7 应用启动类
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Sentinel示例应用启动类*/
@SpringBootApplication
public class SentinelApplication {public static void main(String[] args) {SpringApplication.run(SentinelApplication.class, args);}
}
4.8 运行与测试
4.8.1 下载并启动Sentinel控制台
-
下载Sentinel控制台jar包:
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
-
启动Sentinel控制台:
java -Dserver.port=8080 -jar sentinel-dashboard-1.8.6.jar
-
访问Sentinel控制台:
http://localhost:8080
默认用户名和密码都是:sentinel
4.8.2 启动SpringBoot应用
-
启动应用:
mvn spring-boot:run
-
测试限流功能:
http://localhost:8080/sentinel/hello?name=world
-
测试熔断功能:
http://localhost:8080/sentinel/circuit?name=test
http://localhost:8080/sentinel/circuit?name=other
4.8.3 在Sentinel控制台配置规则
-
登录Sentinel控制台后,可以看到应用已经注册到控制台
-
配置流控规则:
- 点击"簇点链路",找到"sayHello"资源
- 点击"流控"按钮,设置QPS阈值为5
- 保存规则
-
配置熔断规则:
- 点击"簇点链路",找到"circuitBreaker"资源
- 点击"降级"按钮,设置异常比例阈值为0.5,时间窗口为10s
- 保存规则
-
测试规则效果:
- 快速刷新限流接口,当QPS超过5时,会触发限流
- 多次访问熔断接口并传入非"test"参数,当异常比例超过50%时,会触发熔断
4.9 高级配置
4.9.1 持久化规则配置
Sentinel支持多种数据源来持久化规则配置,以下是使用文件配置的示例:
# 配置Sentinel规则持久化到文件
spring.cloud.sentinel.datasource.ds1.file.file=classpath:sentinel/flow-rule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flowspring.cloud.sentinel.datasource.ds2.file.file=classpath:sentinel/degrade-rule.json
spring.cloud.sentinel.datasource.ds2.file.data-type=json
spring.cloud.sentinel.datasource.ds2.file.rule-type=degrade
4.9.2 Nacos配置中心持久化
# 配置Sentinel规则持久化到Nacos
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel-flow-rules
spring.cloud.sentinel.datasource.ds1.nacos.group-id=SENTINEL_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flowspring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel-degrade-rules
spring.cloud.sentinel.datasource.ds2.nacos.group-id=SENTINEL_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=degrade
4.9.3 自定义全局异常处理
package com.example.config;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;/*** 自定义Sentinel全局异常处理*/
@Configuration
public class SentinelBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {// 设置响应类型response.setStatus(429);response.setContentType(MediaType.APPLICATION_JSON_VALUE);response.setCharacterEncoding("UTF-8");Map<String, Object> result = new HashMap<>();result.put("code", 429);result.put("success", false);if (e instanceof FlowException) {result.put("message", "请求被限流了");} else if (e instanceof DegradeException) {result.put("message", "请求被降级了");} else if (e instanceof ParamFlowException) {result.put("message", "热点参数限流");} else if (e instanceof SystemBlockException) {result.put("message", "系统规则限制");} else if (e instanceof AuthorityException) {result.put("message", "授权规则不通过");} else {result.put("message", "未知限流降级");}// 返回JSON数据PrintWriter out = response.getWriter();out.write(new ObjectMapper().writeValueAsString(result));out.flush();out.close();}
}
五、总结
本文详细介绍了Sentinel的核心原理和基本功能点,包括流量控制、熔断降级、热点参数限流、系统自适应限流等,并提供了一个完整的SpringBoot整合Sentinel的案例。通过这个案例,读者可以快速掌握Sentinel的使用方法,并在实际项目中应用Sentinel来保障服务的稳定性和可用性。
Sentinel作为一个面向分布式服务架构的流量控制组件,在微服务架构中扮演着重要的角色。它不仅提供了丰富的流量控制策略,还提供了实时的监控功能,可以帮助开发者更好地了解服务的运行情况,及时发现和解决问题。
在实际应用中,我们可以根据业务需求,灵活配置Sentinel的各种规则,以达到最佳的保护效果。同时,Sentinel还提供了多种规则持久化的方式,可以方便地将规则存储到配置中心,实现规则的动态更新。
参考资料
- Sentinel 官方文档
- Sentinel 工作原理
- Sentinel 流量控制
- Spring Cloud Alibaba Sentinel
相关文章:
Sentinel原理与SpringBoot整合实战
前言 随着微服务架构的广泛应用,服务和服务之间的稳定性变得越来越重要。在高并发场景下,如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件,提供了从流量控制、熔断降级、…...
Python 训练营打卡 Day 31
文件的规范拆分和写法 把一个文件,拆分成多个具有着独立功能的文件,然后通过import的方式,来调用这些文件。这样具有几个好处: 可以让项目文件变得更加规范和清晰可以让项目文件更加容易维护,修改某一个功能的时候&a…...
vue+srpingboot实现多文件导出
项目场景: vuesrpingboot实现多文件导出 解决方案: 直接上干货 <el-button type"warning" icon"el-icon-download" size"mini" class"no-margin" click"exportSelectedFiles" :disabled"se…...
学习 Pinia 状态管理【Plan - May - Week 2】
一、定义 Store Store 由 defineStore() 定义,它的第一个参数要求独一无二的id import { defineStore } from piniaexport const useAlertsStore defineStore(alert, {// 配置 })最好使用以 use 开头且以 Store 结尾 (比如 useUserStore,useCartStore&a…...
linux中cpu内存浮动占用,C++文件占用cpu内存、定时任务不运行报错(root) PAM ERROR (Permission denied)
文章目录 说明部署文件准备脚本准备部署g++和编译脚本使用说明和测试脚本批量部署脚本说明执行测试定时任务不运行报错(root) PAM ERROR (Permission denied)报错说明处理方案说明 我前面已经弄了几个版本的cpu和内存占用脚本了,但因为都是固定值,所以现在重新弄个用C++编写的…...
数据湖和数据仓库的区别
在当今数据驱动的时代,企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案,各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势,帮助读者更好地…...
OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座
5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行,因为行程的原因未能现场参会,仍然通过视频直播观看了全部的演讲。总体来说,这届大会既有对未来数据库演进方向的展望,也有 OceanBase 新产品的发布&#…...
鸿蒙HarmonyOS最新的组件间通信的装饰器与状态组件详解
本文系统梳理了鸿蒙(HarmonyOS)ArkUI中组件间通信相关的装饰器及状态组件的使用方法,重点介绍V2新特性,适合开发者查阅与实践。 概述 鸿蒙系统(HarmonyOS)ArkUI提供了丰富的装饰器和状态组件,用…...
OneDrive登录,账号跳转问题
你的OneDrive登录无需密码且自动跳转到其他账号,可能是由于浏览器或系统缓存了登录信息,或存在多个账号的关联。以下是分步解决方案: 方案三对我有效。 强制手动输入密码 访问登录页面时: 在浏览器中打开 OneDrive网页版。 点击…...
9-码蹄集600题基础python篇
题目如上图所示。 这一题,没什么难度。 代码如下: def main():#code here# x,amap(int,input("").split(" "))# sum((1/2)*(a*x(ax)/(4*a)))# print(f"{sum:.2f}")x,amap(int,input().split())print(f"{((1/2)*(a*…...
CAU人工智能class3 优化器
优化算法框架 优化思路 随机梯度下降 随机梯度下降到缺点: SGD 每一次迭代计算 mini-batch 的梯度,然后对参数进行更新,每次迭代更新使用的梯度都只与本次迭代的样本有关。 因为每个批次的数据含有抽样误差,每次更新可能并不会 …...
学习 Android(十一)Service
简介 在 Android 中,Service 是一种无界面的组件,用于在后台执行长期运行或跨进程的任务,如播放音乐、网络下载或与远程服务通信 。Service 可分为“启动型(Started)”和“绑定型(Bound)”两大…...
SpringAI开发SSE传输协议的MCP Server
SpringAI 访问地址:Spring AI Spring AI是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来。 MCP…...
【泛微系统】后端开发Action常用方法
后端开发Action常用方法 代码实例经验分享:代码实例 经验分享: 本文分享了后端开发中处理工作流Action的常用方法,主要包含以下内容:1) 获取工作流基础信息,如流程ID、节点ID、表单ID等;2) 操作请求信息,包括请求紧急程度、操作类型、用户信息等;3) 表单数据处理,展示…...
如何成为更好的自己?
成为更好的自己是一个持续成长的过程,需要结合自我认知、目标规划和行动力。以下是一些具体建议,帮助你逐步提升: 1. 自我觉察:认识自己 反思与复盘:每天花10分钟记录当天的决策、情绪和行为,分析哪些做得…...
精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践
精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践 在创业的黏性阶段,如何将抽象的愿景转化为可落地的产品功能?如何在快速迭代中保持战略聚焦?今天,我们通过Rally软…...
网站制作公司哪家强?(2025最新版)
在数字化时代,一个优质的网站是企业展示自身实力、拓展业务渠道的重要工具。无论是初创企业还是大型集团,都需要一个功能强大、设计精美的网站来吸引客户、提升品牌形象。但面对市场上众多的网站制作公司,如何选择一家靠谱的合作伙伴呢&#…...
23种经典设计模式(GoF设计模式)
目录 🍀 创建型设计模式(5种) 1. 单例模式(Singleton) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 4. 建造者模式(Builder&am…...
深入解析Dify:从架构到应用的全面探索
文章目录 引言一、Dify基础架构1.1 架构概述1.2 前端界面1.3 后端服务1.4 数据库设计 二、Dify核心概念2.1 节点(Node)2.2 变量(Variable)2.3 工作流类型 三、代码示例3.1 蓝图注册3.2 节点运行逻辑3.3 工作流运行逻辑 四、应用场…...
电子电路:怎么理解放大电路中集电极电流Ic漂移?
如果放大电路中集电极电阻RC因为温度或老化而阻值变化,Vce Vcc - IcRc - IcRc,这会改变工作点,导致集电极的电流漂移。 IC漂移的定义:集电极电流随时间、温度等变化。影响IC的因素:β、IB、VBE、温度、电源电压、元件…...
【疑难杂症】Mysql 无报错 修改配置文件后服务启动不起来 已解决|设置远程连接
我修改配置后,服务无法启动可以试试用记事本打开后另存为,格式选择ANSI,然后重新启动mysql试试 设置运行远程、 1、配置my.ini文件 在[mysqld]下 添加bind-address0.0.0.0 2、设置root权限 使用MySql命令行执行, CREATE USER…...
Java基础 5.21
1.多态注意事项和细节讨论 多态的前提是:两个对象(类)存在继承关系 多态的向上转型 本质:父类的引用指向了子类的对象语法:父类类型 引用名 new 子类类型();特点:编译类型看左边,运行类型看…...
探索Puter:一个基于Web的轻量级“云操作系统”
在云计算与Web技术高度融合的今天,开发者们不断尝试将传统桌面体验迁移到浏览器中。近期,GitHub上一个名为Puter的开源项目吸引了社区的关注。本文将带你深入解析Puter的设计理念、技术架构与使用场景,探索它如何通过现代Web技术重构用户的“云端桌面”。 一、项目概览 Put…...
Java SpringBoot 项目中 Redis 存储 Session 具体实现步骤
目录 一、添加依赖二、配置 Redis三、配置 RedisTemplate四、创建控制器演示 Session 使用五、启动应用并测试六、总结 Java 在 Spring Boot 项目中使用 Redis 来存储 Session,能够实现 Session 的共享和高可用,特别适用于分布式系统环境。以下是具体的实…...
电商项目-商品微服务-规格参数管理,分类与品牌管理需求分析
本文章介绍:规格参数管理与分类与品牌管理的需求分析和表结构的设计。 一、规格参数管理 规格参数模板是用于管理规格参数的单元。规格是例如颜色、手机运行内存等信息,参数是例如系统:安卓(Android)后置摄像头像素&…...
Java 定时任务中Cron 表达式与固定频率调度的区别及使用场景
Java 定时任务:Cron 表达式与固定频率调度的区别及使用场景 一、核心概念对比 1. Cron 表达式调度 定义:基于日历时间点的调度,通过 秒 分 时 日 月 周 年 的格式定义复杂时间规则。时间基准:绝对时间点(如每天 12:…...
2025年- H39-Lc147 --394.字符串解码(双栈,递归)--Java版
1.题目描述 2.思路 可以用递归也可以用双栈,这边用栈。 首先先创建一个双栈,一个栈存数字(interger),另一个栈存字符(character)。设置数字临时变量num,设置字母临时变量curString在…...
学编程对数学成绩没帮助?
今天听到某机构直播说“学编程对数学成绩没帮助,如果想提高数学成绩那就单独去学数学”,实在忍不住要和各位家长聊聊我的思考,也欢迎各位家长评论。 恰在此时我看见了一道小学6年级的数学题如下,虽然题不难,但立刻让我…...
现代计算机图形学Games101入门笔记(十九)
光场 在近处画上图像,VR的效果。 任何时间任何位置看到的图像都不一样,是不是就是一个世界了。 光场就是任何一个位置往任何一个方向去的光的强度 知道光场就能知道这个物体长什么样子。 光线可以用一个点和一个方向确定。 也可以用2个点确定一条光线。 …...
STM32单片机GUI系统1 GUI基本内容
目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中,emWin、LVGL、TouchGFX 和 Qt 是…...
Prometheus+Grafana实现对服务的监控
PrometheusGrafana实现对服务的监控 前言:PrometheusGrafana实现监控会更加全面,监控的组件更多 Prometheus官网 https://prometheus.io/docs/prometheus/latest/getting_started/ Grafana官网 https://grafana.com/docs/ 一、安装PrometheusGrafana 这…...
hook原理和篡改猴编写hook脚本
hook原理: hook是常用于js反编译的技术;翻译就是钩子,他的原理就是劫持js的函数然后进行篡改 一段简单的js代码 :这个代码是顺序执行的 function test01(){console.log(test01)test02() } function test02(){console.log(02)tes…...
Sign签证绕过
Sign的简介 Sign是指一种类似于token的东西 他的出现主要是保证数据的完整性,防篡改 就是一般的逻辑是 sign的加密的值和你输入的数据是相连的(比如sign的加密是使用输入的数据的前2位数字配合SHA1 等这样的) 绕过 :碰运气可以…...
【Vue篇】重剑无锋:面经PC项目工程化实战面经全解
目录 引言 一、项目功能演示 1. 目标 2. 项目收获 二、项目创建目录初始化 vue-cli 建项目 三、ESlint代码规范及手动修复 1. JavaScript Standard Style 规范说明 2. 代码规范错误 3. 手动修正 四、通过eslint插件来实现自动修正 五、调整初始化目录结构 1. 删除…...
JVM参数详解与实战案例指南(AI)
JVM参数详解与实战案例指南 一、JVM参数概述与分类 JVM参数是控制Java虚拟机运行时行为的关键配置项,合理设置这些参数可以显著提升应用性能。根据功能和稳定性,JVM参数主要分为三类: 标准参数:所有JVM实现都必须支持ÿ…...
C++通过空间配置器实现简易String类
C实现简易String类 在C中,使用空间配置器(allocator)实现自定义string类需要管理内存分配、释放及对象构造/析构。 #include <memory> #include <algorithm> #include <cstring> #include <stdexcept> #include &l…...
MyBatis:简化数据库操作的持久层框架
1、什么是Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由 apachesoftwarefoundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。 2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框…...
Spring Boot集成Spring AI与Milvus实现智能问答系统
在Spring Boot中集成Spring AI与Milvus实现智能问答系统 引言 随着人工智能技术的快速发展,越来越多的企业开始探索如何将AI能力集成到现有系统中。本文将介绍如何在Spring Boot项目中集成Spring AI和向量数据库Milvus,构建一个高效的智能问答系统。 …...
软件工程(六):一致性哈希算法
哈希算法 定义 哈希算法是一种将任意长度的输入(如字符串、文件等)转换为固定长度输出的算法,这个输出称为“哈希值”或“摘要”。 常见的哈希算法 哈希算法哈希位数特点MD5128位快速,但已不安全SHA-1160位安全性提高…...
Linux内存分页管理详解
Linux内存分页管理详解:原理、实现与实际应用 目录 Linux内存分页管理详解:原理、实现与实际应用 一、引言 二、内存分页机制概述 1. 虚拟地址与物理地址的划分 2. 分页的基本原理 三、虚拟地址到物理地址的转换 1. 地址转换流程 2. 多级页表的遍历 四、多级页表的…...
work-platform阅读
Redis存储的是字节数据,所以任何对象想要存进redis,都要转化成字节。对象转化为字节流的过程,叫序列化,反之,叫反序列化 Redis 序列化详解及高性能实践-CSDN博客https://blog.csdn.net/zhangkunls/article/details/14…...
在 Excel xll 自动注册操作 中使用东方仙盟软件————仙盟创梦IDE
windows 命令 "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /X "C:\Path\To\仙盟.xll" excel 注册 Application.RegisterXLL "XLMAPI.XLL" 重点代码解析 excel 命令模式 [ExcelCommand(Description "使用参数")] …...
微调后的模型保存与加载
在Hugging Face Transformers库中,微调后的模型保存与加载方式因微调方法(如常规微调或参数高效微调)而异。 一、常规微调模型的保存与加载 1、 保存完整模型 使用 save_pretrained() 方法可将整个模型(包含权重、配置、分词器…...
PostgreSQL 日常维护
目录 一、基本使用 1、登录数据库 2、数据库操作 (1)列出库 (2)创建库 (3)删除库 (4)切换库 (5)查看库大小 3、数据表操作 (1ÿ…...
Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT=0x90的一个例子
Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT0x90的一个例子 1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) : 0xc431a400 [Type: _FILE_RECORD_SEGMENT_HEADER …...
leetcode hot100刷题日记——7.最大子数组和
class Solution { public:int maxSubArray(vector<int>& nums) {//方法一:动态规划//dp[i]表示以i下标结尾的数组的最大子数组和//那么在i0时,dp[0]nums[0]//之后要考虑的就是我们要不要把下一个数加进来,如果下一个数加进来会使结…...
LlamaIndex
1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…...
下一代电子电气架构(EEA)的关键技术
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
CSDN gitcode代码推送
当我使用用户名密码时一直无法推送,报下面这个错误 找了半天才知道, 他这个git不能用账号密码推送代码,idea弹出来的用户名,就是你头像旁边这个,没有符号 密码需要你创建一个令牌 这个令牌才是你要填写的密码&#x…...
中级统计师-统计学基础知识-第五章 相关分析
第一节 相关关系 1. 函数关系 vs 相关关系 函数关系 定义:变量间存在严格确定性的对应关系(如 y f ( x ) y f(x) yf(x))例子:本金 x x x 与利息收入 y x 0.027 x y x 0.027x yx0.027x特点:一一对应ÿ…...