【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
#微服务实战
#Docker
#Kubernetes
#SpringSecurity
#OAuth2
#分布式事务
#Seata
#ServiceMesh
#总结
#SpringCloud
#SpringBoot
系列终章:经过前九篇 [【深度 Mape 系列】] 的系统学习,我们已经逐一探索并实战了 Spring Boot 的基础构建能力,以及 Spring Cloud 微服务生态中的核心组件:Nacos(服务发现与配置)、OpenFeign(服务调用)、Spring Cloud Gateway(API 网关)、Sentinel(服务容错)、Spring Cloud Stream(异步消息)和 Sleuth/Zipkin(链路追踪)。现在,是时候将这些珍珠串联起来,审视一个完整的微服务体系是如何协同工作的了。本文作为系列的收官之作,将进行体系整合的回顾,探讨微服务架构常见的部署运维方案(Docker 与 Kubernetes)、关键的安全性考量、棘手的分布式事务问题,并简要介绍服务网格 (Service Mesh) 等进阶概念,最后对整个 Spring Boot 与 Spring Cloud 技术栈进行总结与展望。
摘要:构建健壮、可扩展的微服务系统,不仅需要掌握各个独立组件,更要理解它们如何组合、部署、运维和保护。本文将回顾 Spring Cloud 核心组件如何协同工作,构建一个完整的微服务解决方案。我们将重点讨论使用 Docker 进行容器化以及 Kubernetes 进行编排的现代化部署策略。同时,还会探讨微服务安全(认证授权)、分布式事务处理(如 Seata)以及服务网格(如 Istio)等进阶主题。最终,我们将对 Spring Boot 与 Spring Cloud 技术生态进行总结,并展望其未来发展方向,为你的微服务之旅画上一个阶段性的句点,并开启新的探索篇章。
本文目标
- 回顾并理解 Spring Cloud 核心组件如何协同工作,构建一个完整的微服务系统。
- 掌握使用 Docker 对 Spring Boot 应用进行容器化的基本方法(Dockerfile)。
- 了解使用 Kubernetes (K8s) 进行容器编排的基本概念及其在微服务部署中的价值。
- 认识微服务安全的关键挑战,了解 OAuth2/JWT 结合 API 网关的常见认证授权方案。
- 理解分布式事务问题的复杂性,并了解 Seata 等解决方案提供的模式概览。
- 了解服务网格 (Service Mesh) 的基本概念及其与 Spring Cloud 的关系。
- 对 Spring Boot 和 Spring Cloud 技术栈进行总结,并展望未来发展。
一、 体系整合回顾:当组件协同起舞
让我们回顾一下前几章学习的核心组件,以及它们如何在一个典型的微服务场景中协同工作:
- 基础单元 (Spring Boot - Mape 1):每个微服务(如订单服务、用户服务、库存服务)都是一个独立的 Spring Boot 应用,利用其自动配置、Starters 快速构建。
- 服务“户口本” (Nacos Discovery - Mape 3):所有服务实例启动时向 Nacos 注册中心注册自己的地址和元数据。
- “通讯录”查询与智能导航 (OpenFeign + LoadBalancer - Mape 4):当订单服务需要调用用户服务时,它使用定义好的 OpenFeign 客户端接口。Feign 底层结合 Nacos Discovery 查找用户服务的可用实例列表,并使用 Spring Cloud LoadBalancer 选择一个实例进行调用,无需硬编码 IP 地址。
- 系统“大门”与“保安” (Spring Cloud Gateway - Mape 5):所有来自外部客户端(Web/App)的请求首先到达 API 网关。网关根据配置的路由规则(Predicates),将请求转发到内部对应的微服务(如
/order-api/**
转发到订单服务)。网关还可以承担统一的认证、限流(可集成 Sentinel)、日志记录等职责。 - 配置“公告板” (Nacos Config - Mape 6):所有服务的配置信息(数据库连接、第三方 Key、业务参数等)集中存储在 Nacos 配置中心。服务启动时拉取配置,并通过
@RefreshScope
实现配置的动态更新,无需重启。 - “保险丝”与“交通管制员” (Sentinel - Mape 7):Sentinel 部署在各个服务(包括网关)中,通过配置流控规则防止服务被突发流量打垮,通过熔断降级规则防止服务雪崩。它可以保护 Controller 端点、
@SentinelResource
方法以及 OpenFeign 调用。 - “异步信使” (Spring Cloud Stream + MQ - Mape 8):对于非核心流程或需要解耦的场景(如下单成功后发送通知邮件),订单服务可以将消息发送到 RabbitMQ/Kafka。通知服务作为消费者通过 Spring Cloud Stream 监听 MQ 并处理消息,实现了异步化和削峰填谷。
- “侦探笔记” (Sleuth + Zipkin/SkyWalking - Mape 9):Sleuth 在整个调用链(包括同步 HTTP 和异步消息)中自动传递 Trace ID 和 Span ID,并将 Span 数据上报给 Zipkin。运维人员可以通过 Zipkin UI 查看完整的调用链路、分析耗时、定位故障。
这些组件并非全部必须,可以根据实际业务需求选择性地使用和组合,共同构建了一个功能完善、具备服务治理能力的微服务架构。
二、 部署运维现代化:拥抱 Docker 与 Kubernetes
微服务拆分后,管理大量的服务实例成为新的挑战。传统的手动部署和虚拟机部署方式难以满足快速迭代、弹性伸缩的需求。容器化和容器编排是现代微服务部署运维的主流方案。
1. Docker 容器化:标准化交付与环境一致性
-
核心思想:将应用及其所有依赖(运行时环境、库、配置文件等)打包到一个轻量级、可移植的容器镜像 (Image) 中。这个镜像可以在任何支持 Docker 的机器上以容器 (Container) 的形式运行,保证了开发、测试、生产环境的一致性。
-
Dockerfile: 定义了如何构建 Docker 镜像的指令文件。一个典型的 Spring Boot 应用的 Dockerfile 可能如下:
# 使用一个包含 JDK 的基础镜像 FROM openjdk:11-jre-slim# 设置工作目录 WORKDIR /app# 将构建好的 Spring Boot Fat JAR 复制到容器中 # (假设 target 目录下有名为 my-service.jar 的文件) COPY target/my-service.jar my-service.jar# 暴露应用监听的端口 (如果需要从外部访问) EXPOSE 8080# 容器启动时执行的命令 ENTRYPOINT ["java", "-jar", "my-service.jar"]# (可选) 可以在这里传递 JVM 参数或 Spring Boot 参数 # ENTRYPOINT ["java", "-Xmx512m", "-jar", "my-service.jar", "--spring.profiles.active=prod"]
-
构建与运行:
# 在项目根目录 (Dockerfile 所在目录) 构建镜像 docker build -t my-app/my-service:latest .# 运行容器 docker run -d -p 8080:8080 --name my-service-instance my-app/my-service:latest
-
优势:快速部署、环境隔离、资源利用率高、易于版本控制和回滚。
2. Kubernetes (K8s) 容器编排:自动化管理大规模容器
当容器数量增多时,手动管理容器的部署、扩展、缩容、网络、存储、服务发现、健康检查等变得极其复杂。Kubernetes 是目前最流行的开源容器编排平台,它提供了一整套自动化管理容器化应用的能力。
- 核心概念 (简化):
- Pod: K8s 中最小的部署单元,通常包含一个或多个紧密关联的容器(如应用容器和日志收集 Sidecar)。Pod 内的容器共享网络和存储卷。
- Deployment: 定义了期望的应用状态(如运行多少个 Pod 副本),并负责自动创建、更新、回滚 Pod。
- Service: 为一组 Pod 提供一个稳定的访问入口(虚拟 IP 和 DNS 名称),并实现负载均衡。解决了 Pod IP 动态变化的问题。
- Ingress: (可选) 管理对集群内部 Service 的外部访问,通常提供 HTTP/S 路由、负载均衡、SSL 终止等功能,类似集群级别的 API 网关。
- ConfigMap / Secret: 用于管理应用的配置信息和敏感数据(如密码、API Key),可以挂载到 Pod 中。
- Namespace: 用于在 K8s 集群内部隔离资源(类似 Nacos Namespace)。
- 价值:
- 自动化部署与回滚。
- 服务发现与负载均衡 (K8s Service)。
- 自动弹性伸缩 (Horizontal Pod Autoscaler)。
- 自愈能力 (自动重启失败的容器)。
- 配置与密钥管理。
- 存储编排。
- Spring Cloud Kubernetes: Spring Cloud 提供了
spring-cloud-starter-kubernetes-all
(或单独的kubernetes-discovery
,kubernetes-config
等) 模块,使得 Spring Cloud 应用能够原生集成 K8s:- 可以使用 K8s Service 进行服务发现 (替代 Nacos Discovery)。
- 可以从 K8s ConfigMap/Secret 加载配置 (替代 Nacos Config)。
- 可以利用 K8s 的健康检查机制。
这意味着在 K8s 环境下,你可以选择性地减少对外部 Nacos 等组件的依赖,利用 K8s 自身的能力。
三、 安全性考量:守卫微服务边界与内部调用
微服务架构将安全边界从单体的外围扩展到了每个服务。安全问题变得更加复杂。
- 认证 (Authentication):确认请求者的身份。
- 授权 (Authorization):判断已认证的请求者是否有权限执行某个操作。
常见方案:
- API 网关统一处理:这是最常见的模式。
- 外部请求认证:客户端(Web/App)通常使用 OAuth 2.0 / OpenID Connect (OIDC) 协议与认证服务器 (Authorization Server) (如 Keycloak, Spring Authorization Server, Okta 等) 交互获取 Access Token (通常是 JWT - JSON Web Token)。
- 客户端携带 Token 访问 API 网关。
- API 网关负责校验 Token 的有效性(签名、过期时间等),并可能从中提取用户信息(如用户 ID、角色)。
- 网关可以将认证通过的用户信息(或部分信息)注入到转发给下游微服务的请求头中。
- 可以使用 Spring Security 及其 OAuth2/Resource Server 支持来轻松实现网关的 Token 校验。
- 内部服务间认证/授权:
- 零信任 (Zero Trust):即使是内部服务间的调用,也应该进行认证和授权。
- 方案一:透传 Token:网关校验过的 Token 可以被透传到下游服务,下游服务再进行细粒度的权限校验。
- 方案二:服务间 Token (Client Credentials Flow):服务 A 调用服务 B 时,服务 A 可以使用 OAuth2 的 Client Credentials Flow 向认证服务器申请一个代表自身的 Token,服务 B 校验这个 Token 来确认调用者身份。
- mTLS (Mutual TLS):使用双向 TLS 证书认证,在网络层面保证服务间通信安全(Service Mesh 常用的方式)。
- 细粒度授权:下游业务服务通常需要根据业务逻辑进行更细致的权限判断(如用户是否有权访问某个特定资源)。这通常结合 Spring Security 的方法级安全 (
@PreAuthorize
) 或自定义逻辑实现。
安全性是一个庞大且关键的话题,需要根据具体场景设计合适的方案。
四、 分布式事务:跨服务数据一致性的挑战
当一个业务操作需要跨越多个微服务修改数据时(例如,下单操作需要扣减库存、创建订单、增加积分),如何保证这些操作要么全部成功,要么全部失败(原子性),以维持数据一致性?这就是分布式事务的难题。
传统的数据库事务(ACID)在分布式环境下难以直接应用。常见的分布式事务解决方案模式有:
- 两阶段提交 (2PC / XA):强一致性协议,但存在同步阻塞、单点故障、数据不一致风险,性能较差,实践中较少使用。
- 补偿型事务 (Saga):将长事务拆分为一系列本地事务和对应的补偿操作。如果某个本地事务失败,则依次调用前面已成功事务的补偿操作来回滚。这是最终一致性方案,实现相对灵活,是目前比较主流的方式。
- TCC (Try-Confirm-Cancel):也是补偿型事务,分为 Try(预留资源)、Confirm(确认执行)、Cancel(取消执行)三个阶段。对业务代码侵入性较强。
- 本地消息表 (基于可靠消息):将需要执行的下游操作记录到本地数据库表中(与业务操作在同一本地事务),然后通过消息队列通知下游服务执行。下游服务处理成功后回调或发送确认消息。也是最终一致性方案。
- 最大努力通知:尽力通知下游服务,但不保证一定成功,允许失败。适用于一致性要求不高的场景。
Seata (Simple Extensible Autonomous Transaction Architecture) 是阿里巴巴开源的、生产级的分布式事务解决方案。它提供了对多种模式的支持:
- AT (Automatic Transaction) 模式:基于 2PC 思想,通过代理数据源自动生成补偿 SQL,对业务无侵入(推荐)。
- TCC 模式:需要手动实现 Try, Confirm, Cancel 接口。
- Saga 模式:提供 Saga 状态机引擎来编排事务。
- XA 模式:集成标准 XA 协议。
引入 Seata 可以大大降低实现分布式事务的复杂度,但理解其原理和选择合适的模式仍然重要。
五、 服务网格 (Service Mesh):治理能力的下沉
服务网格 (Service Mesh) 是处理服务间通信的基础设施层。它通过在每个微服务实例旁边部署一个轻量级的网络代理 (Sidecar Proxy)(如 Envoy, Linkerd-proxy),将服务治理的通用能力(如服务发现、负载均衡、熔断、限流、认证、遥测、流量控制等)从业务代码中剥离出来,下沉到这个 Sidecar 代理中。
- 数据平面 (Data Plane):由所有的 Sidecar 代理组成,负责实际的服务间流量转发和策略执行。
- 控制平面 (Control Plane):负责管理和配置所有的 Sidecar 代理(如下发路由规则、安全策略等)。常见的控制平面有 Istio, Linkerd, Consul Connect。
与 Spring Cloud 的关系:
- 目标重叠:Service Mesh 提供的很多治理能力(服务发现、负载均衡、熔断、网关部分功能)与 Spring Cloud 组件的功能是重叠的。
- 实现方式不同:Spring Cloud 通过库 (Library) 的方式将治理能力嵌入到应用代码中(语言绑定,如 Java)。Service Mesh 通过基础设施层 (Sidecar) 实现(语言无关)。
- 选择与融合:
- 对于纯 Java 技术栈且团队熟悉 Spring Cloud,继续使用 Spring Cloud 可能是更自然的选择。
- 对于多语言技术栈、希望将治理能力与业务代码彻底解耦、或希望利用 Service Mesh 更高级的流量管理和安全特性(如 mTLS)的场景,Service Mesh 是更好的选择。
- 也可以混合使用,例如使用 Spring Cloud 进行开发态的服务治理,部署时利用 Service Mesh 的部分能力(如 Istio 的流量管理)。
Service Mesh 是微服务治理的另一个重要发展方向,值得关注。
六、 总结与展望:持续演进的微服务之路
经过这十篇文章的探索,我们系统性地学习了基于 Spring Boot 和 Spring Cloud 构建微服务架构的核心技术体系:
- Spring Boot 提供了快速构建、自动配置的坚实基础。
- Nacos 解决了服务注册发现和分布式配置管理的核心问题。
- OpenFeign 让服务间同步调用变得优雅而简单。
- Spring Cloud Gateway 统一了系统入口,提供了强大的路由和过滤能力。
- Sentinel 为服务提供了流量控制和熔断降级的坚实保障。
- Spring Cloud Stream 简化了构建异步、消息驱动的应用。
- Spring Cloud Sleuth + Zipkin/SkyWalking 赋予了我们洞察分布式调用链的能力。
同时,我们也探讨了微服务的现代化部署 (Docker/K8s)、安全、分布式事务等关键的进阶主题,并了解了服务网格这一新兴的治理模式。
Spring Boot 和 Spring Cloud 生态依然在快速发展:
- 响应式编程 (Reactive):Spring WebFlux, R2DBC, Reactor 等响应式技术栈在性能和资源利用率上展现出优势,Spring Cloud 的很多组件(如 Gateway, Stream)已经原生支持或基于响应式构建。
- 云原生集成 (Cloud Native):与 Kubernetes、Serverless、Service Mesh 等云原生技术的集成将更加深入。
- 可观察性 (Observability):除了 Tracing,Metrics (指标) 和 Logging (日志) 也是可观察性的重要支柱。OpenTelemetry 标准正在统一这三者的数据模型和 API,Spring Boot/Cloud 也在积极拥抱。
- Serverless / FaaS: Spring Cloud Function 等项目探索了在 Serverless 环境下运行 Spring 应用的可能性。
- GraalVM Native Image: 将 Spring Boot 应用编译成本地可执行文件,实现更快的启动速度和更低的内存占用,是未来的一个重要趋势。
掌握 Spring Boot 和 Spring Cloud 是通往现代 Java 后端开发和微服务架构领域的重要一步,但这仅仅是一个开始。技术的道路永无止境,保持好奇心,持续学习,动手实践,才能在不断变化的云原生时代乘风破浪。
感谢你跟随《Spring Boot 与 Spring Cloud 微服务体系深度 Mape》系列走到这里!希望这个系列能为你构建坚实的知识基础,并激发你进一步探索的热情。
相关文章:
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章:经过前九篇 [【深度 Mape 系列】] 的系统学习…...
轻松理解Python装饰器:从基础到应用
一、为什么需要装饰器 想象一下,你写了很多函数来完成不同的任务,突然有个新需求:在每个函数执行前打印一条“函数开始执行”的消息,执行后打印“函数执行结束”。如果没有装饰器,你就得在每个函数里手动添加这两条打…...
RabbitMQ 技术详解:异步消息通信的核心原理与实践
这里写目录标题 RabbitMQ 技术详解:异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置(Maven)2. 消…...
MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性
目录 一,多表查询的分类 角度1:等值连接 vs 非等值连接 角度2:自连接 vs 非自连接 角度3:内连接 vs 外连接 二,SQL92语法实现内连接:见上,略SQL92语法实现外连接:使用 -…...
Selenium文件上传
在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...
getID3获取本地或远程视频时长
音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...
OpenAI流式解析
OpenAI 流式的代码: 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数,用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下,load_…...
在Trae中设置Python解释器版本
Python 是一种广泛使用的高级编程语言,因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展,多个版本相继发布,每个版本都带来了新特性和改进。然而,这也带来了一些问题,比如不同的工程,需要…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
图像数据增强教程:为目标检测任务准备数据
目录 一、简介 二、代码结构 三、环境要求 四、数据增强类 4.1 调整增强概率和参数 4.2 增强方法参数 五、数据增强主函数 六、主函数 效果展示 完整代码 一、简介 在目标检测任务中,数据增强是一种关键技术,通过对原始图像应用多种变换来增加…...
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...
HarmonyOS WebSocket全场景应用开发深度解析
注:适用版本(Harmony OS NEXT / 5.0 / API 12 ) 一、最终效果预览 二、基础代码结构 Entry Component struct ChatApp {State messages: Message[] [] // 所有聊天记录State inputText: string "" // 输入框内容State isCon…...
JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测
JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...
ubuntu 安装 postgresql
在 Ubuntu 系统中安装 PostgreSQL 的步骤如下: 步骤 1:更新软件包列表 sudo apt update步骤 2:安装 PostgreSQL Ubuntu 默认仓库包含 PostgreSQL,直接安装: sudo apt install postgresql postgresql-contrib -ypost…...
深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API
深入实践:基于WebSocket的全球化金融数据实时对接方案 在全球金融市场中,实时数据的高效获取与处理是量化交易、行情监控等场景的核心能力。本文将以技术实践为核心,详细解析如何通过WebSocket技术实现美国、印度、马来西亚等多国金融数据&a…...
深度学习处理时间序列(5)
Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…...
Linux: 进程间通信
目录 一 前言 二 进程间通信目的 三 进程间通信方法 四 管道通信 1. 进程如何通信 2.管道概念 2.1匿名管道 2.2 匿名管道对多个进程的控制 2.3 命名管道 2.4 命名管道原理 一 前言 在我们学习进程的时候,我们知道正是因为程序地址空间的存在ÿ…...
为什么idea显示数据库连接成功,但操作数据库时,两边数据不同步
今日份小bug又叕又来了! 一、原因分析 1. 未提交的事务 - IDEA 中执行了修改操作但未提交事务 - 其他客户端有未提交的修改 2. 连接隔离级别问题 - 不同连接使用了不同的事务隔离级别 - 读未提交(READ UNCOMMITTED)导致看到未提交数据 3. 多客户端同时操作…...
VMware中新建Ubuntu虚拟机系统,并安装Anaconda
详细介绍 Ubuntu18.04版本的安装Anaconda的安装 Ubuntu20.04版本的安装给出其他参考 安装Ubuntu18.04 新建虚拟机 如果不习惯图文形式的,也可参考该up主的环境安装分享,和我如下记录有些不同,但不影响,大部分均一致。 …...
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板 一、揭开 LangChain 的 “灵魂引擎”:Prompt 的核心作用 在 LangChain 构建的智能应用中,Prompt(提示词)堪称驱动大模型的 “神经中枢”。这个承载着任务…...
项目如何安装本地tgz包并配置局部registry
一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤: 1. 全局配置 如果你希望对所有项目生效,可以将这行配置添加到全局.npmr…...
unity客户端面试高频2(自用)
标题是我 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数?2.C智能指针3.左值和右值完美转发 4.深拷贝与浅拷贝5.malloc VS new 你们知道吗 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数? 构造函数不能定义为虚函…...
【12】Ajax的原理和解析
一、前言 二、什么是Ajax 三、Ajax的基本原理 3.1 发送请求 3.2 解析内容 3.3 渲染网页 3.4 总结 四、Ajax 分析 五、过滤请求-筛选所有Ajax请求 一、前言 当我们在用 requests 抓取页面的时候,得到的结果可能会和在浏览器中看到的不一样&a…...
深度学习在测距模型中的应用
一、单目视觉测距和双目视觉测距简介 1、单目视觉测距 模型:深度估计(Depth Estimation) 原理:通过深度学习模型(如MonoDepth2、MiDaS)或传统的计算机视觉方法(如单目相机结合物体大小推断&am…...
Python np.vectorize函数介绍
np.vectorize 是 NumPy 提供的一个 用于将标量函数(scalar function)向量化 的工具,使其可以作用于 NumPy 数组,类似于 通用函数(ufunc) 的行为。 1️⃣ np.vectorize 语法 numpy.vectorize(pyfunc, otypes=None, signature=None, excluded=None, cache=False)📌 参数…...
HarmonyOS NEXT状态管理实践
在HarmonyOS NEXT开发中,状态管理是构建高效、响应式应用的核心。本文深入探讨状态管理的最佳实践,结合代码示例与案例分析,帮助开发者掌握这一关键技能。 一、状态管理装饰器的合理使用 HarmonyOS NEXT提供多种状态管理装饰器,…...
广告牌变“高空炸弹“?智能预警终端筑起安全防线!
近年来,随着城市发展步伐加快,广告牌已成为城市形象的重要载体。但与此同时,因设计缺陷、违规搭建、维护缺失等问题导致的广告牌坠落事故频发,给市民生命财产安全带来严重威胁。据不完全统计,我国2000万块户外广告牌中…...
scss预处理器对比css的优点以及基本的使用
本文主要在vue中演示,scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量,可将常用的值(如颜色、字体大小、间距等)定义为变量,方便重复使用和统一修改。 <template><…...
Redis 单线程
Redis 读写是否是单线程? 核心数据操作仍然是单线程 Redis 主要采用 单线程执行命令,这是因为: 避免加锁:如果多个线程并发修改数据,就需要加锁,而 Redis 采用单线程保证操作的原子性,无需加…...
Node.js 下载安装及环境配置教程、卸载删除环境配置超详细步骤(附图文讲解!) 从零基础入门到精通,看完这一篇就够了
Node.js 安装 一、进入官网地址下载安装包 Node.js — Download Node.js 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位 Tips:如果想下载指定版本,点击【以往的版本】,即可选择自己想要的版本下载 二、安装程序…...
第十五章:Python的Pandas库详解及常见用法
在数据分析领域,Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法,并通过示例代码演示如何使用Pandas进行数据处理。最后,…...
Windows下VSCode的安装
前言 VSCode的安装看起来平平无奇,但也不是轻轻松松的。笔者将最新的Windows下安装VSCode,以及运行最简单的C程序的过程记录下来,供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...
PgDog:一个PostgreSQL分布式集群中间件
PgDog 是一个实现了 PostgreSQL 分片、连接池以及负载均衡功能的中间。PgDog 使用 Rust 语言编写,支持跨平台(Linux、Mac OS、Windows),具有高性能和高可靠性,可以在不需要修改任何应用程序的前提下实现 PostgreSQL 数…...
基于yolov11的棉花品种分类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv11的棉花品种分类检测系统是一种高效、准确的农作物品种识别工具。该系统利用YOLOv11深度学习模型,能够实现对棉花主要品种,包括树棉(G. arboreum)、海岛棉(G. barbadense)、草棉&a…...
Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档
PDF,即Portable Document Format,用于以一种独立于应用程序、硬件、操作系统的方式共享和查看文档;OFD,即Office Open Document Format for Document,是一种在政府公文和法律文件等领域广泛应用的电子文件格式…...
UE4学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针
文章目录 一主菜单搭建UI显示主菜单时,暂停游戏,显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式,放中间 显示主菜单时,暂停游戏࿰…...
多线程 - 线程安全引入
写一个代码,让主线程创建一个新的线程,由新的线程负责完成一系列的运算(比如:1 2 3 ... 1000),再由主线程负责获取到最终结果。 但打印结果为 result 0,略微思考,明白了要让 t 线…...
Angular项目改端口号
在 Angular 项目中修改开发服务器的端口号(默认是 4200),可以通过以下几种方式实现: 方法 1:通过 ng serve 命令行参数 直接在运行 ng serve 时指定端口号: ng serve --port 4300效果:开发服务…...
论文内可解释性分析
目录 3 TEPM(Text-Enhanced Prototype Module)3.1 为什么要进行文本增强?(动机)3.2 为什么要使用 Concat(Fv, T) 和 Repeat(T) + Fv?3.3 为什么 Q=F_C,K=V=F_R ?(第一层注意力)3.4 为什么要进行两层注意力?3.5 为什么最终结果会更好?**3.6 面试官可能问的挑战性问题*…...
《C++11:通过thread类编写C++多线程程序》
关于多线程的概念与理解,可以先了解Linux下的底层线程。当对底层线程有了一定程度理解以后,再学习语言级别的多线程编程就轻而易举了。 【Linux】多线程 -> 从线程概念到线程控制 【Linux】多线程 -> 线程互斥与死锁 语言级别的…...
@Resource 与 @Autowired:Spring 中的依赖注入注解大比拼
在 Spring 框架中,依赖注入(DI)是核心功能之一,它允许开发者将组件之间的依赖关系交给 Spring 容器管理,从而实现解耦和更灵活的代码结构。Resource 和 Autowired 是两种常用的依赖注入注解,它们虽然功能相…...
大模型学习:从零到一实现一个BERT微调
目录 一、准备阶段 1.导入模块 2.指定使用的是GPU还是CPU 3.加载数据集 二、对数据添加词元和分词 1.根据BERT的预训练,我们要将一个句子的句头添加[CLS]句尾添加[SEP] 2.激活BERT词元分析器 3.填充句子为固定长度 代码解释: 三、数据处理 1.…...
Git和GitCode使用(从Git安装到上传项目一条龙)
第一步 菜鸟教程-Git教程 点击上方链接,完成Git的安装,并了解Git 工作流程,知道Git 工作区、暂存区和版本库的区别 第二步 GitCode官方帮助文档-SSH 公钥管理 点击上方链接,完成SSH公钥设置 第三步(GitCode的官方引…...
NodeJs之http模块
一、概念: 1、协议:双方必须共同遵从的一组约定。 Hypertext Transfer Protocol:HTTP,超文本传输协议 2、请求: ① 请求报文的组成: 请求行请求头空行请求体 ② 请求行: 请求方法URLHTTP版本…...
【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)
为了求解损失函数 对 的导数,并利用最小二乘法向量形式求解 的值 这是线性回归的平方误差损失函数,目标是最小化预测值 与真实值 之间的差距。 损失函数: 考虑多个样本的情况,损失函数为所有样本的平方误差之和&a…...
在word中使用zotero添加参考文献并附带超链接
一、引言 在写大论文时,为了避免文中引用与文末参考文献频繁对照、修改文中引用顺序/引用文献时手动维护参考文献耗易出错,拟在 word 中使用 zotero 插入参考文献,并为每个参考文献附加超链接,实现交互式阅读。 版本:…...
在Linux系统中将html保存为PNG图片
1 前言 之前使用Pyecharts库在Windows系统中生成图表并转换为PNG格式图片(传送门),现将代码放于Linux服务器上运行,结果发现错误,生成html文件之后无法保存图片。 2 原理 基于Selenium库的保存方案,其原…...
presto任务优化参数
presto引擎业内通常用它来做即席查询,它基于内存计算效率确实快,不过它自身的任务优化参数比较杂,不同类型的catalog能用的参数不完全一样,在官网上倒是可以看到相关资料,配置文件中写的见https://prestodb.io/docs/cu…...
uniapp + Axios + 小程序封装网络请求
前言 小程序自带的网络请求使用起来比较麻烦,不便于管理,就需要封装网络请求,减少繁琐步骤,封装最终效果,根据类别将网络请求封装在文件中,使用得时候调用文件名名称加文件中得自定义名称,就可…...
《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 1 环境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix网络规划(用你们自己的特征网段规划) 主机名 IP 功能 备注 zbx6svr 19…...