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

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级

  • 【一】基本介绍
    • 【1】什么是熔断和降级
    • 【2】为什么使用熔断和降级
    • 【3】Sentinel熔断和降级
    • 【4】核心概念
  • 【二】下载方式
    • 【1】Windows平台安装包下载
    • 【2】打开控制台
  • 【三】使用案例
    • 【1】添加依赖
    • 【2】添加Sentinel配置
    • 【3】添加TestUserController.java,模拟接口返回用户信息。
    • 【4】启动服务
  • 【四】定义资源
    • 【1】代码定义
    • 【2】属性说明
  • 【五】流量规则
    • 【1】控制台定义
    • 【2】代码定义
    • 【3】属性说明
  • 【五】降级规则
    • 【1】控制台定义
    • 【2】代码定义
    • 【3】属性说明
  • 【五】动态配置规则
    • 【1】文件配置规则
    • 【2】Nacos配置规则
  • 【六】RestTemplate 支持
  • 【七】RestTemplate 支持
    • 【1】添加依赖
    • 【2】feign开启sentinel支持
    • 【3】测试用户服务类RemoteUserService.java
    • 【4】降级用户服务类处理RemoteUserFallbackFactory.java
    • 【5】启动类扫描配置

【一】基本介绍

【1】什么是熔断和降级

服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、宕机、数据库挂了、缓存挂了、消息系统挂了…对于一些非核心服务,如果出现大量的异常,可以通过技术手段,对服务进行降级并提供有损服务,保证服务的柔性可用,避免引起雪崩效应。

(1)服务熔断
一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施。

(2)服务降级
是在服务器压力陡增的情况下,利用有限资源,根据当前业务情况,关闭某些服务接口或者页面,以此释放服务器资源以保证核心任务的正常运行。

【2】为什么使用熔断和降级

在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,需要保证在一个依赖出问题的情况下,不会导致整体服务失败。

【3】Sentinel熔断和降级

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

sentinel具有以下特征:
(1)丰富的应用场景
Sentinel承接了阿里巴巴近十年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围),消息削峰填谷,集群流量控制,实时熔断下游不可用应用等

(2)完美的实时监控
Sentinel同时提供实时的监控功能,您可以在控制台看到接入应用的单台机器秒级数据,甚至500台一下规模的集群的汇总运行情况

(3)广泛的开源生态
Sentinel提供开箱即用的与其他框架/库的整合模块,例如与SpringCloud,Dubbo,gRPC的整合,您只需要引入响应的依赖并进行简单的配置即可快速接入Sentinel

(4)完美的SPI扩展点
Sentinel提供简单易用的,完美的SPI扩展接口,可以通过实现扩展接口来快速定制逻辑,例如定制规则管理,适配动态数据源等

【4】核心概念

(1)核心库
不依赖任何框架/库,能够允许在jdk7以上的版本运行时环境,同时对Dubbo、SpringCloud等框架也有比较好的支持。

(2)控制台
主要负责管理推送规则、监控、集群限流分配管理、机器发现等。

【二】下载方式

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

【1】Windows平台安装包下载

可以从https://github.com/alibaba/Sentinel/releases下载sentinel-dashboard-$version.jar包。

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

java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar D:\sentinel\sentinel-dashboard-1.8.0.jar

其中-Dserver.port=8718用于指定Sentinel控制台端口为8718,F:\software\sentinel\sentinel-dashboard-1.8.0.jar为下载的包路径地址。

如果觉得官网下载慢,可以使用我分享的网盘地址: https://pan.baidu.com/s/1E9J52g6uW_VFWY34fHL6zA 提取码: vneh

【2】打开控制台

Sentinel提供了一个可视化的操作平台,安装好之后,在浏览器中输入(http://localhost:8718 (opens new window))就可以访问了,默认的用户名和密码都是sentinel(我使用的是1.8.0版本)
在这里插入图片描述

【三】使用案例

【1】添加依赖

<!-- springcloud alibaba sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><!-- SpringBoot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

【2】添加Sentinel配置

spring: application:# 应用名称name: ruoyi-xxxx cloud:sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8718

【3】添加TestUserController.java,模拟接口返回用户信息。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestUserController
{@GetMapping("/user/info")public Object info(){return "{\"username\":\"admin\",\"password\":\"admin123\"}";}
}

【4】启动服务

查看Sentinel控制台的请求数据

【四】定义资源

资源是Sentinel中的核心概念之一。我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。最常用的资源是我们代码中的Java方法。Sentinel提供了@SentinelResource注解用于定义资源,并提供了AspectJ的扩展用于自动定义资源、处理BlockException等。

【1】代码定义

@SentinelResource用于定义资源,并提供可选的异常处理和fallback配置项。

接口定义IUserService.java

/*** 用户接口* * @author ruoyi*/
public interface IUserService
{public Object selectUserByName(String username);
}

接口实现IUserServiceImpl.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;/*** 用户实现* * @author ruoyi*/
@Service
public class IUserServiceImpl implements IUserService
{@Autowiredprivate RestTemplate restTemplate;@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}@SentinelResource(value = "selectUserByName", blockHandler = "selectUserByNameBlockHandler", fallback = "selectUserByNameFallback")@Overridepublic Object selectUserByName(String username){return restTemplate.getForObject("http://localhost:9201/user/info/" + username, String.class);}// 服务流量控制处理,参数最后多一个 BlockException,其余与原函数一致。public Object selectUserByNameBlockHandler(String username, BlockException ex){System.out.println("selectUserByNameBlockHandler异常信息:" + ex.getMessage());return "{\"code\":\"500\",\"msg\": \"" + username + "服务流量控制处理\"}";}// 服务熔断降级处理,函数签名与原函数一致或加一个 Throwable 类型的参数public Object selectUserByNameFallback(String username, Throwable throwable){System.out.println("selectUserByNameFallback异常信息:" + throwable.getMessage());return "{\"code\":\"500\",\"msg\": \"" + username + "服务熔断降级处理\"}";}}

测试接口请求TestUserController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestUserController
{@Autowiredprivate IUserService userService;@GetMapping("/info/{username}")public Object info(@PathVariable("username") String username){return userService.selectUserByName(username);}
}

【2】属性说明

@SentinelResource注解包含以下属性:

value:资源名称,必需项(不能为空)
entryType:资源调用方向,可选项(默认为EntryType.OUT)
resourceType:资源的分类
blockHandler:对应处理BlockException的函数名称
blockHandlerClass:处理类的Class对象,函数必需为static函数
fallback:用于在抛出异常的时候提供fallback处理逻辑
defaultFallback:用作默认的回退的方法
fallbackClass:异常类的Class对象,函数必需为static函数
exceptionsToTrace:异常类跟踪列表(默认为Throwable.class)
exceptionsToIgnore:排除掉的异常类型

注意:注解方式埋点不支持 private 方法。

【五】流量规则

【1】控制台定义

选择流控规则,新增流控规则,填入对应信息
在这里插入图片描述

(1)资源名: 唯一名称,默认请求路径
(2)针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
(3)阈值类型/单机阈值:
1-QPS(每秒请求数量):当调用该api的QPS达到阈值的时候,进行限流
2-线程数:当调用该api的线程数达到阈值的时候,进行限流
(4)是否集群: 不需要集群
(5)流控模式:
1-直接:api达到限流条件时,直接限流
2-关联:当关联的资源达到限流阈值时,就限流自己
3-链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到峰值,就进行限流)【api级别的针对来源】
(6)流控效果:
1-快速失败:直接失败,抛异常
2-Warm Up:根据coldFactor(冷加载因子,默认3)的值,从阈值/coldFactor,经过预热时长,才达到设置的QPS阈值
3-排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效

【2】代码定义

理解上面规则的定义之后,我们可以通过调用FlowRuleManager.loadRules()方法来用硬编码的方式定义流量控制规则,比如:

private void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule(resourceName);// set limit qps to 20rule.setCount(20);rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setLimitApp("default");rules.add(rule);FlowRuleManager.loadRules(rules);
}

【3】属性说明

流量控制规则(FlowRule)重要属性

resource:资源名,资源名是限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源 default,代表不区分调用来源
grade:限流阈值类型,QPS 模式(1)或并发线程数模式(0) QPS 模式
count:限流阈值
strategy:调用关系限流策略:直接、链路、关联 根据资源本身(直接)
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队) 直接拒绝
clusterMode:是否集群限流 否

同一个资源可以同时有多个限流规则,检查规则时会依次检查。

从1.6.3版本开始,Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效。1.7.0版本开始(对应SCA 2.1.1.RELEASE),我们在CommonFilter引入了WEB_CONTEXT_UNIFY这个init parameter,用于控制是否收敛context。将其配置为false即可根据不同的URL进行链路限流。 参考:https://github.com/alibaba/sentinel/issues/1213

【五】降级规则

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

【1】控制台定义

选择降级规则,新增降级规则,填入对应信息。

在这里插入图片描述

【2】代码定义

private void initDegradeRule() {List<DegradeRule> rules = new ArrayList<>();DegradeRule rule = new DegradeRule();rule.setResource(KEY);// set threshold RT, 10 msrule.setCount(10);rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);rule.setTimeWindow(10);rules.add(rule);DegradeRuleManager.loadRules(rules);
}

【3】属性说明

熔断降级规则(DegradeRule)重要属性

resource:资源名,即规则的作用对象
grade:熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
count:慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow:熔断时长,单位为 s
minRequestAmount:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5
statIntervalMs:统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms
slowRatioThreshold:慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

同一个资源可以同时有多个降级规则。

【五】动态配置规则

上面的规则配置,都是存在内存中的。即如果应用重启,这个规则就会失效,可以整合动态配置系统,如ZooKeeper、Nacos、Apollo等,动态地实时刷新配置规则。

【1】文件配置规则

Sentinel支持通过本地文件加载规则配置,使用方式如下(限流规则作为演示)

spring:cloud:sentinel:datasource:ds1:file:file: classpath:flowRule.jsondata-type: jsonrule-type: flow

flowRule.json对应com.alibaba.csp.sentinel.slots.block.flow.FlowRule各属性。

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

【2】Nacos配置规则

当sentinel重新启动时,sentinel dashboard中原来的数据将会全部消失,这样就需要重新定义限流规则,无疑是不可取的。所以需要将sentinel中定义的限流规则保存到配置中心里面。

具体的实现方法如下:
(1)在nacos中定义自定义限流策略sentinel-ruoyi-xxxx

[{"resource": "selectUserByName","count": 2,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]

(2)添加依赖

<!-- springcloud alibaba nacos config -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- sentinel datasource nacos -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

(3)添加相关配置,sentinel下面的dataSource中配置nacos

spring: application:# 应用名称name: ruoyi-xxxx cloud:nacos:config:# 配置中心地址server-addr: 127.0.0.1:8848# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8718# nacos配置持久化datasource:ds1:nacos:server-addr: 127.0.0.1:8848dataId: sentinel-ruoyi-gatewaygroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow

(4)启动sentinel应用,可以看到我们在nacos中配置的限流规则

【六】RestTemplate 支持

Spring Cloud Alibaba Sentinel支持对RestTemplate调用的服务进行服务保护。需要在构造RestTemplate Bean时添加@SentinelRestTemplate注解。

RestTemplate添加@SentinelRestTemplate注解保护支持。

@Bean
@SentinelRestTemplate(blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class, fallback = "fallback", fallbackClass = ExceptionUtil.class)
public RestTemplate restTemplate() {return new RestTemplate();
}

服务熔断处理类ExceptionUtil.java,必须使用静态方法。

import com.alibaba.cloud.sentinel.rest.SentinelClientHttpResponse;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpResponse;public class ExceptionUtil
{// 服务流量控制处理public static ClientHttpResponse handleException(HttpRequest request, byte[] body,ClientHttpRequestExecution execution, BlockException exception){exception.printStackTrace();return new SentinelClientHttpResponse("{\"code\":\"500\",\"msg\": \"服务流量控制处理\"}");}// 服务熔断降级处理public static ClientHttpResponse fallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution,BlockException exception){exception.printStackTrace();return new SentinelClientHttpResponse("{\"code\":\"500\",\"msg\": \"服务熔断降级处理\"}");}
}

【七】RestTemplate 支持

其实不管是Hystrix还是Sentinel对于Feign的支持,核心代码基本上是一致的,只需要修改依赖和配置文件即可。

【1】添加依赖

<!-- SpringCloud Alibaba Nacos -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><!-- spring cloud openfeign 依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

【2】feign开启sentinel支持

spring: cloud:nacos:discovery:# 服务注册地址server-addr: 127.0.0.1:8848feign:sentinel:enabled: true

【3】测试用户服务类RemoteUserService.java

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;/*** 用户服务* * @author ruoyi*/
@FeignClient(contextId = "remoteUserService", value = "ruoyi-system", fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{/*** 通过用户名查询用户信息** @param username 用户名* @return 结果*/@GetMapping(value = "/user/info/{username}")public Object getUserInfo(@PathVariable("username") String username);
}

【4】降级用户服务类处理RemoteUserFallbackFactory.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import feign.hystrix.FallbackFactory;/*** 用户服务降级处理* * @author ruoyi*/
@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);@Overridepublic RemoteUserService create(Throwable throwable){log.error("用户服务调用失败:{}", throwable.getMessage());return new RemoteUserService(){@Overridepublic Object getUserInfo(String username){return "{\"code\":\"500\",\"msg\": \"用户服务熔断降级处理\"}";}};}
}

【5】启动类扫描配置

@EnableFeignClients(basePackages = "com.ruoyi")

创建的类需要在resources\META-INF下的spring.factories配置加载自动装配类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\.....com.ruoyi.system.api.factory.RemoteUserFallbackFactory

相关文章:

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级 【一】基本介绍【1】什么是熔断和降级【2】为什么使用熔断和降级【3】Sentinel熔断和降级【4】核心概念 【二】下载方式【1】Windows平台安装包下载【2】打开控制台 【三】使用案例【1】添加依赖【2】添加Sentinel配置【3】添加TestUserCont…...

javascript实战开发:json数据求指定元素的和算法

项目需求 在js中&#xff0c;格式如&#xff1a; [{"name": "一(0)班-电量,一(9)班-电流,一(9)班-功率","odata": {"prev_0_day_val_diff": "10.189941,-3.0,79.0",} },{"name": "一(10)班-电量,一(10)班-…...

娱乐时间 —— 用python将图片转为excel十字绘

最近看蛮多朋友在玩&#xff0c;要么只能画比较简单的&#xff0c;要么非常花时间。想了下本质上就是把excel对应的单元格涂色&#xff0c;如果能知道哪些格子要上什么颜色&#xff0c;用编程来实现图片转为excel十字绘应该是很方便的。 图片的每一个像素点都可以数值化&#x…...

OJ练习第160题——LRU 缓存

LRU 缓存 力扣链接&#xff1a;146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓…...

使用 Hugging Face Transformer 创建 BERT 嵌入

介绍 最初是为了将文本从一种语言更改为另一种语言而创建的。BERT 极大地影响了我们学习和使用人类语言的方式。它改进了原始 Transformer 模型中理解文本的部分。创建 BERT 嵌入尤其擅长抓取具有复杂含义的句子。它通过检查整个句子并理解单词如何连接来做到这一点。Hugging F…...

unity 控制Dropdown的Arrow箭头变化

Dropdown打开下拉菜单会以“Template”为模板创建一个Dropdown List&#xff0c;在“Template”上添加一个脚本在Start()中执行下拉框打开时的操作&#xff0c;在OnDestroy()中执行下拉框收起时的操作即可。 效果代码如下用于控制Arrow旋转可以根据自己的想法进行修改&#xff…...

Java开发面试--nacos专区

1、 Nacos是什么&#xff1f; 请简要介绍Nacos是什么以及它的主要功能和用途。 答&#xff1a; 简介&#xff1a; Nacos是一个开源的、高性能、动态服务发现、配置和服务管理平台&#xff0c;通常用于微服务架构中。Nacos的名称来源于"Naming"&#xff08;服务发现…...

GB28181学习(三)——心跳保活

心跳保活 要求&#xff1a; 1. 当原设备发现工作异常时&#xff0c;应立即向本SIP监控域的SIP服务器发送状态信息&#xff1b; 2. 无异常时&#xff0c;定时向本SIP监控域的SIP服务器发送状态信息&#xff1b; 3. 状态信息报送采用**MESSGAE**方法&#xff1b; 4. SIP设备宜在…...

黑马JVM总结(三)

&#xff08;1&#xff09;栈内存溢出 方法的递归调用&#xff0c;没有设置正确的结束条件&#xff0c;栈会有用完的一天&#xff0c;导致栈内存溢出 可以修改栈的大小&#xff1a; 再次运行&#xff1a;减少了次数 案例二&#xff1a; 两个类的循环应用问题&#xff0c;导致Js…...

【数据结构】二叉树基础入门

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

MFC自定义消息的实现方法----(线程向主对话框发送消息)、MFC不能用UpdateData的解决方法

在MFC中&#xff0c;我们一边在使用多线程时&#xff0c;经常会遇到在需要调用到新建的控件&#xff0c;此时建议不要在新建的线程中直接调用主对话框的控件&#xff0c;我们可以通过自定义消息&#xff0c;在新建线程中发送并触发主线程进行相关的界面控件操作。 以Dialog对话…...

Linux单列模式实现线程池

目录 一、单列模式 1.1 单列模式概念以及实现条件 1.2 饿汉模式 1.1.1 饿汉模式代码实现 1.1.2 饿汉模式特征和优缺点 1.3 懒汉模式 1.3.1 懒汉模式代码实现 1.3.2 懒汉模式特征以及优缺点 二、线程池 2.1 线程池概念 2.2 实现简单线程池逻辑 2.3 模拟实现懒汉模式线程…...

汇川PLC学习Day3:轴控代码编写、用户程序结构说明与任务配置示例、用户变量空间与编址

汇川PLC学习Day3&#xff1a;轴控代码编写、用户程序结构说明与任务配置示例、用户变量空间与编址 一、新建轴与轴控代码编写 1. 新建轴 (1)新建一个轴 &#xff08;2&#xff09;将轴名字更新为实际名字 可以后面实例化后再更改&#xff0c;汇川可以在更新名字时同步更新…...

javaee springMVC Map ModelMap ModelAndView el和jstl的使用

pom依赖 <?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 …...

vue监听表单输入的身份证号自动填充性别和生日

1&#xff0c;先给表单绑定一个v-model值 <el-input type"number" v-model"form.idCard" placeholder"请输入证件号码" /> 2&#xff0c;使用watch监听输入的值 watch(form, (newName, oldName) > {var numid newName.idCard.split(…...

蓝桥杯官网练习题(翻硬币)

题目描述 小明正在玩一个"翻硬币"的游戏。 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;。 比如&#xff0c;可能情形是&#xff1a;**oo***oooo; 如果同时翻转左边的两个硬币…...

企业架构LNMP学习笔记34

LVS-DR模式&#xff1a; 老师分析&#xff1a; 1、首先用户用CIP请求VIP 2、根据上图可以看到&#xff0c;不管是Director Server还是Real Server上都需要配置VIP&#xff0c;那么当用户请求到达我们的集群网络的前端路由器的时候&#xff0c;请求数据包的源地址为CIP目标地址…...

Python学习之六 循环结构

在很多情况下,我们往往需要循环输入多次,比如,密码最多只能输错3次等。这时候,我们需要使用循环结构。本小节,将学习循环。 一、while循环 while循环的一般形式如下: while 判断条件: 循环语句块 当判断条件为真,便执行循环语句块。比如说,我们需要写一个判断账号…...

flutter 网络地址URL转file

方法1 import dart:io; import package:http/http.dart as http; import package:path/path.dart; import package:path_provider/path_provider.dart;Future<File> _fileFromImageUrl() async {final response await http.get(Uri.parse(https://example.com/xyz.jpg)…...

【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!

目录 前言一、简单说说应用分层二、实体层1.O/R映射2.O/R映射实践三、数据访问层1.DAO层2.DAO层实战总结前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白…...

Helm Kubernetes Offline Deploy Rancher v2.7.5 Demo (helm 离线部署 rancher 实践)

文章目录 1. 简介2. 预备条件3. 选择 SSL 配置4. 离线安装的 Helm Chart 选项5. 下载介质6. 生成证书7. 镜像入库8. 安装 rancher9. 配置 nodeport10. 配置 ingress11. 界面访问11.1 首页预览11.2 查看集群信息11.3 查看项目空间11.4 查看节点信息 1. 简介 Rancher 是一个开源…...

网络编程day6——基于C/S架构封装的线程池

一、线程竞争基本概念 竞争与同步 同一个进程中的线程共享进程中的绝大多数资源&#xff0c;当它们随意竞争时可能会导致资源被破坏、脏数据、不完整问题 通过一些手段让线程在竞争资源时相互协调、避免出现以上问题&#xff0c;这就称为线程同步 原子操作&#xff1a; 操作过程…...

ARM/X86工业级数据采集 (DAQ) 与控制产品解决方案

I/O设备&#xff0c;包括信号调理模块、嵌入式PCI/PCIE卡、便携式USB模块、DAQ嵌入式计算机、模块化DAQ系统&#xff0c;以及DAQNavi/SDK软件开发包和DAQNavi/MCM设备状态监测软件。 工业I/O产品适用于各种工业自动化应用&#xff0c;从机器自动化控制、测试测量到设备状态监测…...

【Java】Jxls--轻松生成 Excel

1、介绍 Jxls 是一个小型 Java 库&#xff0c;可以轻松生成 Excel 报告。Jxls 在 Excel 模板中使用特殊标记来定义输出格式和数据布局。 Java 有一些用于创建 Excel 文件的库&#xff0c;例如Apache POI。这些库都很好&#xff0c;但都是一些较底层的库&#xff0c;因为它们要…...

MySQL主从复制读写分离

读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 读写分离的好处 因为数据库的“写…...

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…...

【AIGC专题】Stable Diffusion 从入门到企业级实战0403

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第03节&#xff0c; 利用Stable Diffusion ControlNet Canny模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态…...

linux提权

目录 一、linux提权靶场下载与安装 二、基础提权 1.sudo提权 2.suid提权 3.taskset执行bash 三、内核提权 相关网站 https://gtfobins.github.io/#sudohttps://blog.csdn.net/weixin_43873557/article/details/113784146 一、linux提权靶场下载与安装 #下载链接 http…...

Excel VSTO开发7 -可视化界面开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 7 可视化界面开发 前面的代码都是基于插件启动或者退出时&#xff0c;以及Excel Application的相关事件&#xff0c;在用户实际操作…...

英文科技论文写作与发表-投稿到发表(第6章)

1 投稿到发表 本章介绍典型会议和期刊从投稿到最终录用或退稿的全过程&#xff0c;期刊从投稿到最终录用或退稿的过程在各种不同学科领域差别不大。会议主要针对计算机科学及其相关领域&#xff08;如电子、信息、其他工程类&#xff09;的会议。最后总结几条怎样提高论文命中…...

管理咨询公司项目运作流程图/宁波seo高级方法

问题&#xff1a;在SQL服务器上用sa账号登陆后执行SELECT * FROM OpenDataSource( Microsoft.Jet.OLEDB.4.0,Data Source"d:\a.xls";User IDAdmin;Password;Extended propertiesExcel 8.0)...[Sheet1$] 提示&#xff1a;链接服务器"(null)"的 OLE DB 访问接…...

scf900色带/南宁百度seo排名公司

在百度控制台发布自定义样式并复制样式ID 添加 setMapStyleV2 功能 map.setMapStyleV2({styleId:76c03cdd35fa1e24f39edeb18849f04e}) 完整代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><script type"text/javascript&…...

网站地市频道建设/怎么在网上做广告

题目链接 本来以为自己可以做出来&#xff0c;结果……打脸了 &#xff08;貌似来wc立了好几个flag了&#xff0c;都没竖起来&#xff09; 不过乱蒙能蒙出一个叫“分数规划”的东西的式子还是很开心的 观察$C\frac{a_{1}a_{2}.......a_{n}}{b_{1}b_{2}.....b_{n}}$ 然后可以把分…...

wordpress与dede哪个好用/网络营销案例题

通过DevExpress WPF Controls&#xff0c;你能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件的衍伸产品&#xff0c;还是以数据为中心的商业智能产品&#xff0c;都能通过De…...

wordpress怎么上传文件/nba最新排行

模板介绍 工作报告动态PPT模板。一套工作汇报幻灯片模板&#xff0c;内含蓝色多种配色&#xff0c;简约风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 希望下面这份精美的PPT模板能给你带来帮助&#xff0c;温馨提示&#xff1a;本资源使用PPT或PPTX等格式&#x…...

宁德网站建设/今天有哪些新闻

0 前言 本文参考 《控制系统仿真与计算机辅助设计 第2版》薛定宇 机械工业出版社《MATLAB for Control Engineers》Katsuhiko Ogata现代控制理论线性系统入门(一)状态方程描述下的动态系统《现代控制理论基础》— 2 什么是状态与状态空间 本文已假设读者具有自动控制原理的…...