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

【微服务】软件架构的演变之路

目录

  • 单体式架构的时代
    • 单体式架构(Monolithic)
    • 优点
    • 缺点
    • 适用场景
    • 单体式架构面临诸多问题
      • 1.宽带提速,网民增多
      • 2.Web2.0时代的特点
      • 问题描述
      • 优化方向
  • 集群
    • 优点
    • 缺点
    • 适用场景
    • 搭建集群后面临诸多问题
      • 用户请求问题
      • 用户的登录信息
      • 数据查询
    • 改进后的架构
  • 垂直架构
    • 优点
    • 缺点
  • 分布式架构
    • 产生
    • 分布式架构
  • 分布式和集群的区别
    • 集群是个物理形态,分布式是个工作方式
    • 提升效率的方式不同
  • 新的问题
    • 场景假设
    • 优化方向
  • SOA 架构
    • 特点
  • 新的问题2
    • SOA架构的问题
    • 优化方向
  • 微服务架构
    • 什么是微服务
    • 微服务架构的特征
    • 优点
    • 缺点
    • 微服务架构面临的挑战
      • 技术挑战
  • 微服务 VS SOA
    • 1.通讯协议
    • 2.服务拆分
    • 3.项目迭代
  • 架构演变
  • 主流的微服务框架
  • 官网
    • Dubbo
    • Spring Cloud
    • Spring Cloud Alibaba

单体式架构的时代

在这里插入图片描述

  • 宽带不足:1993年前后;网络普及率少
  • 项目类型:以内部管理系统为主,项目不需要对外开放,对安全性和稳定性的要求是不高的。例如:OA、CRM、ERP
  • 内容或资讯:内容主要由一些媒体、政府、公司等发布,对于网民来说,更多的是被动的接收

单体式架构(Monolithic)

  • 单体式架构就是将所有业务场景中的表示层、业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包为war包或jar包,部署在一台服务器上。
  • 通俗的说法:如果一个war包或者jar包里面包含一个应用的所有功能,则是单体式架构。
  • 早期的SSH和SSM项目大多是单体式架构的项目

优点

架构简单、运维简单。开发成本低,开发周期短

缺点

  1. 系统启动慢, 一个进程包含了所有的业务逻辑,涉及到的启动模块过多,会导致系统的启动、重启时间周期过长;
  2. 系统错误隔离性差、可用性差,任何一个模块的错误均可能造成整个系统的宕机;
  3. 可伸缩性差:系统的扩容只能对整个应用扩容,成本高。不能做到对某个功能点进行扩容;
  4. 技术栈受限:只能使用1种开发语言;

适用场景

  1. 适用于业务不复杂、访问量较小的项目
  2. 例如:政府项目、管理系统、crm客户关系管理系统

在这里插入图片描述

单体式架构面临诸多问题

1.宽带提速,网民增多

时间的年轮来到2004年,随之到来的WEB2.0时代,实现的ADSL拨号上网,宽带提速,最高可以达到8M,用户量也就不断增加,一些门户网站也开始活跃,项目就需要考虑安全性和稳定性,如果服务器发生宕机,则整个应用也随之崩溃

2.Web2.0时代的特点

Web2.0模式下的互联网应用具有以下显著特点:去中心化、开放、共享。

  1. 用户分享。在Web2.0模式下,可以不受时间和地域的限制分享各种观点。用户可以得到自己需要的信息也可以发布自己的观点。
  2. 信息聚合。信息在网络上不断积累,不会丢失。
  3. 以兴趣为聚合点的社群。在Web2.0模式下,聚集的是对某个或者某些问题感兴趣的群体,可以说,在无形中已经产生了细分市场。
  4. 开放的平台,活跃的用户。平台对于用户来说是开放的,而且用户因为兴趣而保持比较高的忠诚度,他们会积极的参与其中。

问题描述

产品最终的核心是产品的长期运行,作为公司,肯定希望这个产品被越来越多的人使用,这样才能创建更大的价值。对于整个技术架构来说,可能会面临以下挑战:

  1. 用户量增多,访问量不断增大,导致后端服务器的负载越来越高
  2. 用户量增多,产品需要满足不同用户的需求来留住用户,使得业务场景越来越多并且越来越复杂。
  3. 业务场景越多越复杂,意味着war包或jar包中的代码量会持续上升,耦合度也会越来越高。后期的代码维护和版本发布也会很困难。

优化方向

  1. 通过横向添加服务器,把单台变成多台机器的集群;
  2. 按照业务维度把项目切割成多个项目,减少业务的耦合度,以及降低单个war包或jar包带来的伸缩性困难的问题。

集群

在单体架构的基础上去搭建集群。如果一台服务器发生宕机,其他服务器可以继续运行,同时多台服务器也能分担大量用户访问的压力
在这里插入图片描述
集群就是单机的多实例,在多个服务器上部署多个服务,每个服务就是一个节点,这些节点的集合就叫做集群。

优点

操作简单,容易部署,在搭建集群之后,可以提升项目的稳定性,并且并发量增加,也可以承受住。

缺点

每个节点负载相同(耦合度高),每个具体业务的访问量可能差异很大,比如美团外卖美食外卖的访问量一定大于鲜花外卖的访问量,这就造成了资源浪费

适用场景

单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个“集群”。集群中每台服务器就叫做这个集群的一个“节点”,所有节点构成了一个集群。每个节点都提供相同的服务,那么这样系统的处理能力就相当于提升了好几倍。

集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用

搭建集群后面临诸多问题

用户请求问题

用户的请求到底要发送到哪台服务器上,如何保证请求平均的分发给不同的服务器,从而缓解用户量增加的压力。

用户的登录信息

编写项目时,如果用户登录成功了,将用户的标识放到Session域中,在搭建集群之后如何实现数据共享问题

数据查询

当数据量特别庞大时,如果还直接去数据库查询,速度很慢,如何提升查询效率。

为了解决上述的问题,需要使用到的三门技术:

  • Nginx - 解决用户请求分发,负载均衡
  • Redis - 解决数据共享并实现缓存功能
  • ElasticSearch \ solr- 解决搜索数据的功能

改进后的架构

在这里插入图片描述

垂直架构

  • 比如一个电商项目包含了三个模块,用户模块,商品模块,订单模块
  • 商品模块压过大,一般最直接有效的方式就是搭建集群,在单体架构的集群上去搭建,效果相对比较差,需要在每个服务器上都部署商品模块,用户模块,订单模块
  • 随着项目的不断更新,项目中的功能越来越多,最严重可能会导致项目无法启动
  • 为了解决上述的各种问题演进出了垂直架构

优点

  • 拆分后业务直接的相互影响小,减少耦合度,能合理地分配硬件资源;
  • 配合集群后从而提升整个系统的吞吐量;

缺点

可能会导致整个系统存在“重复造轮子”的问题,而且难于维护
在这里插入图片描述

分布式架构

产生

  • 随着项目的不断迭代,新老功能之间需要相互交互,服务器和服务器之间是需要通讯的。我们无法直接实现通讯,怎么解决?
  • 项目一般是分为三层的,Controller,Service,Dao。导致程序变慢的重灾区一般是service和Dao,在搭建集群时,确实针对三层都搭建集群,效果不是很好,怎么解决?
  • 为了解决上述的各种问题架构从垂直架构演变到了分布式架构. 实现了模块之间的通讯

分布式架构

分布式架构(Distributed Service Architecture,DSA)就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中,它们之间通过RPC方式通信。
在这里插入图片描述

分布式和集群的区别

集群是个物理形态,分布式是个工作方式

  • 分布式:一个业务分拆多个子业务,部署在不同的服务器上。
  • 集群:同一个业务,部署在多个服务器上。

提升效率的方式不同

分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率

  • 如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行该任务需10小时。
  • 采用分布式方案,提供10台服务器,每台服务器只负责处理一个子任务,不考虑子任务间的依赖关系,执行完这个任务只需一个小时。
  • 而采用集群方案,同样提供10台服务器,每台服务器都能独立处理这个任务。假设有10个任务同时到达,10个服务器将同时工作,1小时后,10个任务同时完成,这样,整身来看,还是1小时内完成一个任务。

新的问题

场景假设

  1. 场景1:假设用户执行下单操作,系统的处理逻辑是先去库存子系统检查商品的库存,如果库存充足的情况下才会提交订单,那么这个检查库存的逻辑是放在订单子系统中还是库存子系统中呢?这些业务场景的逻辑可能会被重复创建,从而产生冗余的业务代码。能不能把这些共享业务逻辑抽离出来形成可重用的服务呢?
  2. 场景2:在一个集团公司下有很多子公司,每个子公司都有自己的业务模式和信息沉淀,各个子公司之间不进行交互和共享。由于各个子公司之间信息不是互联互通的,彼此之间形成了信息孤岛,使得价值无法最大化

优化方向

把一些通用的、会被多个上层服务调用的共享业务提取成独立的基础服务,并且可以重用。

SOA 架构

  • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。
  • SOA(Service-Oriented Architecture)是基于分布式架构演变而来,俗称服务化,也就是面向服务开发,将共同存在的业务逻辑抽取成一个公共的服务,提供给其他结构实现调用,服务与服务之间采用RPC远程调用技术。
  • 服务里只有业务逻辑,没有视图层。

特点

  1. SOA架构模式传输协议采用SOAP协议(http/https+XML)实现传输,在高并发情况下实现通讯该协议存在大量的冗余性传输,非常占用带宽。
  2. SOA架构模式实现方案为Web Service或者ESB企业服务总线

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

新的问题2

SOA架构的问题

  1. SOAP协议实现通讯,XML传输非常重,效率比较低
  2. 服务化管理和治理设施不够完善。
  3. 依赖于中心服务发现机制
  4. 不适合前后端分离架构模式

优化方向

  • 去除SOA架构中SOAP协议和ESB企业服务总线,改为http+json形式传输接口
  • 服务的粒度更加精细化,提倡让专业的人去做专业的事。每个服务互不影响。每个服务都是单独独立数据库、Redis连接、MQ等。并且都是独立部署,整个服务架构更加轻巧。
  • 微服务架构出现了

微服务架构

什么是微服务

  • 微服务的概念源于2014年3月Martin Fowler(马丁·福勒,微服务的提出者)所写的一篇文章Microservices( https://martinfowler.com/microservices/)。
    在这里插入图片描述
  • 微服务架构风格是一种将一个单体应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常是基于HTTP协议的RESTful API)。这些服务围绕业务能力构建,并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术

在这里插入图片描述

微服务架构的特征

  1. 每个服务按照业务划分;
  2. 服务之间通过轻量级 API 调用;
  3. 可以使用不同语言开发;
  4. 可以使用不同的数据存储技术;
  5. 可独立部署,服务之间互相不影响;
  6. 可针对用户访问流量大的服务单独扩展,从而能够节约资源;
  7. 管理自动化

优点

  1. 逻辑清晰,项目复杂度降低:通过对共享业务更加细粒度的拆分,一个服务只需要关注一个特定的业务领域,并通过定义良好的接口清晰表述服务边界。由于体积小、复杂度低,开发、维护会更加简单;
  2. 技术选型更加灵活:每个微服务都有不同的团队来维护,所以可以结合业务特性自由选择技术栈;
  3. 可扩展性更强:可以根据每个微服务的性能要求和业务特点对服务进行灵活扩展;
  4. 独立部署:单个微服务的代码量比较小,使得发布更加高效;
  5. 容错性:如果某一个服务发生故障,可以通过重试、降级等机制实现容错;

缺点

  1. 性能降低,微服务的间通过REST、RPC等形式进行交互,通信的延时会受到较大的影响;
  2. 提升了运维的难度(版本发布、问题排查、配置管理、监控);
  3. 数据一致性的问题;

微服务架构面临的挑战

  1. 微服务粒度大小难以划分,需要设计人员对业务有很好的掌握;
  2. 分布式复杂性,主要体现在分布式事务、网络延迟、系统容错等问题解决难度较大;
  3. 微服务之间通信成本较高,对微服务之间网络稳定性、通信速度要求较高;
  4. 由于微服务数量较大,运维人员运维、部署有较大的挑战

技术挑战

  1. 微服务架构的主要目的是实现业务服务的解耦;
  2. 对服务进行治理(服务的注册与发现、服务与服务之间的调用、熔断限流、负载均衡、链路追踪、分布式配置中心、服务路由等);

微服务 VS SOA

1.通讯协议

  • 微服务只是一种为经过良好架构设计的SOA解决方案,是面向服务的交付方案。
  • 微服务架构继承了SOA架构优点,在微服务架构中去除SOA架构中SOAP协议和ESB企业服务总线,改为http+json形式传输接口。

2.服务拆分

微服务架构比SOA架构的粒度更加精细,提倡让专业的人去做专业的事。每个服务互不影响。每个服务都是单独独立数据库、redis连接、MQ等。并且都是独立部署,整个服务架构更加轻巧

3.项目迭代

服务拆分微服务与敏捷开发的思想高度结合在一起,服务的定义更加清晰,同时减少了企业ESB开发的复杂性

架构演变

在这里插入图片描述

主流的微服务框架

框架名称说明
MotanMotan(茅台)是新浪微博开源的RPC框架,官网:github.com/weibocom/motan
JSFJSF(京服)是京东的微服务组件。
MSEC毫秒服务引擎(MSEC, Mass Service Engine in Cluster)是腾讯的一个开源框架,适用于在廉价机器组成的集群上开发和运营分布式后台服务。该项目集RPC、名字发现服务、负载均衡、业务监控、灰度发布、容量管理、日志管理、key-value存储于一体,目的是提高开发与运营的效率和质量。
Dubbo阿里巴巴开源的RPC框架,后来加入Apache孵化器并成功毕业。新的名字为Apache Dubbo。
DubboX当当网基于Dubbo开源的PRC框架,后来并入Apache Dubbo。
Netflix OSSNetflix OSS是由Netflix公司开发的一套代码框架,用于解决分布式系统的问题,如:服务注册与发现、负载均衡、熔断降级、限流、网关等。
Spring CloudSpring Cloud是由Pivotal公司开源的微服务架构,提供了微服务系统架构的一站式解决方案。它提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。
Spring Cloud NetflixSpring Cloud Netflix是Spring Boot和Netflix OSS在Spring Cloud规范下的集成。
Spring Cloud AlibabaSpring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。Spring Cloud Alibaba 正式入驻Spring Cloud 官方孵化器,并顺利毕业。
Spring Cloud 生态下中微服务整理Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
主流的微服务治理方案:Spring Cloud Netflix和Spring Cloud Alibaba

官网

Dubbo

http://dubbo.io/

Spring Cloud

https://spring.io/projects/spring-cloud

Spring Cloud Alibaba

https://spring.io/projects/spring-cloud-alibaba

相关文章:

【微服务】软件架构的演变之路

目录 单体式架构的时代单体式架构(Monolithic)优点缺点适用场景单体式架构面临诸多问题1.宽带提速,网民增多2.Web2.0时代的特点问题描述优化方向 集群优点缺点适用场景搭建集群后面临诸多问题用户请求问题用户的登录信息数据查询 改进后的架构 垂直架构优点缺点 分布…...

安全算法 - 加密算法

加密算法是一种在信息安全领域中广泛应用的算法,能够将数据进行加密转换,以保证数据的保密性和安全性。 它具有保密性、对称加密和非对称加密、密钥管理、数据完整性和认证等重要特点和应用。 加密算法可以分为对称加密和非对称加密两种类型&#xff1…...

安全算法 - 国密算法

国密算法是中国自主研发的密码算法体系,包括对称加密算法、非对称加密算法和哈希算法。其中,国密算法采用SM4作为对称加密算法,SM2作为非对称加密算法,以及SM3作为哈希算法。国密算法在信息安全领域具有重要意义和广泛应用&#x…...

蓝桥杯2014年第十三届省赛真题-武功秘籍

一、题目 武功秘籍 小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。 小明只想练习该书的第81页到第92页的…...

Could not initialize class java.awt.Font

项目场景: 项目场景:java项目在web端导出Excel、Word、PDF等文档 问题描述 在Windows系统中开发以及运行文件导出正常,单机部署到Linux中或者使用docker部署后,导出报错。 异常: eleasing transactional SqlSession…...

Mysql or与in的区别

创建一个表格 内涵一千万条数据 这张表中,只有id有建立索引,且其余都没有 测试1:使用or的情况下,根据主键进行查询 可以看到根据主键id进行or查询 花费了30-114毫秒,后面30多毫秒可能是因为Mysql的Buffer Pool缓冲池的…...

STM32——USART

一、通信 1.1通信是什么; 通信是将一个设备的数据发送到另一个设备中,从而实现硬件的扩展; 1.2通信的目的是什么; 实现硬件的扩展-在STM32中集成了很多功能,例如PWM输出,AD采集,定时器等&am…...

WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具

关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具,该工具能够枚举目标域名下的子域名,并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…...

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件,实现一个支持加减乘除混合运算的计算器。 说明: 由于数字都是双精度浮点数,在计算机中是二进制存储数据的,因此小数和非安全整数(超过整数的安全范围[-Math.pow(2, 53)&#…...

每日OJ题_子序列dp⑥_力扣873. 最长的斐波那契子序列的长度

目录 力扣873. 最长的斐波那契子序列的长度 解析代码 力扣873. 最长的斐波那契子序列的长度 873. 最长的斐波那契子序列的长度 难度 中等 如果序列 X_1, X_2, ..., X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#x…...

病毒循环Viral Loop是什么?为何能实现指数增长

一、什么是病毒循环&#xff08;Viral Loop&#xff09;&#xff1f; 病毒循环&#xff08;Viral Loop&#xff09;是一种机制&#xff0c;它推动连续的推荐以实现持续增长。 它会促使你现有的客户推荐其他人&#xff0c;去认识你的品牌&#xff0c;然后让这些新客户进一步告诉…...

下载huggingface中数据集/模型(保存到本地指定路径)

一. snapshot_download # 1.安装huggingface_hub # pip install huggingface_hubimport osfrom huggingface_hub import snapshot_downloadprint(downloading entire files...) # 注意&#xff0c;这种方式仍然保存在cache_dir中 snapshot_download(repo_id"ibrahimhamam…...

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言&#xff0c;实现一个导航与内容二级联动的效果。 2 标题 二级联动&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能&#xff1a; 切换左侧导航&#xff…...

ArcGIS二次开发(一)——搭建开发环境以及第一个简单的ArcGIS Engine 程序

Arcgis10.2、Arcgis Engine10.2与Microsoft Visual Studio 2012的版本进行安装 1、推荐教程与安装包2、安装顺序3、安装成功测试VS新建项目可以创建ArcGIS项目&#xff0c;并且在VS中拖拽ArcGIS工具 4、搭建第一个简单的ArcGIS Engine 程序 ArcEngine和VS版本是有对应的&#x…...

Oracle 19c 高可用部署实战系列之Data Guard理论与实战

课程介绍 Oracle Data Guard确保企业数据的高可用性、数据保护和灾难恢复。 Oracle Data Guard提供了一组全面的服务&#xff0c;用于创建、维护、管理和监视一个或多个备用数据库&#xff0c;使生产Oracle数据库能够在灾难和数据损坏中幸存下来。Oracle Data Guard将这些备用…...

ubuntu常用记录

常用命令 ps aux |grep ... pip show pkgname nvidia-smi -l du -sh * df -h head -n 10 file.txt htop sudo apt install package_name kill process_id 软链接 在 Linux 中&#xff0c;软连接&#xff08;Symbolic Link&#xff0c;也称为符号链接或软链接&#xff09;是一…...

顺序表专题

文章目录 目录1. 数据结构相关概念1.1 什么是数据结构1.2 为什么需要数据结构 2. 顺序表的概念及结构3. 顺序表分类4. 实现动态顺序表4.1 初始化4.2 顺序表的尾部插入4.3 打印顺序表4.4 顺序表的头部插入4.5 顺序表的尾部删除4.6 顺序表的头部删除4.7 指定位置之前插入数据4.8 …...

手写SpringBoot(三)之自动配置

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;三&#xff09;之自动配置 手写SpringBoot&#xff08;四&#xff09;之bean动态加载 手写SpringBoot…...

vitepress builld报错

问题&#xff1a;build时报错&#xff1a;document/window is not defined。 背景&#xff1a;使用vitepress展示自定义的组件&#xff0c;之前build是没有问题了&#xff0c;由于新增了qr-code以及quill富文本组件&#xff0c;导致打包时报错。 原因&#xff1a;vitepress官…...

redis分布式锁-----基于Redis的SETNX命令的简单分布式锁实现

Redis的SETNX命令的简单分布式锁实现的Java示例 首先&#xff0c;确保你已经引入了Jedis这个Java Redis客户端库。你可以通过Maven或Gradle来添加依赖。 1、Maven依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifact…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...