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

微服务 - 中级篇

微服务 - 中级篇

  • 一、微服务架构深化
    • (一)服务拆分原则
    • (二)服务通信方式
  • 二、微服务技术选型
    • (一)开发框架
    • (二)容器技术
  • 三、微服务实践与优化(后续会详细分析)

一、微服务架构深化

(一)服务拆分原则

1.业务功能内聚性

  • 核心概念是将逻辑上紧密关联的业务功能组合在一个微服务中。以电商系统为例,用户管理模块包含用户注册、登录、个人信息修改、密码重置等功能。这些功能围绕用户实体展开,相互之间存在紧密的业务逻辑联系。将它们整合在用户管理微服务中,使得该微服务成为一个独立的业务单元,具备清晰的边界和职责。这种内聚性设计有助于提高代码的可维护性和可理解性。开发人员在维护用户管理相关功能时,只需关注这个特定的微服务,而不必在庞大的单体应用代码库中四处寻找相关代码片段。
  • 在实现过程中,要深入分析业务流程。比如在一个在线教育平台中,课程管理功能包括课程创建、编辑、发布、下架以及课程详情展示等。这些功能紧密围绕课程这一业务对象,应归属于课程管理微服务。通过合理的代码分层和模块化设计,将这些功能的实现代码组织在一起,例如在Java 的 Spring Boot 框架中,可以通过不同的 Service 类和 Controller类来分别处理业务逻辑和对外接口,确保整个微服务的结构清晰。

2.数据独立性

  • 每个微服务拥有独立的数据存储是微服务架构的重要特性。以电商系统的订单微服务和商品微服务为例,订单微服务维护自己的订单数据库,存储订单的详细信息,如订单编号、下单时间、用户信息、商品清单、订单状态等。商品微服务则有自己的商品数据库,存储商品的名称、描述、价格、库存等信息。这种设计避免了不同微服务对同一数据的直接访问,降低了数据一致性问题的复杂性。例如,如果订单微服务和商品微服务共享一个数据库,当商品信息发生变化时,可能会导致订单微服务读取到不一致的数据,影响订单处理流程。
  • 在技术实现上,订单微服务可以使用关系型数据库如 MySQL 来存储订单数据,通过 ORM(对象关系映射)框架如 MyBatis 将Java 对象与数据库表进行映射。商品微服务则可以根据业务需求选择不同的存储方案,对于一些需要快速查询商品信息的场景,可以使用 Redis等缓存数据库来存储商品的基本信息,同时使用关系型数据库存储商品的详细描述等不常变动的数据。并且,每个微服务负责自己数据的完整性和一致性维护,通过事务管理等机制确保数据操作的原子性。

3.演进性

  • 业务在不断发展变化,微服务架构需要具备良好的演进性。在设计微服务拆分时,要充分考虑未来业务的扩展方向。例如,一个社交媒体平台最初可能只提供用户发布文字动态、点赞和评论的功能。随着业务发展,计划增加短视频发布、直播等功能。在最初的微服务设计中,就应将用户动态相关功能设计成具有扩展性的微服务结构。可以将用户动态发布功能设计成一个独立的微服务,其接口设计具有一定的通用性,能够方便地扩展支持短视频、直播等新类型的动态发布。这样,当业务扩展时,只需在该微服务基础上进行功能增强,而不需要大规模地重构整个系统架构。
  • 在实践中,可以采用领域驱动设计(DDD)的方法来帮助实现演进性。通过对业务领域的深入分析,识别出核心领域模型和边界上下文。以在线旅游平台为例,酒店预订和机票预订可以看作是两个不同的边界上下文,分别设计成独立的微服务。随着业务拓展到旅游套餐预订等新领域,可以基于已有的领域模型和设计思路,在合适的边界上下文中添加新的微服务或扩展现有微服务,确保系统能够适应业务的不断变化。

(二)服务通信方式

1.RESTful API

  • RESTful API 基于 HTTP协议,具有简洁、通用、可读性强的特点,在微服务通信中广泛应用。它遵循一套统一的资源访问规范,通过不同的 HTTP方法来操作资源。例如,在一个博客系统中,要获取一篇博客文章的详情,可以使用 GET 请求,请求 URL为/api/blogs/{blogId},其中{blogId}是博客文章的唯一标识符。服务器接收到请求后,根据blogId从数据库中查询相应的博客文章信息,并以JSON 或 XML 格式返回给客户端。如果要创建一篇新的博客文章,则使用 POST 请求,将新文章的内容以 JSON格式放在请求体中发送到/api/blogsURL。
  • 在实现 RESTful API 时,要遵循一些最佳实践。首先,URL设计要简洁且具有语义化,能够清晰地表示所操作的资源。例如,对于用户资源的操作,/api/users表示用户集合,/api/users/{userId}表示单个用户。其次,合理使用HTTP 状态码来表示请求的处理结果,如 200 表示请求成功,404 表示资源未找到,500 表示服务器内部错误等。在 Java 的Spring Boot 框架中,通过@RestController注解和相关的 HTTP请求映射注解(如@GetMapping、@PostMapping等)可以方便地实现 RESTful API。

2.消息队列

  • 消息队列在微服务架构中用于异步通信,能有效解耦服务之间的依赖关系。以电商系统为例,当用户下单后,订单微服务创建订单记录,并将一个包含订单信息的消息发送到消息队列,如RabbitMQ。库存微服务监听该消息队列,当接收到订单消息后,从消息中解析出商品信息,然后进行库存扣减操作。这种方式避免了订单服务直接调用库存服务的接口,减少了服务之间的直接依赖。如果库存服务暂时不可用,订单服务发送的消息会在消息队列中等待,不会影响订单的创建流程,提高了系统的可靠性和可扩展性。
  • 在技术选型方面,RabbitMQ功能丰富,支持多种消息协议和灵活的路由策略。它适用于对消息可靠性要求较高、需要复杂消息路由的场景。Kafka则具有高吞吐量、低延迟的特点,适合处理大数据量的实时消息流,例如在日志收集系统中,各个微服务产生的日志消息可以通过 Kafka进行快速传输和处理。在使用消息队列时,要注意消息的持久化、消息顺序性以及消息重复消费等问题。例如,可以通过设置 RabbitMQ的队列和消息属性来保证消息的持久化,通过合理的分区和消费者组设计来处理消息顺序性和重复消费问题。

3.gRPC

  • gRPC 基于 HTTP/2协议,具有高性能、轻量级的优势,尤其适用于对性能要求苛刻的场景,特别是跨语言的微服务通信。在一个大型分布式系统中,可能存在多种编程语言开发的微服务,如Java、Python、Go 等。gRPC 使用 Protobuf(ProtocolBuffers)作为接口定义语言,它能够将接口定义编译成不同语言的代码,实现跨语言的无缝通信。例如,一个由 Java开发的用户认证微服务和一个由 Go 开发的业务逻辑微服务之间需要进行通信。通过 gRPC,首先定义一个用户认证的接口.proto文件,然后使用 Protobuf 编译器生成 Java 和 Go 版本的接口代码。在 Java 微服务中实现接口的服务端逻辑,在 Go微服务中生成客户端代码来调用该接口。

  • gRPC 的性能优势主要体现在它的二进制序列化格式比 JSON 等文本格式更紧凑,传输效率更高,并且 HTTP/2 协议支持多路复用、头部压缩等特性,减少了网络开销。在实际应用中,对于一些实时性要求高、数据传输量大的场景,如视频流处理系统中的微服务通信,gRPC 能够显著提高系统的性能和响应速度。同时,gRPC 还提供了服务发现、负载均衡等功能的支持,方便与其他微服务组件集成。

二、微服务技术选型

(一)开发框架

1.Spring Boot

  • Spring Boot 极大地简化了 Spring 应用程序的开发和配置过程,遵循约定大于配置的原则。在构建微服务时,开发人员无需手动编写大量繁琐的 XML 配置文件。例如,要创建一个简单的用户管理微服务,使用 Spring Boot 只需要引入相关的依赖,如 Spring Web Starter 用于处理 HTTP 请求,Spring Data JPA Starter 用于数据库访问。然后通过创建 Java 配置类和相关的 Controller、Service、Repository 类来实现业务逻辑。在配置类中,使用@SpringBootApplication注解来启动 Spring Boot 应用,该注解包含了@EnableAutoConfiguration(自动配置)、@ComponentScan(组件扫描)等多个重要注解,自动完成了大部分的 Spring 框架配置工作。
  • Spring Boot 提供了丰富的 starter 依赖,方便集成各种功能。例如,要集成 MySQL 数据库,只需在pom.xml文件中添加spring - boot - starter - data - jpa和mysql - connector - java依赖,Spring Boot 会自动根据配置文件中的数据库连接信息进行数据源的配置和初始化。对于安全性方面,可以引入spring - boot - starter - security依赖来快速实现用户认证和授权功能。这种一站式的开发体验使得开发人员能够快速搭建微服务架构,专注于业务逻辑的实现。

2.Spring Cloud

  • Spring Cloud 是基于 Spring Boot 构建的一整套微服务解决方案。它提供了多个核心组件来支持微服务架构的各个方面。例如,Eureka 作为服务注册与发现组件,微服务在启动时会向 Eureka Server 注册自己的服务实例信息,包括服务名称、IP 地址、端口等。其他微服务通过 Eureka Client 从 Eureka Server 获取服务列表,实现服务的动态发现和调用。在一个分布式电商系统中,订单微服务、商品微服务等都可以注册到 Eureka Server 上,当订单微服务需要调用商品微服务的接口获取商品信息时,它可以从 Eureka Server 获取商品微服务的实例地址,然后进行远程调用。
  • Spring Cloud 还包括 Hystrix 熔断器组件,用于防止微服务之间的级联故障。当某个微服务出现故障或响应超时等情况时,Hystrix 会自动熔断,不再将请求转发到故障服务,而是返回一个预先定义好的降级响应,保证系统的部分功能仍然可用。例如,在旅游预订系统中,如果酒店预订微服务出现故障,Hystrix 可以对调用酒店预订微服务的请求进行熔断,同时提供一个降级方案,如提示用户稍后重试,避免因酒店预订微服务的故障导致整个旅游预订流程的崩溃。此外,Spring Cloud 还提供了配置管理(Spring Cloud Config)、网关(Spring Cloud Gateway)等组件,全面支持微服务架构的构建和运行。

3.Quarkus

  • Quarkus 是专为云原生和微服务架构设计的 Java 框架,具有快速启动和低内存占用的显著优势。在传统的 Java 应用开发中,启动时间长和内存占用高是常见问题,尤其在容器化部署的微服务环境中,这些问题会影响系统的资源利用率和快速弹性伸缩能力。Quarkus 通过采用多种优化技术,如编译期优化、AOT(Ahead - Of - Time)编译等,极大地缩短了应用的启动时间。例如,一个基于 Quarkus 开发的微服务在容器中启动可能只需要几百毫秒,而传统的 Spring Boot 应用可能需要几秒甚至更长时间。
  • 在内存占用方面,Quarkus 通过对依赖的精简和优化,以及对运行时资源的高效管理,使得应用在运行时的内存消耗大幅降低。这对于在资源有限的云环境中部署大量微服务非常有利。例如,在一个使用 Kubernetes 进行容器编排的云平台上,基于 Quarkus 的微服务可以在相同的硬件资源下部署更多的实例,提高了系统的整体性能和资源利用率。同时,Quarkus 对多种 Java 生态系统中的技术栈都有良好的支持,如 JPA、RESTEasy 等,方便开发人员将现有的 Java 技术和知识应用到基于 Quarkus 的微服务开发中。

(二)容器技术

1.Docker

  • Docker 通过将应用程序及其所有依赖项打包成一个独立的容器,实现了环境的一致性和隔离性。以一个 Python Web 应用为例,该应用依赖于特定版本的 Python 解释器、Flask 框架以及一些数据库驱动库。使用 Docker,可以创建一个 Dockerfile,在其中定义基础镜像(如 Python 官方镜像),然后通过一系列指令安装应用所需的依赖项,复制应用代码到容器中,并设置容器的启动命令。例如:
# 使用Python 3.8官方镜像作为基础镜像
FROM python:3.8 - slim# 设置工作目录
WORKDIR /app# 复制requirements.txt文件并安装依赖
COPY requirements.txt.
RUN pip install -r requirements.txt# 复制应用代码到容器中
COPY. /app# 暴露应用运行的端口
EXPOSE 5000# 设置容器启动命令
CMD ["python", "app.py"]
  • 通过上述 Dockerfile 构建的 Docker 镜像,可以在任何支持 Docker 的环境中运行,无论是开发人员的本地机器、测试服务器还是生产环境的云服务器,都能保证应用运行环境的一致性,避免了 “在我机器上能运行,在其他环境不行” 的问题。同时,容器之间相互隔离,一个容器的故障或资源消耗不会影响其他容器,提高了应用的稳定性和安全性。

2.Kubernetes

  • Kubernetes 是用于容器编排和管理的强大工具。在一个包含大量微服务容器的生产环境中,Kubernetes 可以实现容器的自动化部署、扩展和故障转移。例如,在一个电商促销活动期间,订单量会大幅增加,通过 Kubernetes 可以根据预先设定的规则,自动增加订单微服务的容器实例数量,以应对高并发的订单请求。当某个订单微服务容器出现故障时,Kubernetes 会自动检测到,并将流量从故障容器转移到其他正常运行的容器上,同时启动新的容器来替换故障容器,保证订单处理业务的连续性。
  • Kubernetes 通过一系列的资源对象来管理容器,如 Pod(容器的逻辑分组,一个 Pod 可以包含一个或多个紧密相关的容器)、Deployment(用于管理 Pod 的生命周期,包括创建、更新、扩展等)、Service(为一组 Pod 提供统一的访问入口,实现负载均衡和服务发现)等。在部署微服务时,首先创建一个 Deployment 来定义微服务容器的配置和副本数量,然后创建一个 Service 将该 Deployment 暴露给其他微服务或外部客户端。例如,通过创建一个 Nginx Ingress Controller 和相应的 Ingress 资源,可以将外部的 HTTP 请求路由到内部的不同微服务的 Service 上,实现统一的入口管理和域名映射。

三、微服务实践与优化(后续会详细分析)

1.服务注册与发现

  • 服务注册与发现是微服务架构中的关键环节。以 Consul 为例,它是一个分布式服务发现和配置管理工具。在一个由多个微服务组成的系统中,每个微服务在启动时会向 Consul Server 注册自己的服务实例信息。例如,一个由 Java 开发的用户微服务,在启动过程中,通过 Consul Client 将自己的服务名称(如user - service)、IP 地址、端口以及一些健康检查信息(如 HTTP 健康检查 URL)发送到 Consul Server。Consul Server 维护一个服务注册表,记录所有注册的服务及其实例信息。
  • 当其他微服务需要调用用户微服务时,它们通过 Consul Client 从 Consul Server 查询user - service的服务实例列表。Consul Client 可以根据负载均衡策略(如轮询、随机等)选择一个可用的用户微服务实例进行调用。同时,Consul Server 会定期对注册的服务实例进行健康检查,如果发现某个实例不健康(如 HTTP 健康检查失败),会将其从服务注册表中移除,避免其他微服务调用到故障实例。这种服务注册与发现机制使得微服务架构具有动态性和灵活性,方便服务的扩展和维护。

2.负载均衡

  • 负载均衡是提高微服务系统并发处理能力和可用性的重要手段。Nginx 作为常用的服务端负载均衡器,可以将客户端的请求均匀地分发到多个微服务实例上。例如,在一个 Web 应用中,Nginx 部署在前端,接收来自用户的 HTTP 请求。它通过配置文件定义了后端的微服务实例列表,如upstream user_service_backend { server 192.168.1.100:8080; server 192.168.1.101:8080; },这里定义了两个用户微服务实例。当用户请求到达 Nginx 时,Nginx 根据配置的负载均衡算法(如轮询算法,依次将请求发送到不同的后端服务器)将请求转发到其中一个用户微服务实例上。
  • 在客户端负载均衡方面,Ribbon 是 Spring Cloud 中的一个组件,它与 Eureka 等服务注册与发现组件紧密集成。当一个微服务(如订单微服务)需要调用另一个微服务(如商品微服务)时,Ribbon 作为客户端负载均衡器,从 Eureka Server 获取商品微服务的实例列表,然后根据内置的负载均衡算法(如随机算法、加权轮询算法等)选择一个商品微服务实例进行调用。这种客户端负载均衡方式使得负载均衡决策分布在各个调用微服务的客户端,减轻了服务端负载均衡器的压力,并且可以根据客户端的实际情况进行更灵活的负载均衡策略调整。

3.熔断器

  • Hystrix 作为熔断器组件,在微服务架构中起到了保护系统免受级联故障影响的重要作用。当一个微服务(如 A 微服务)调用另一个微服务(如 B 微服务)时,如果 B 微服务出现故障或响应超时的次数达到一定阈值,Hystrix 会自动熔断,不再将请求转发到 B 微服务。例如,在一个旅游预订系统中,酒店预订微服务调用第三方酒店接口获取酒店信息。如果第三方接口出现故障,大量的请求在等待响应,可能会导致酒店预订微服务的线程资源耗尽,进而影响整个旅游预订系统的其他功能。Hystrix 在检测到这种情况后,会快速熔断,不再向第三方接口发送请求。

相关文章:

微服务 - 中级篇

微服务 - 中级篇 一、微服务架构深化(一)服务拆分原则(二)服务通信方式 二、微服务技术选型(一)开发框架(二)容器技术 三、微服务实践与优化(后续会详细分析)…...

多语言生成语言模型的少样本学习

摘要 大规模生成语言模型,如GPT-3,是极具竞争力的少样本学习模型。尽管这些模型能够共同表示多种语言,但其训练数据以英语为主,这可能限制了它们的跨语言泛化能力。在本研究中,我们在一个涵盖多种语言的语料库上训练了…...

基于Python+Django的旅游管理系统

项目介绍 PythonDjango旅游管理系统 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括:首页、景点管理、门票管理、旅游资讯、在线反馈、。 - 后台功能包…...

七桥问题与一笔画问题:图论的奠基石

七桥问题与一笔画问题:图论的奠基石 目录 历史背景问题描述数学模型化欧拉的解决方案欧拉定理及证明一笔画问题现代应用总结 历史背景 18世纪的哥尼斯堡(今俄罗斯加里宁格勒)是一座被普雷格尔河分割的城市,河中有两个岛屿&…...

好吧好吧,看一下达梦的模式与用户的关系

单凭个人感觉,模式在达梦中属于逻辑对象合集,回头再看资料 应该是一个用户可以对应多个模式 问题来了,模式的ID和用户的ID一样吗? 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…...

Qt开发:QComboBox的使用

文章目录 一、概述二、QComboBox添加数据三、常用函数四、信号与槽函数 一、概述 QComboBox 是 Qt 提供的一个下拉列表控件,它允许用户从预定义的选项中进行选择,同时也支持手动输入自定义内容(如果启用了可编辑模式)。QComboBox…...

Manacher 马拉车算法

Manacher 马拉车算法 5. 最长回文子串 - 力扣(LeetCode) 马拉车算法是目前解决寻找字符串中最长的回文子串时间复杂度最低的算法(线性O(n)). 中心扩散法 初始化一个长度与字符串 s 相等的 臂长数组 arr 和 最长臂长 max 与 最…...

centos7搭建postgresql12主从

主从搭建 192.168.159.101 node1 主库(读写) 192.168.159.102 node2 备库(只读) 两台机器首先安装postgrsql 主库 postgres用户操作: 修改postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外…...

VL开源模型实现文本生成图片

一、 基础知识 根据描述生成图片的视觉-语言模型(Vision-Language Models, VL 模型)是近年来多模态生成领域的热点研究方向。这些模型能够根据自然语言描述生成高质量的图像,广泛应用于艺术创作、设计辅助、虚拟场景构建等领域。 1 根据描述…...

动态规划——分组背包问题

动态规划——分组背包问题 分组背包问题分组背包思路分组背包OJ分组背包OJ汇总 分组背包问题 N件物品和一个容量为V的背包。第i件物品的体积是w[i],价值是v[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入…...

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解题思路2. 代码实现 题目链接:3495. Minimum Operations to Make Array Elements Zero 1. 解题思路 这一题的话核心就是统计对任意自然数 n n n,从 1 1 1到 n n n当中所有的数字对…...

STM32 —— MCU、MPU、ARM、FPGA、DSP

在嵌入式系统中,MCU、MPU、ARM、FPGA和DSP是核心组件,各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念: 一、 MCU(Microcontroller Unit,微控制器单元) 核心定义 集成系统芯片&a…...

Linux高级IO

五种IO模型 具象化理解 IO:等 数据拷贝 read/recv: 1、等 - IO事件就绪 - 检测功能成分在里面 2、数据拷贝 问:什么叫做高效的IO? 答:单位时间,等的比重越小,IO的效率越高。 IO模型&am…...

机器人的手眼标定——机器人抓取系统基础系列(五)

机器人的手眼标定——机器人抓取系统基础系列(五) 前言一、机器人标定相关概念1.1 内参标定和外参标定1.2 Eye-in-Hand 和 Eye-to-Hand1.3 ArUco二维码和棋盘格标定区别 二、机器人标定基本原理2.1 机器人抓取系统坐标系2.2 标定原理 三、标定步骤和注意…...

Android 图片加载框架:Picasso vs Glide

引言 在 Android 开发中,图片加载是移动应用的核心功能之一。合理选择图片加载框架不仅能提升用户体验,还能优化内存管理和应用性能。本文将深入对比 Picasso 和 Glide 两大主流框架,结合代码示例分析它们的差异、工作原理及优化策略。 1. …...

uniapp从 vue2 项目迁移到 vue3流程

以下是必须为迁移到 vue3 进行调整的要点,以便 vue2 项目可以在 vue3 上正常运行。 1. 在index.js中创建应用程序实例 // Before - Vue 2 import Vue from vue import App from ./App // with no need for vue3 Vue.config.productionTip false // vue3 is no lon…...

DeepSeek R1 本地部署指南 (2) - macOS 本地部署

上一篇: DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 1.安装 Ollama Ollama https://ollama.com/ 点击 Download - Download for macOS 解压下载 zip 启动程序 3. 选择版本 DeepSeek R1 版本 deepseek-r1 https://ollama.com/library/deepseek-r1 模…...

DeepSeek技术架构解析:MoE混合专家模型

一、前言 2025年初,DeepSeek V3以557万美元的研发成本(仅为GPT-4的1/14)和开源模型第一的排名,在全球AI领域掀起波澜。其核心创新之一——混合专家模型(Mixture of Experts, MoE)的优化设计,不…...

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现,好处是可以直接利用Helvum…...

2025年2月-3月后端go开发找工作感悟

整体感悟 目标 找工作首先要有一个目标,这个目标尽可能的明确,比如我要字节、拼多多之类的公司,还是要去百度、滴滴这样的,或者目标是创业公司。但是这个目标是会动态调整的,有可能我们的心态发生了变化,一…...

OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...

【极速版 -- 大模型入门到进阶】快速了解大型语言模型

文章目录 🌊 大模型作为一种生成式人工智慧,厉害在哪儿?-> 通用能力🌊 LLM 如何生成输出:简而言之就是文字接龙🌊 GPT 之前 ...:模型规模和数据规模概览🌊 ChatGPT 有三个训练阶段…...

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…...

牛客网【模板】二维差分(详解)c++

题目链接:【模板】二维差分 1.题目分析 类比一下,因为差分因为差分是在数组里的某一段同时加上一个K二维是在二维数组中选择一个词矩阵,让词矩阵中每一个元素都加上一个K 2.算法原理 解法-:暴力解法 -> 模拟 你告诉我一个左上角和右下…...

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文, 本文所使用的 Trae 免费下载链接: www.trae.ai/?utm_source… 前言 大家好,我是小Q,字节跳动近期推出了一款 AI IDE—— Trae,由国人团队开发,并且限时免费体…...

【清华大学】AIGC发展研究(3.0版)

目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容(一)文本生成(二)图像生成(三)音乐生成(四)视频生成 五、各行业应用六、未来展望 AIGC发展研究…...

Kafka--常见问题

1.为什么要使用 Kafka,起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统,它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输,每秒可以处理数百万条消息。它能够在处理大量并发请求时,保持低延迟和…...

maptalks图层交互 - 模拟 Tooltip

maptalks图层交互 - 模拟 Tooltip 图层交互-模拟tooltip官方文档 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>图层交互 - 模拟 Tooltip</title><style typet…...

【前端】Visual Studio Code安装配置教程:下载、汉化、常用组件、基本操作

文章目录 一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感谢观看&#xff01; 一、Visual Studio Code下载 下载官网&#xff1a;https://code.visualstudio.com/ 进入官网后点击右上角的Download &…...

datetime“陷阱”与救赎:扒“时间差值”证道

时间工具陷阱&#xff0c;其实是工具引用的误解。 笔记模板由python脚本于2025-03-23 23:32:58创建&#xff0c;本篇笔记适合时间工具研究的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Pyth…...

3DMAX曲线生成器插件CurveGenerator使用方法

1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具&#xff0c;用户可以通过简单的UI界面输入参数&#xff0c;快速生成多条样条线。每条样条线的高度值随机生成&#xff0c;且可以自定义以下参数&#xff1a; 顶点数量&#xff1a;每条…...

Apache漏洞再现

CVE-2021-41773路径穿越漏洞 1、开环境 sudo docker pull blueteamsteve/cve-2021-41773:no-cgid sudo docker run -dit -p 8082:80 blueteamsteve/cve-2021-41773:no-cgid 2、访问8082端口 3、打开工具 4、输入网址&#xff0c;检测漏洞...

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(11)

7.3. 查询计划相关操作符 98&#xff09;Table Scan&#xff1a;该操作符从查询计划参数列确定的表中获取所有数据行。如果其参数列中出现WHERE:()谓词&#xff0c;则只返回满足该谓词的数据行。该操作符为逻辑操作符和物理操作符。该操作符具体如图7.3-98节点1所示。 图 7.3-…...

编译原理——词法分析

文章目录 词法分析&#xff1a;从基础到自动构造一、词法分析程序的设计一、词法分析程序的设计二、PL/0编译程序中词法分析程序的设计与实现1. 语法特定考量2. 通过状态转移表运用有限状态自动机3. 示例代码片段&#xff08;用于说明的伪代码&#xff09; 三、单词的形式化描述…...

Linux内核,内存分布

x86_64的物理地址范围为64bit&#xff0c;但是因为地址空间太大目前不可能完全用完&#xff0c;当前支持57bit和48bit两种虚拟地址模式。 地址模式单个空间用户地址空间内核地址空间32位2G0x00000000 - 0x7FFFFFFF0x80000000 - 0xFFFFFFFF64位(48bit)128T0x00000000 00000000 …...

AI鸟类识别技术革新生态监测:快瞳科技如何用“智慧之眼”守护自然?

在生态环境保护日益受关注的今天&#xff0c;“鸟类识别”已从专业科研工具演变为推动生态治理数字化的核心技术。无论是湿地保护区的珍稀候鸟监测&#xff0c;还是城市机场的鸟击风险预警&#xff0c;AI技术的精准赋能正在改写人类与自然的互动方式。作为行业领先的智能解决方…...

c++之set

一、set特性及用途&#xff1f; 唯一性&#xff1a;set 中的元素是唯一的&#xff0c;不会存在重复的元素。自动排序&#xff1a;set 中的元素会自动按照默认的升序规则进行排序。底层实现&#xff1a;set 通常基于红黑树实现&#xff0c;具有自平衡功能&#xff0c;因此插入、…...

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek 通义万相制作AI视频流程 4.1 D…...

【操作系统】自旋锁和互斥锁

自旋锁和互斥锁是用于多线程同步的两种常见锁机制&#xff0c;主要区别在于等待锁的方式和适用场景。以下是它们的对比分析&#xff1a; 1. 等待机制 自旋锁&#xff08;Spinlock&#xff09;互斥锁&#xff08;Mutex&#xff09;线程通过 忙等待&#xff08;Busy-Wait&#x…...

人工智能在医疗影像诊断中的应用与实践

引言 随着人工智能技术的飞速发展&#xff0c;其在医疗领域的应用逐渐成为研究和实践的热点。特别是在医疗影像诊断方面&#xff0c;人工智能技术凭借其强大的数据处理能力和模式识别能力&#xff0c;为提高诊断效率和准确性带来了新的希望。本文将探讨人工智能在医疗影像诊断中…...

Java中synchronized 和 Lock

1. synchronized 关键字 工作原理 对象锁&#xff1a;在Java中&#xff0c;每个对象都有一个与之关联的监视器锁&#xff08;monitor lock&#xff09;。当一个线程尝试进入由 synchronized 保护的代码块或方法时&#xff0c;它必须首先获取该对象的监视器锁。如果锁已经被其…...

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端&#xff1f;2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…...

qt 对QObject::tr()函数进行重定向

在 Qt 中&#xff0c;QObject::tr() 函数用于国际化&#xff08;i18n&#xff09;&#xff0c;它用于标记需要翻译的字符串。通常情况下&#xff0c;tr() 函数会从翻译文件&#xff08;如 .qm 文件&#xff09;中查找对应的翻译字符串。如果你希望重定向 tr() 函数的行为&#…...

C#基础学习(三)值类型和引用类型:编程世界的“现金“ vs “银行卡“,以及string这个“渣男“的叛变行为

开场白 各位程序猿/媛们&#xff0c;今天我们来聊一聊编程世界里的"金钱观"。 你以为只有人类会纠结现金和存款的区别&#xff1f;不不不&#xff0c;C#中的值类型和引用类型每天都在上演这场大戏&#xff01; 而我们的string同学&#xff0c;表面是…...

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…...

如何设置sudo权限

打开终端&#xff1a;按 Ctrl Alt T 打开终端。 编辑 sudoers 文件&#xff1a; 使用 visudo 命令编辑 /etc/sudoers 文件&#xff08;visudo 会检查语法&#xff0c;避免错误&#xff09;&#xff1a; sudo visudo 添加用户权限&#xff1a; 在文件中找到以下行&#xff1…...

Codeforces Round 1012 (Div. 2) 3.23

文章目录 2025.3.23 Div2B. Pushing Balls&#xff08;暴力&#xff09;代码 C. Dining Hall题意思路代码 2025.3.23 Div2 Dashboard - Codeforces Round 1012 (Div. 2) - Codeforces B. Pushing Balls&#xff08;暴力&#xff09; 题意很好懂&#xff0c;每一行每一列从左…...

langfuse追踪Trace

介绍 &#x1f9e0; Langfuse 是什么&#xff1f; Langfuse 是一个专门为 LLM 应用&#xff08;如 OpenAI / LangChain / 自定义 Agent&#xff09; 设计的 观测与追踪平台&#xff08;Observability Platform&#xff09;。 简单说&#xff0c;它就像是你为 AI 应用插上的 “…...

Java-模块二-2

整数类型 byte&#xff1a;在 Java 中占用8位&#xff08;1字节&#xff09;&#xff0c;因此它的取值范围是从 -128 到 127。这是最小的整数类型&#xff0c;适合用于节省空间的情况。 short&#xff1a;这种类型的大小是16位&#xff08;2字节&#xff09;&#xff0c;允许的…...