【微服务最全详解】
文章目录
- 微服务
- 微服务的介绍
- 微服务服务架构演变
- 微服务网关
- 微服务的负载均衡
- 微服务的容灾机制
- 服务崩溃
- 服务容灾机制
- 微服务熔断机制
- 微服务限流
- Sentinel怎么实现限流
- 微服务限流算法
- 1.令牌桶算法
- 2.漏斗桶算法
- 服务监控
- 日志收集
微服务
微服务的介绍
微服务是一种软件架构风格,其中软件系统被构建为一组小型、独立的服务单元,这些服务单元通过轻量级的通信机制相互协作。每个微服务都专注于单一的业务功能,并且可以独立部署、升级和扩展。微服务架构的核心理念是将复杂的单块应用拆分为更小、更易管理的部分,从而提高系统的灵活性、可维护性和可扩展性。
微服务架构通常具有以下特点:
模块化设计: 系统被分解为多个独立的服务单元,每个服务单元都拥有自己的数据存储、业务逻辑和用户界面。
自治性: 每个微服务都是自治的,即它们可以独立开发、部署和运行,不依赖于其他服务。
松耦合: 微服务之间通过轻量级的通信机制进行交互,通常使用HTTP/REST、消息队列或RPC等方式。这种松耦合的设计使得系统更容易扩展、更易于替换和维护。
技术多样性: 不同的微服务可以使用不同的编程语言、框架和数据存储技术,从而允许开发团队选择最适合其需求的技术栈。
弹性: 微服务架构使得系统更具弹性,可以更容易地处理部分失败,同时允许水平扩展和负载均衡。
可扩展性: 由于每个微服务都是独立的,因此可以根据需要对系统的特定部分进行水平或垂直扩展,而不影响其他部分。
尽管微服务架构提供了许多优点,但它也带来了一些挑战,如分布式系统的复杂性、服务治理、数据一致性等问题。因此,在采用微服务架构时,团队需要仔细考虑这些挑战,并采取适当的措施来解决它们。
微服务服务架构演变
单体服务(Monolithic Service)是一种传统的软件架构方式,将整个应用程序作为一个单一的、紧耦合的单元进行开发和部署。单体服务通常由多个模块组成,这些模块共享同一个数据库和代码库。然而,随着应用程序规模的增长,单体服务可能变得庞大且难以维护,且部署和扩展困难。
微服务顾名思义,是将一个单体的服务,划分成多个服务,每个服务职责更加单一,只负责某一重要的事件处理,且各个模块之间通过HTTP或者RPC服务进行调用,每个微服务都会统一注册到注册中心,来判断服务是否存活。
微服务网关
微服务网关是在微服务架构中常用的组件,用于提供统一的入口和访问点,对外暴露服务并处理相关的请求。
1.统一入口
微服务网关为整个微服务架构提供了统一的入口和访问点,客户端只需与网关进行通信,无需直接调用后端的多个微服务,简化了客户端的调用方式。
2.路由和负载均衡
微服务网关可以根据路由规则将请求分发到相应的微服务实例,通过配置路由规则,可以根据请求的路径、参数、标头等信息来决定请求应该转发到那个微服务。同时网关可以实现负载均衡,将请求均匀地分发到多个后端微服务实例上,提高系统的性能和可伸缩性。
3.安全认证和授权
微服务网关可以集中处理安全认证和授权的逻辑,它可以对请求进行身份验证、访问控制和权限校验,确保只有经过授权的请求能够访问后端的微服务,提供统一的安全策略。
4.日志和监控
微服务网关可以记录请求和响应的日志,并提供监控和分析功能,这样可以追踪和监控系统的运行情况,帮助进行故障排查和性能优化。
微服务的负载均衡
微服务负载均衡是在微服务架构中管理和分发请求的关键组成部分,确保各个微服务实例能够有效地分担负载并提供高可用性和性能。
1.轮询算法:轮询算法是最简单的负载均衡算法之一。它按照顺序将请求依次分配给每个后端服务器,循环往复。当请求到达时,负载均衡器按照事先定义的顺序选择下一个服务器。轮询算法适用于后端服务器具有相同的处理能力和性能的场景。
2.加权轮询算法:加权轮询算法在轮询算法的基础上增加了权重的概念。每个后端服务器都被赋予一个权重值,权重值越高,被选中的概率就越大。这样可以根据服务器的处理能力和性能调整请求的分配比例,使得性能较高的服务器能够处理更多的请求。
3.随机算法:随机算法将请求随机分配给后端服务器。每个后端服务器有相等的被选中概率,没有考虑服务器的实际负载情况。这种算法简单快速,适用于后端服务器性能相近且无需考虑请求处理能力的场景。
4.加权随机算法:加权随机算法在随机算法的基础上引入了权重的概念。每个后端服务器被赋予一个权重值,权重值越高,被选中的概率就越大。这样可以根据服务器的处理能力和性能调整请求的分配比例。
5.最少连接算法:最少连接算法会根据后端服务器当前的连接数来决定请求的分配。负载均衡器会选择当前连接数最少的服务器进行请求分配,以保证后端服务器的负载均衡。这种算法适用于后端服务器的处理能力不同或者请求的处理时间不同的场景。
6.哈希算法:哈希算法会根据请求的某个特定属性(如客户端IP地址、请求URL等)计算哈希值,然后根据哈希值选择相应的后端服务器。
常见的负载均衡器,比如Ribbion、Fegin等等,基本都支持这些负载均衡算法。
微服务的容灾机制
服务崩溃
在了解服务容灾之前,我们先连接服务崩溃,在微服务中,假如一个或者多个服务出现故障,如果这时候,依赖的服务还在不断发起请求,或者重试,那么这些请求的压力会不断在下游堆积,导致下游服务的负载急剧增加。不断累计之下,可能会导致故障的进一步加剧,可能会导致级联式的失败,甚至导致整个系统崩溃,这就叫服务雪崩。
服务容灾机制
在微服务架构中,容灾是确保系统在面对各种灾难性事件时能够继续提供服务的重要方面。以下是一些常见的微服务容灾策略:
1.服务实例的多副本部署:为每个微服务部署多个实例,并将它们分布在不同的物理服务器、虚拟机或容器中。这样可以确保即使某个实例发生故障,其他实例仍然可以继续提供服务。
2.健康检查和自动恢复:实现对微服务实例的健康检查机制,定期检查实例的健康状态。当某个实例被检测到不健康时,自动从负载均衡器中移除,并尝试恢复或替换该实例。
3.服务治理和容错机制:通过服务治理框架(如Netflix的Hystrix)实现容错机制,包括超时控制、断路器模式、降级处理等。这些机制可以在服务出现故障或延迟时提供备用方案或快速失败,从而保护系统免受级联故障的影响。
4.多数据中心部署:在不同的地理位置或数据中心部署微服务的副本,以提供地域性容灾。当一个数据中心发生故障时,流量可以自动转移到其他数据中心上,确保系统的可用性。
5.数据备份和复原:对于需要持久化数据的微服务,实施定期的数据备份和恢复策略。确保数据能够在灾难事件中快速恢复,减少数据丢失和业务中断的风险。
6.灾难恢复演练:定期进行灾难恢复演练,测试容灾方案的有效性,并发现和解决潜在的问题。这有助于提高团队对灾难事件的应对能力,确保系统在面对实际灾难时能够做出及时和有效的响应。
微服务熔断机制
微服务熔断机制是一种用于提高微服务系统稳定性和可用性的重要技术,它可以在面对服务故障或延迟时,通过快速失败和降级处理来保护系统免受级联故障的影响。以下是微服务熔断机制的核心概念和原理:
1.断路器模式:
熔断机制通常采用断路器模式实现,类似于电路中的断路器。断路器监控对某个服务的调用,当连续失败的次数达到阈值时,断路器会打开,阻止对该服务的调用。
打开断路器后,所有请求将立即失败,而无需等待超时。这可以避免对不可用的服务发起大量的请求,从而减轻系统负担,并使服务有更多的时间来恢复正常状态。
2.熔断器状态:
断路器通常有三个状态:关闭(Closed)、打开(Open)和半开(Half-Open)。
当服务调用成功时,断路器保持关闭状态;当连续失败的次数达到阈值时,断路器切换到打开状态;在打开一段时间后,断路器进入半开状态,允许部分请求通过以检测服务的可用性。
3.熔断器参数:
熔断器通常配置有以下参数:
失败阈值:连续失败的次数达到该阈值时打开断路器。
超时时间:等待服务响应的最大时间。
半开状态持续时间:在打开断路器后等待多久进入半开状态。
4.降级处理:
当服务熔断打开时,Hystrix可以提供一个备用的降级方法或返回默认值,以保证系统继续正常运行。开发者可以定义降级逻辑,例如返回缓存数据、执行简化的逻辑或调用其他可靠的服务,以提供有限但可用的功能。
5.健康检查和自动恢复:
在断路器打开后,可以定期进行健康检查,以检测服务是否已经恢复正常。当服务恢复正常时,断路器会逐渐关闭,恢复对该服务的调用。
微服务熔断机制通过断路器模式和降级处理,有效地保护系统免受不可用服务的影响,并提高了系统的稳定性和可用性。
微服务限流
微服务限流是指在微服务架构中对服务的访问进行限制,以确保系统在高负载情况下依然能够正常运行。限流的目的是防止某个服务被过度请求而导致其它服务无法正常工作,或者是防止某些请求对系统造成过大的压力,导致系统性能下降或崩溃。
有几种常见的微服务限流策略:
1.基于并发数的限流:限制同时对某个服务的并发请求数量。这可以通过使用信号量、线程池或类似的机制来实现。
2.基于请求速率的限流:限制每个时间窗口内的请求速率。例如,可以限制每秒钟对某个服务的请求数量。
3.基于资源消耗的限流:限制某个服务在一段时间内所消耗的资源,如CPU、内存或网络带宽。
4.基于用户或客户端的限流:针对特定用户、客户端或IP地址的请求进行限制,以防止恶意行为或异常情况。
5.动态限流:根据系统当前的负载情况自动调整限流策略,以适应不同的工作负载。
实施微服务限流需要根据具体的业务场景和系统特点来选择合适的策略,并结合监控和告警系统进行动态调整和管理。
Sentinel怎么实现限流
Sentinel通过动态管理限流规则,根据定义的规则对请求进行限流控制。具体实现步骤如下:
1.通过注解
@SentinelResource定义资源:在Sentinel中,资源可以是URL、方法等,用于标识需要进行限流的请求。
// 原本的业务方法.
@SentinelResource(blockHandler = "blockHandlerForGetUser")
public User getUserById(String id) {throw new RuntimeException("getUserById command failed");
}// blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
public User blockHandlerForGetUser(String id, BlockException ex) {return new User("admin");
}
@SentinelResource 注解属性说明:
value:资源名称,必需项(不能为空)。
entryType:资源调用的流量类型:入口流量(EntryType.IN)和出口流量(EntryType.OUT),注意系统规则只对 IN 生效。
blockHandler/blockHandlerClass: 限流和熔断时执行 BlockException 所对应的方法名。
fallback/fallbackClass:非 BlockException 时,其他非限流、非熔断时异常对应的方法。
exceptionsToIgnore:用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
2.通过代码定义资源实现限流规则:
可以通过代码的的方式 SphU.entry(“resourceName”) 来定义资源,具体实现代码如下:
@RequestMapping("/getUser")
public String getUser() {try (Entry entry = SphU.entry("getUser")) {// 被保护逻辑return "VO";} catch (Exception e) {// 限流之后的业务逻辑return "此接口被限流了";}
}
2.配置限流规则:在Sentinel的配置文件中定义资源的限流规则。规则可以包括资源名称、限流阈值、限流模式(令牌桶或漏桶)等。
private static void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<>();FlowRule rule1 = new FlowRule();rule1.setResource(resource);//资源名称// Set max qps to 20rule1.setCount(20);//限制的QPS阈值(每秒钟只允许20个请求)rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);//根据QPS限流rule1.setLimitApp("default");//流控效果rule1.setStrtegy(RuleConstant.STRATEGY_DIRECT);//调用关系限流策略,非必须设置rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 流控效果【非必须设置】rule1.setClusterMode(false);//是否设置集群限流(非必须设置,默认为非集群)rules.add(rule1);FlowRuleManager.loadRules(rules);
}
setStrategy:设置调用关系限流策略,包含的值有:
直接(RuleConstant.STRATEGY_DIRECT)【默认值】
链路(RuleConstant.STRATEGY_RELATE)
关联(RuleConstant.STRATEGY_CHAIN)
setControlBehavior:设置流控效果,包含的值有:
直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)【默认值】
冷启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)
匀速启动(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
冷启动+匀速启动(RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER)
微服务限流算法
1.令牌桶算法
令牌桶算法是一种流量控制算法,用于限制在任意时间单位内通过的请求速率。它基于令牌桶的概念,具有固定的容量,其中以固定的速率往桶中添加令牌。当一个请求到达时,需要从桶中获取一个令牌,如果桶中有足够的令牌,则请求被允许通过;否则,请求被拒绝或者延迟处理。
令牌桶算法的基本原理和步骤:
1.令牌桶:算法维护一个固定容量的令牌桶,其中以固定的速率向桶中添加令牌。
2.令牌生成:桶中以恒定的速率生成令牌,通常每隔固定时间生成一个令牌,或者以固定的速率生成令牌。
3.请求处理:当一个请求到达时,需要从令牌桶中获取一个令牌。如果桶中有足够的令牌,则将一个令牌移出桶,并处理该请求;否则,请求被拒绝或者延迟处理。
4.令牌补充:如果请求未被拒绝,则在处理请求后,可以选择将一个新的令牌放入桶中,以确保下一个请求可以及时被处理。
令牌桶算法的优点包括:
允许短时间内的突发流量,因为如果令牌桶中有足够的令牌,请求可以立即被处理。
允许动态调整请求处理的速率,只需调整令牌生成的速率即可。
简单且高效,适用于各种场景下的流量控制。
然而,令牌桶算法也有一些缺点,比如对于突发流量的处理可能不够灵活,因为令牌桶中的令牌数量是固定的。
2.漏斗桶算法
漏斗算法是一种用于流量控制的算法,类似于令牌桶算法。它基于一个类比:将请求想象成水流,桶就像是一个漏斗,而请求则是水滴。漏斗以固定的速率流水,当水满了漏斗则会溢出。在漏斗算法中,漏斗以固定的速率处理请求,如果请求到达速率超过漏斗处理的速率,则请求会被拒绝或延迟处理。
漏斗算法的基本原理和步骤:
漏斗:算法维护一个固定容量的漏斗,类似于一个定时漏水的容器。
漏水速率:漏斗以固定的速率处理请求,类比为漏斗定时地漏水。
请求处理:当一个请求到达时,漏斗会处理请求,类比为漏斗装满水。如果请求到达速率超过漏斗的处理速率,则漏斗会溢出,表示请求被拒绝或者延迟处理。
漏斗空出:当漏斗溢出时,表示系统无法处理更多的请求,需要等待一段时间,直到漏斗空出了一些空间。
漏斗算法的优点包括:
允许短时间内的突发流量,因为如果漏斗尚未溢出,则请求可以立即被处理。
允许动态调整请求处理的速率,只需调整漏水的速率即可。
简单且高效,适用于各种场景下的流量控制。
然而,与令牌桶算法相比,漏斗算法在某些情况下可能表现得更为宽松,因为漏斗的处理速率是固定的,无法动态调整,可能会导致系统对于突发流量的处理不够灵活。
服务监控
我们使用Prometheus和Grafana来实现整个微服务集群的监控和告警:
Prometheus:Prometheus 是一个开源的监控系统,具有灵活的数据模型和强大的查询语言,能够收集和存储时间序列数据。它可以通过HTTP协议定期拉取微服务的指标数据,并提供可扩展的存储和查询功能。
Grafana:Grafana 是一个开源的可视化仪表板工具,可以与 Prometheus 结合使用,创建实时和历史数据的仪表板。Grafana 提供了丰富的图表和可视化选项,可以帮助用户更好地理解和分析微服务的性能和状态。
日志收集
日志收集有很多种方案,我们用的是ELK:
Elasticsearch:Elasticsearch是一个分布式搜索和分析引擎,用于存储和索引大量的日志数据。它提供了快速的搜索和聚合功能,可以高效地处理大规模的日志数据。
Logstash:Logstash是一个用于收集、过滤和转发日志数据的工具。它可以从各种来源(如文件、网络、消息队列等)收集日志数据,并对数据进行处理和转换,然后将其发送到Elasticsearch进行存储和索引。
Kibana:Kibana是一个用于日志数据可视化和分析的工具。它提供了丰富的图表、仪表盘和搜索功能,可以帮助用户实时监控和分析日志数据,发现潜在的问题和趋势。
简单说,这三者里Elasticsearch提供数据存储和检索能力,Logstash负责将日志收集到ES,Kibana负责日志数据的可视化分析。
使用ELK进行微服务日志收集的一般流程如下:
(1)通过FileBeat采集服务器上的日志,然后将采集好的日志推送到Kafka中。此时为什么不直接将采集的日志推送到Logstash呢?因为logstash在并发量很大的时候容易丢失数据,所以为了保证数据不丢失我们采用Kafka将流量消峰然后把数据推送给Logstash消费。
(2)kafka将队列中的日志数据给Logstash消费,Logstash将数据做定制化处理,处理好数据后再推送到ES指定的索引中。
(3)ES收到Logstash推送的数据之后存储对于索引的分片中,由于ES自身的特性,针对海量数据处理能力还是很优秀的。
(4)开发人员或运维人员通过Kinaba可视化平台查询ES中的数据。
相关文章:

【微服务最全详解】
文章目录 微服务微服务的介绍微服务服务架构演变 微服务网关微服务的负载均衡微服务的容灾机制服务崩溃服务容灾机制微服务熔断机制微服务限流Sentinel怎么实现限流微服务限流算法1.令牌桶算法2.漏斗桶算法 服务监控日志收集 微服务 微服务的介绍 微服务是一种软件架构风格&a…...

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介
数据分层(应用分层)技术简介 近几年虚拟化市场实现了非常大的发展,桌面虚拟化在企业中应用越来越广泛,其拥有的如下优点得到大量企业的青睐: 数据安全不落地。在虚拟化环境下面数据保存在中心服务器上面,…...

【动态规划五】回文串问题
目录 leetcode题目 一、回文子串 二、最长回文子串 三、分割回文串 IV 四、分割回文串 II 五、最长回文子序列 六、让字符串成为回文串的最少插入次数 leetcode题目 一、回文子串 647. 回文子串 - 力扣(LeetCode)https://leetcode.cn/problems/…...

【C++杂货铺铺】AVL树
目录 🌈前言🌈 📁 概念 📁 节点的定义 📁 插入 📁 旋转 1 . 新节点插入较高左子树的左侧---左左:右单旋 2. 新节点插入较高右子树的右侧---右右:左单旋 3. 新节点插入较高左…...

【R语言】生存分析模型
生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战,例如右侧截尾(右侧截尾表示未观察到的事件发生,例如研究结束时还未发生事件&#…...

「AIGC」Python实现tokens算法
本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…...

【Unity】编程感悟20240510
【背景】 这一点感悟是过去有所认识,但是最近写Unity项目,涉及UDP通信需要持续监听逻辑时更加感受深刻的。 选用合适的触发点,用明确的逻辑避免循环处理 尽量采用明确的触发点使逻辑清晰,规避一定时间刷新这类的逻辑。 比如UDP…...

C#【进阶】泛型
1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…...

50. UE5 RPG FGameplayEffectContext
接下来,我想实现处理完伤害时,将伤害的触发格挡或者触发暴击时的逻辑传递到数据集的PostGameplayEffectExecute里面,这样,在处理IncomingDamage时,我们可以通过释放触发格挡或者触发暴击在UI上面进行对应的效果表现。 …...

Golang 的 unmarshal 踩坑指南
文章目录 1. 写在最前面2. 字段区分出空字段还是未设置字段2.1 问题描述2.2 解决 3. 字段支持多种类型 & 按需做不同类型处理3.1 问题描述3.2 解决 4. 碎碎念5. 参考资料 1. 写在最前面 笔者最近在实现将内部通知系统的数据定义转化为产品定义的对外提供的数据结构。 举例…...

Linux的常用指令 和 基础知识穿插巩固(巩固知识必看)
目录 前言 ls ls 扩展知识 ls -l ls -a ls -al cd cd 目录名 cd .. cd ~ cd - pwd 扩展知识 路径 / cp [选项] “源文件名” “目标文件名” mv [选项] “源文件名” “目标文件名” rm 作用 用法 ./"可执行程序名" mkdir rmdir touch m…...

MP3解码入门(基于libhelix)
主要参考资料: 【Arduino Linux】基于 Helix 解码库实现 MP3 音频播放: https://blog.csdn.net/weixin_42258222/article/details/122640413 libhelix-mp3: https://github.com/ultraembedded/libhelix-mp3/tree/master 目录 一、MP3文件二、MP3 解码库三、libhelix-mp3库3.1 …...

Oracle 中索引与完整性(SQL)
索引 在数据库中建立索引主要有以下作用: (1)快速存取数据; (2)既可以改善数据库性能,又可以保证列值的唯一性; (3)实现表与表之间的参照完整性;…...

【Linux深度学习笔记5.13(Apache)】
Apache : 1.安装yum -y install hhtpd2.启动hhtpd -k start3.停止httpd -k stop4.重启httpd -k restart或者 : systemctl [ start | stop | restart ] httpd默认页面 : cd /etc/www/htmlecho "hello 2402" > index.html验证 : 浏览器访问 : http://ip 访问控制…...

汇编语言入门:探索 x86 架构
目录 前言 1. x86 语言 x86 架构简介 x86 架构的特点 x86 架构的演变 x86 架构的应用 2. 常用汇编指令集 3. 寻址方式 结语 前言 汇编语言是一种低级编程语言,直接面向计算机的硬件架构。在计算机科学中,了解汇编语言是非常重要的,因…...

[ffmpeg处理指令]
1 将h264转为mp4 ffmpeg -f h264 -i front_far_0.264 -vcodec copy front_far_0.mp4 ffmpeg -f h264 -i front_near_0.264 -vcodec copy front_near_0.mp4 -i:表示输入文件 front_far_2.mp4:表示输出文件 2 h264转为图片 front_far 是目标路径,需要…...

测试之路 - 精准而优雅
引子 这几年业内一直在做精准测试,大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中,我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践,通过深入测试有针对的设计 case,发现隐藏问题…...

Java基础篇常见面试问题总结
文章目录 1. 你是怎样理解 OOP面向对象?2. 重载与重写区别3. 接口与抽象类的区别4. 深拷贝与浅拷贝的理解5. 什么是自动拆装箱? int和 Integer有什么区别6. 和 equals()区别7. String类 能被继承吗为什么用 final修饰8. final、finally、finalize区别 1. 你是怎样理…...

Spring、SpringMVC
一、Spring框架中的单例Bean是线程安全的吗? 【默认单例的情况下】Spring Bean并没有可变的状态(如Service类和DAO类),即只能查不能改,所以没有并发问题,所以某种程度上来说Spring的单例Bean是线程安全的。…...

【传知代码】VRT: 关于视频修复的模型(论文复现)
前言:随着数字媒体技术的普及,制作和传播视频内容变得日益普遍。但是,视频中由于多种因素,例如传输、存储和录制设备等,经常出现质量上的问题,如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…...

不用投稿邮箱,怎样向各大新闻媒体投稿?
身为单位的信息宣传员,我深知肩上责任重大。每个月,完成单位在媒体上投稿发表文章的考核任务,就如同一场无声的赛跑,既要保证速度,更要注重质量。起初,我遵循“前辈们”的老路,一头扎进了邮箱投稿的海洋。但很快,现实给了我一记重拳——邮箱投稿的竞争犹如千军万马过独木桥,稿件…...

NAT技术总结与双向NAT配置案例
NAT的转换方式: 1.静态转换:固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换:Basic NAT nat address-gr…...

mysql的explain
explain可以用于select,delete,insert,update的statement。 当explain用于statement时,mysql将会给出其优化器(optimizer)的执行计划。 通过explain字段生成执行计划表。下面来解析这个执行计划表的每一列…...

SpringBoot+Vue实现图片滑块和文字点击验证码
一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程,目前已可被机器暴力破解,应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码,采用行为验证码采用嵌入式集成方式,接入方便,安全&#…...

每日复盘-20240515
仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…...

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决
一般安卓提取apk图标我们有两种常用方法: 1、如果已经获取到 ApplicationInfo 对象(假设名为 appInfo),那么我们获取方法为: appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…...

高校普法|基于SSM+vue的高校普法系统的设计与实现(源码+数据库+文档)
高校普法系统 目录 基于SSM+vue的高校普法系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3律师功能模块 4学生功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…...

pytest教程-47-钩子函数-pytest_sessionfinish
领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest_sessionstart钩子函数的使用方法,本小节我们讲解一下pytest_sessionfinish钩子函数的使用方法。 pytest_sessionfinish 钩子函数在 Pytest 测试会话结束时调用,…...

如何使用Python下载哔哩哔哩(Bilibili)视频字幕
在本文中,我将向大家展示如何使用Python下载哔哩哔哩(Bilibili)视频的字幕。通过这个方法,你可以轻松地获取你喜欢的视频的字幕文件,方便学习和交流。 准备工作 在开始之前,我们需要安装一些必要的库&…...

IP代理网络协议介绍
在IP代理页面上,存在HTTP/HTTPS/Socks5三种协议。它们都是客户端与服务器之间交互的协议。 HTTP HTTP又称之为超文本传输协议,在因特网使用范围广泛。它是一种请求/响应模型,客户端向服务器发送请求,服务器解析请求后对客户端作出…...