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

16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Github Action

GitHub Actions 是 GitHub 提供的持续集成和持续部署(CI/CD)平台,它允许我们自动化软件开发工作流程。通过 GitHub Actions,我们可以构建、测试和部署代码,而无需手动干预。

一、基本概念

1.1 Workflow(工作流)

工作流是 GitHub Actions 中最核心的概念,它定义了一个完整的自动化流程。每个工作流都是由 YAML 格式的配置文件定义的,这些文件必须存储在仓库的 .github/workflows 目录下。工作流文件使用声明式语法,让开发者能够清晰地描述整个自动化过程中的每个步骤。通过工作流,我们可以实现代码提交后的自动构建、测试、部署等一系列操作,大大提高了开发效率。

工作流的触发机制非常灵活,可以通过多种事件来启动,比如代码推送(push)、拉取请求(pull request)、定时任务(schedule)等。每个工作流可以包含多个作业(job),这些作业可以并行执行以提高效率,也可以设置依赖关系按顺序执行。工作流还支持条件执行,可以根据不同的分支、标签或其他条件来决定是否执行某些作业,这为不同环境下的自动化处理提供了很大的灵活性。

在微服务架构中,工作流的作用更加突出。由于微服务架构包含多个独立的服务,每个服务都需要独立的构建和部署流程。通过合理配置工作流,我们可以为每个微服务定制专门的自动化流程,包括代码质量检查、单元测试、集成测试、容器镜像构建以及部署等步骤。这不仅确保了每个服务的质量,还大大减少了手动操作的工作量,使得整个微服务系统的维护和更新变得更加高效和可靠。

1.2 Job(作业)

作业(Job)是 GitHub Actions 工作流中的一个核心执行单元,它由一组相关的步骤(Steps)组成。每个作业都代表了自动化流程中的一个独立任务,比如代码构建、单元测试或部署等。作业的设计理念是将复杂的工作流程分解成多个独立且可管理的单元,这种模块化的方式不仅提高了工作流的可维护性,还使得整个自动化过程更加清晰和高效。在实际应用中,我们可以根据项目的具体需求来设计作业,确保每个作业都能专注于完成特定的任务。

作业的一个重要特征是它们在同一个运行器(Runner)上执行。运行器可以是 GitHub 提供的托管运行器,也可以是自托管的运行器。在同一个运行器上执行意味着作业中的所有步骤共享相同的执行环境,这确保了步骤之间的上下文一致性。例如,如果一个步骤在构建过程中生成了某些文件,后续的步骤可以直接访问这些文件。这种设计简化了作业内部步骤之间的数据传递和状态共享,同时也提供了更好的性能和资源利用率。运行器的选择会直接影响作业的执行效率和可用资源,因此在配置作业时需要根据实际需求选择合适的运行器类型。

GitHub Actions 支持作业的并行和顺序执行,这为工作流的优化提供了极大的灵活性。在并行执行模式下,多个作业可以同时运行,这大大缩短了整个工作流的执行时间。例如,在微服务架构中,我们可以同时构建和测试多个独立的服务。而顺序执行则允许我们设置作业之间的依赖关系,确保某些作业必须在其他作业完成后才能开始。这对于那些有严格执行顺序要求的场景非常重要,比如需要先完成测试才能进行部署的情况。通过合理配置作业的执行策略,我们可以在保证工作流正确性的同时,最大化自动化流程的执行效率。

1.3 Step(步骤)

步骤(Step)是 GitHub Actions 工作流中最基本的执行单元,它代表了作业中的一个具体任务或操作。每个步骤都是按照严格的顺序依次执行的,这确保了工作流程的可预测性和可靠性。步骤可以执行多种类型的操作,最常见的是运行命令行指令和使用预定义的 action。通过命令行指令,我们可以执行几乎任何需要的操作,比如编译代码、运行测试、部署应用等。而使用预定义的 action 则可以快速集成常用的功能,如检出代码、设置开发环境、发布构建产物等。步骤的执行结果会直接影响整个作业的状态,如果某个步骤失败,默认情况下后续步骤将不会执行,这有助于及时发现和定位问题。

在微服务架构的开发过程中,步骤的设计尤为重要。每个步骤都需要明确的目标和清晰的输出,这样可以更好地监控和调试整个工作流程。例如,在构建微服务时,我们可能需要设置多个步骤来完成代码检出、依赖恢复、编译构建、运行测试、构建容器镜像、推送镜像等任务。每个步骤都可以配置自己的环境变量、工作目录和条件判断,这种灵活性使得我们能够根据不同服务的特点定制最适合的构建流程。此外,步骤之间还可以共享数据和状态,这为复杂工作流的实现提供了便利。通过合理组织和配置步骤,我们可以构建出高效、可靠的自动化流程,显著提升微服务开发和部署的效率。

1.4 Action(动作)

Action 是 GitHub Actions 中最基础和灵活的可重用构建块。它们就像是预先打包好的功能模块,可以被工作流中的任何步骤直接调用和使用。每个 Action 都被设计为完成一个特定的任务,比如检出代码、设置运行环境、构建和测试代码等。Action 的可重用性使得开发者不必重复编写相同的自动化逻辑,大大提高了工作流的开发效率。GitHub 的 Marketplace 中提供了大量由社区贡献的 Action,涵盖了软件开发生命周期中的各个环节。这些现成的 Action 可以直接集成到工作流中,为开发者节省了大量开发和维护成本。

通过组合不同的 Action,我们可以创建功能强大的自定义工作流。每个 Action 都可以接收输入参数并产生输出,这种输入输出机制使得 Action 之间能够进行数据传递和交互。例如,我们可以先使用 checkout action 检出代码,然后使用 setup-dotnet action 配置 .NET 环境,接着使用自定义的 build action 进行代码构建。这种模块化的组合方式不仅让工作流的配置变得更加清晰和易于维护,还提供了极大的灵活性。开发者可以根据项目的具体需求,选择合适的 Action 进行组合,或者开发自己的 Action 来扩展工作流的功能。在微服务架构中,这种灵活性尤其重要,因为不同的服务可能需要不同的构建和部署流程。

从技术实现的角度来看,Action 可以通过两种方式来创建:JavaScript 文件或 Docker 容器。JavaScript 类型的 Action 直接运行在工作流的运行器环境中,执行速度较快,适合实现一些轻量级的功能。这类 Action 可以充分利用 GitHub Actions 提供的工具包(toolkit)来简化开发。而 Docker 容器类型的 Action 则提供了更大的灵活性,因为容器可以包含任何所需的运行时环境和依赖。这使得 Docker Action 特别适合那些需要特定环境或有复杂依赖要求的任务。无论选择哪种实现方式,Action 都需要遵循特定的目录结构和配置格式,并且必须包含一个 action.yml 文件来定义其元数据、输入参数和输出变量。这种标准化的结构确保了 Action 可以被其他开发者轻松理解和使用。

二、工作流示例

在微服务架构中,持续集成和持续部署(CI/CD)是保证系统稳定性和开发效率的关键。以下将展示一个典型的 .NET 项目工作流配置示例,该工作流实现了代码的自动构建和测试。这个工作流配置虽然看起来简单,但包含了 CI/CD 流程中最基础和最重要的环节,可以作为更复杂工作流的基础模板。通过这个示例,我们可以了解 GitHub Actions 的基本用法,以及如何将其应用到实际的 .NET 项目开发中。

name: .NET Core Build and Teston:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Setup .NETuses: actions/setup-dotnet@v3with:dotnet-version: '8.0.x'- name: Restore dependenciesrun: dotnet restore- name: Buildrun: dotnet build --no-restore- name: Testrun: dotnet test --no-build --verbosity normal

让我们详细解析这个工作流配置文件的结构和各个组成部分。首先,工作流通过 name 字段定义了一个清晰的名称 “.NET Core Build and Test”。在 on 部分,我们定义了工作流的触发条件 - 当有代码推送(push)到 main 分支或者创建针对 main 分支的拉取请求(pull request)时,工作流就会被触发执行。这种配置确保了每次代码变更都会经过自动化的构建和测试流程,从而及时发现潜在的问题。在 jobs 部分,我们定义了一个名为 build 的作业,它在 ubuntu-latest 环境中运行。这个作业包含了多个按顺序执行的步骤(steps),每个步骤都完成特定的任务。

三、常用功能

3.1 环境变量

在 GitHub Actions 中配置环境变量是一项重要的基础功能,它能帮助我们更好地管理和复用配置信息。环境变量可以在不同的作用域级别进行定义:工作流级别(workflow)、作业级别(job)和步骤级别(step)。在工作流文件中,我们使用 env 关键字来声明环境变量。工作流级别的环境变量在整个工作流的所有作业中都可以访问,而作业级别的环境变量则只在特定作业内可见。这种层次化的设计让我们能够更精确地控制变量的可见范围。除了静态的字符串值外,环境变量还可以引用 GitHub 提供的上下文变量,如 github.sha(获取提交哈希值)、github.ref(获取分支或标签信息)等。这些动态值使得我们的工作流配置更加灵活和智能。此外,对于敏感信息,我们可以使用 GitHub 的 Secrets 功能来存储(如下图),然后在环境变量中通过 ${{ secrets.SECRET_NAME }} 的方式安全地引用。

在这里插入图片描述

在实际使用中,环境变量的引用语法是 ${{ env.变量名 }}。这种语法在 YAML 文件的任何位置都可以使用,使得配置文件更加简洁和可维护。例如,我们可以定义 .NET 版本和构建配置这样的常用变量,然后在多个步骤中重复使用。这不仅减少了重复代码,还使得版本升级变得更加容易 - 只需要修改一处定义即可。当我们需要在不同环境(如开发、测试、生产)中使用不同的配置值时,可以结合 GitHub Actions 的环境功能,为每个环境定义专属的环境变量集合。这样的配置方式既保持了灵活性,又确保了配置的可维护性。以下是一个典型的环境变量配置示例,它定义了 .NET 版本和构建配置:

env:DOTNET_VERSION: '8.0.x'CONFIGURATION: 'Release'
3.2 条件执行

GitHub Actions 的条件执行功能是工作流自动化中的一个重要特性,它允许我们基于特定条件来控制工作流中步骤或作业的执行。条件执行主要通过 if 语句来实现,可以使用多种上下文变量和表达式来构建复杂的条件逻辑。最常见的使用场景是基于分支名称、事件类型或其他 GitHub 事件上下文来控制执行流程。例如,if: github.ref == 'refs/heads/main' 这个条件表达式确保相关步骤或作业只在 main 分支上执行。这种机制特别适用于需要在不同分支上执行不同操作的场景,比如只在主分支上进行部署,或者在特性分支上执行额外的测试。除了分支判断,我们还可以使用其他条件表达式,如 github.event_name(事件类型)、github.actor(触发事件的用户)等,这些都为工作流的精确控制提供了强大的支持。

在实际开发中,条件执行还可以与环境变量、GitHub Secrets 和其他上下文信息结合使用,构建更复杂的执行逻辑。例如,我们可以使用 contains() 函数检查提交消息是否包含特定关键词,使用 startsWith() 函数检查标签前缀,或者使用 &&|| 运算符组合多个条件。一个典型的应用是在发布流程中,可能需要检查当前是否是发布标签(如 if: startsWith(github.ref, 'refs/tags/v')),是否在主分支上(if: github.ref == 'refs/heads/main'),以及是否是由授权用户触发(if: github.actor == 'authorized-user')。这些条件可以组合使用,例如:if: github.ref == 'refs/heads/main' && github.event_name == 'push',确保只有在满足所有指定条件时才执行相应的步骤。这种灵活的条件控制机制使得我们能够构建既安全又高效的自动化工作流程。

3.3 矩阵构建

矩阵构建是 GitHub Actions 中一个强大的功能特性,它允许我们使用单个工作流配置在多个不同的环境中运行相同的作业。这种方式特别适合需要在不同操作系统、运行时版本或其他变量组合下进行测试和构建的场景。通过矩阵构建,我们可以确保应用程序在各种目标环境中都能正常工作,从而提高软件的兼容性和可靠性。在配置文件中,矩阵构建通过 strategy.matrix 来定义,可以指定多个变量及其可能的值,GitHub Actions 会自动创建所有可能的组合并并行执行。

矩阵构建的一个重要优势是它能显著减少配置文件的重复内容。例如,如果我们需要在三个不同的 .NET 版本和两个不同的操作系统上测试应用,传统方式需要手动编写六个独立的作业配置。而使用矩阵构建,我们只需要定义一次作业配置,然后指定变量的可能值,GitHub Actions 就会自动生成所有需要的组合。这不仅使配置文件更加简洁,也更容易维护。当需要添加新的测试环境时,只需要在矩阵定义中添加相应的值即可。以下是一个基本的矩阵构建配置示例:

strategy:matrix:dotnet: ['6.0.x', '7.0.x', '8.0.x']os: [ubuntu-latest, windows-latest]

这段代码定义了 GitHub Actions 中的矩阵构建策略。矩阵构建是一种强大的功能,允许我们使用单个工作流配置在多个不同的环境中运行相同的作业。

  1. strategy 关键字

    • 这是 GitHub Actions 工作流中的一个顶级配置项
    • 用于定义作业的执行策略,包括矩阵构建、失败策略等
  2. matrix 配置

    • 定义了构建矩阵,即所有可能的组合
    • 在这个例子中,定义了两个变量:dotnetos
  3. 变量定义

    • dotnet: ['6.0.x', '7.0.x', '8.0.x']:指定了三个 .NET 版本
    • os: [ubuntu-latest, windows-latest]:指定了两个操作系统环境

当这个矩阵策略被应用时,GitHub Actions 会自动创建并执行 6 个不同的作业组合:

  • .NET 6.0.x 在 ubuntu-latest 上执行
  • .NET 6.0.x 在 windows-latest 上执行
  • .NET 7.0.x 在 ubuntu-latest 上执行
  • .NET 7.0.x 在 windows-latest 上执行
  • .NET 8.0.x 在 ubuntu-latest 上执行
  • .NET 8.0.x 在 windows-latest 上执行

这种配置特别适用于:

  • 跨平台测试:确保应用在不同操作系统上都能正常工作
  • 多版本兼容性测试:验证应用在不同 .NET 版本上的兼容性
  • 并行测试:所有组合可以并行执行,大大缩短总体测试时间

在微服务架构中,这种矩阵构建策略非常有用,因为不同的微服务可能需要支持不同的 .NET 版本,微服务可能需要在不同的操作系统环境中运行,通过一次配置,可以全面测试所有可能的组合,确保系统的兼容性和稳定性

四、实际应用场景

4.1 自动发布 NuGet 包

在微服务架构中,组件的共享和复用是提高开发效率的关键因素。通过将公共功能封装为NuGet包,我们可以在不同的微服务项目中轻松引用和使用这些功能。以下是一个自动发布NuGet包的GitHub Actions工作流示例,它会在推送带有版本标签的代码时自动构建并发布NuGet包:

name: Publish NuGet Packageon:push:tags:- 'v*'jobs:publish:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- uses: actions/setup-dotnet@v3with:dotnet-version: '8.0.x'- run: dotnet pack- run: dotnet nuget pushenv:NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

这段代码是一个 GitHub Actions 工作流配置文件,用于自动发布 NuGet 包。工作流名称为 “Publish NuGet Package”,它会在推送带有版本标签(以 ‘v’ 开头的标签,如 v1.0.0)的代码时自动触发。工作流包含一个名为 “publish” 的作业,该作业在 ubuntu-latest 环境中运行。作业中的步骤包括:首先使用 actions/checkout@v3 检出代码,然后使用 actions/setup-dotnet@v3 设置 .NET 8.0.x 环境,接着执行 dotnet pack 命令打包项目,最后通过 dotnet nuget push 命令将包推送到 NuGet 仓库。在推送过程中,工作流使用了一个名为 NUGET_API_KEY 的密钥,该密钥存储在 GitHub 的 Secrets 中,通过 ${{ secrets.NUGET_API_KEY }} 的方式安全引用,确保敏感信息不会被泄露。这种自动化发布流程特别适合微服务架构中的共享组件管理,可以确保每次版本更新都能自动构建并发布到 NuGet 仓库,方便其他微服务项目引用和使用。

4.2 Docker 镜像构建

在微服务架构中,Docker容器化是标准部署方式,通过GitHub Actions可以实现Docker镜像的自动构建和推送。以下是一个基本的Docker镜像构建工作流配置,它会在每次向main分支推送代码时自动触发:

name: Build and Push Docker Imageon:push:branches: [ main ]jobs:docker:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Build and pushuses: docker/build-push-action@v4with:context: .push: truetags: your-registry/your-image:latest

这段代码是一个 GitHub Actions 工作流配置文件,用于自动构建和推送 Docker 镜像。工作流名称为 “Build and Push Docker Image”,它会在每次向 main 分支推送代码时自动触发。工作流包含一个名为 “docker” 的作业,该作业在 ubuntu-latest 环境中运行。作业中的步骤包括:首先使用 actions/checkout@v3 检出代码,然后使用 docker/build-push-action@v4 动作来构建和推送 Docker 镜像。在构建和推送过程中,工作流指定了构建上下文为当前目录(context: .),启用了推送功能(push: true),并设置了镜像标签为 your-registry/your-image:latest。这种自动化 Docker 镜像构建和推送流程特别适合微服务架构中的容器化部署,可以确保每次代码更新都能自动构建最新的 Docker 镜像并推送到指定的镜像仓库,方便后续的部署和扩展。在实际应用中,我们需要将 your-registry/your-image:latest 替换为我们实际的镜像仓库地址和镜像名称,并可能需要配置 Docker 仓库的认证信息。

五、总结

GitHub Actions 作为 GitHub 提供的持续集成和持续部署(CI/CD)平台,在微服务架构中发挥着至关重要的作用。通过工作流(Workflow)、作业(Job)、步骤(Step)和动作(Action)等核心概念,我们可以构建出高效、可靠的自动化流程。在微服务架构中,GitHub Actions 能够为每个独立的服务定制专门的自动化流程,包括代码质量检查、单元测试、集成测试、容器镜像构建以及部署等步骤。通过环境变量、条件执行和矩阵构建等高级功能,我们可以实现更加灵活和智能的自动化流程。特别是在 NuGet 包发布和 Docker 镜像构建方面,GitHub Actions 提供了简单而强大的配置方式,使得微服务组件的共享和部署变得更加高效。通过合理配置 GitHub Actions,我们不仅确保了每个服务的质量,还大大减少了手动操作的工作量,使得整个微服务系统的维护和更新变得更加高效和可靠,为微服务架构的成功实施提供了坚实的技术支持。

相关文章:

16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--Github Action

GitHub Actions 是 GitHub 提供的持续集成和持续部署(CI/CD)平台,它允许我们自动化软件开发工作流程。通过 GitHub Actions,我们可以构建、测试和部署代码,而无需手动干预。 一、基本概念 1.1 Workflow(工作流) 工作…...

‌MySQL 事务隔离级别详解

‌ 以下是 MySQL 支持的四种事务隔离级别及其特性,按并发安全性从低到高排列: ‌1. 读未提交 (Read Uncommitted)‌ ‌问题‌: ‌脏读 (Dirty Read)‌:事务可读取其他事务未提交的数据。‌不可重复读 (Non-repeatable Read)‌&am…...

A. Ambitious Kid

time limit per test 1 second memory limit per test 256 megabytes Chaneka, Pak Chaneks child, is an ambitious kid, so Pak Chanek gives her the following problem to test her ambition. Given an array of integers [A1,A2,A3,…,AN][A1,A2,A3,…,AN]. In one o…...

C19-while循环及for循环等价引入

一 while的表达式 //while的表达式有三个 #include <stdio.h> int main() { int sum; int data1; //第一个表达式,条件的初始值while(data<100){ //第二个表达式,条件的临界值sumsumdata;data; //第三个表达式,条件变化}printf("0至100的和是:%d\n",sum);…...

华为盘古OS深度评测:构建AI自进化系统的实践密码

华为盘古OS通过分布式AI内核与自适应学习框架的深度耦合&#xff0c;重新定义操作系统级智能能力。实测显示其AI任务调度效率较传统系统提升17倍&#xff0c;本文从智能体编排、持续学习机制、端云协同架构三个维度&#xff0c;解析如何基于DevKit 3.0打造具备认知进化能力的下…...

SpringBoot UserAgentUtils获取用户浏览器 操作系统设备统计 信息统计 日志入库

介绍 UserAgentUtils 是于处理用户代理&#xff08;User-Agent&#xff09;字符串的工具类&#xff0c;一般用于解析和处理浏览器、操作系统以及设备等相关信息&#xff0c;这些信息通常包含在接口请求的 User-Agent 字符串中。 这个库可以用于解析用户代理头&#xff0c;以提…...

PCL绘制点云+法线

读取的点云ASCII码文件&#xff0c;每行6个数据&#xff0c;3维坐标3维法向 #include <iostream> #include <fstream> #include <vector> #include <string> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pc…...

DataStreamAPI实践原理——计算模型

引入 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在 无边界 和 有边界 数据流上进行有状态的计 算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。Flink可以处理批数据也可以处理流数据&#xff0c;本质上&#xff0c;流处理…...

【那些年踩过的坑】Docker换源加速详细教程(截至2025年4月)

由于各种网络政策&#xff0c;在国内访问DockerHub速度会非常缓慢&#xff0c;大家一般都会采取更换镜像源的方式来进行加速。但是&#xff0c;2024.6之后&#xff0c;由于政策的加强&#xff0c;大部分常见的镜像源已经无法使用&#xff0c;可能在更换镜像源后出现如下报错信息…...

【MCP】详细了解MCP协议:和function call的区别何在?如何使用MCP?

本文介绍了MCP大模型上下文协议的的概念&#xff0c;并对比了MCP协议和function call的区别&#xff0c;同时用python sdk为例介绍了mcp的使用方式。 1. 什么是MCP&#xff1f; 官网&#xff1a;https://modelcontextprotocol.io/introduction 2025年&#xff0c;Anthropic提出…...

交换机之配置系统基本信息(Basic Information of the Configuration System for Switches)

交换机之配置系统基本信息 本文章中的信息都是基于一些特定实验环境写的。文章中使用的所有设备最初均采用缺省配置启动。如果不按初始配置&#xff0c;有可能会导致本文中的部分或全部步骤失败。如果您使用的是真实网络设备&#xff0c;请确保您已经了解所有使用过的命令影响。…...

贝叶斯算法学习

贝叶斯算法学习 贝叶斯算法基础与原理应用场景主要分类优缺点​简单示例代码实现 贝叶斯算法是基于贝叶斯定理的一种统计学习方法&#xff0c;在机器学习、数据挖掘、自然语言处理等领域有广泛应用。以下是其原理、应用和示例的详细介绍&#xff1a; 贝叶斯算法基础与原理 贝…...

Java 日志:掌握本地与网络日志技术

日志记录是软件开发中不可或缺的一部分&#xff0c;它为开发者提供了洞察应用程序行为、诊断问题和监控性能的手段。在 Java 生态系统中&#xff0c;日志框架如 Java Util Logging (JUL)、Log4j 和 Simple Logging Facade for Java (SLF4J) 提供了丰富的功能。然而&#xff0c;…...

线程池单例模式

线程池的概念 线程池是一种线程使用模式。 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。…...

物联网安全解决方案介绍:有效利用现有的下一代防火墙

管理物联网设备安全的挑战 如今,随着IoT(物联网)的普及,可以集中管理相机、打印机、传感器、电器、机床等各种设备,并分析和有效利用从这些设备收集的数据。这些设备已成为商业环境中不可或缺的一部分,但设备的多样化使其难以管理。与PC、服务器和网络设备不同,识别物联…...

Java社区门诊系统源码 SaaS医院门诊系统源码 可上线运营

Java社区门诊系统源码 SaaS医院门诊系统源码 医院门诊系统适用于&#xff1a;社区卫生服务站、门诊部、诊所、村卫生室等&#xff0c;有上百家医疗机构正常使用&#xff1b;包括医保结算。 系统功能 &#xff08;一&#xff09;后端管理系统功能 用户管理&#xff1a;提供用…...

如何在 Windows 10 中使用 WSL 和 Debian 安装 Postgresql 和 Postgis

安装 Postgresql 和 Postgis 的常规方法需要设置多个二进制文件&#xff0c;并且工作流程通常在图形用户界面 (GUI) 上进行。我们希望找到一种在 Windows 10 中安装 Postgresql 和 Postgis 的方法&#xff0c;同时保留 Linux 的 shell 体验。本教程展示了在 Windows 10 中的 De…...

[论文解析]Mip-Splatting: Alias-free 3D Gaussian Splatting

Mip-Splatting: Alias-free 3D Gaussian Splatting 论文地址&#xff1a;https://arxiv.org/abs/2403.17888 源码地址&#xff1a;https://github.com/autonomousvision/mip-splatting 项目地址&#xff1a;https://niujinshuchong.github.io/mip-splatting/ 论文解读 两个主…...

MongoDB 入门使用教程

MongoDB 入门使用教程 MongoDB 是一个开源的 NoSQL 数据库&#xff0c;使用文档&#xff08;JSON-like&#xff09;存储数据&#xff0c;与传统的关系型数据库不同&#xff0c;它不依赖表结构和行列的约束。MongoDB 提供了强大的查询能力&#xff0c;支持高效的数据存储和检索…...

PowerBI动态路径获取数据技巧

PowerBI动态路径获取数据技巧 场景一&#xff1a;同事接力赛——不同电脑共用模板 &#xff08;想象一下&#xff1a;小王做完报表要传给小李&#xff0c;结果路径总对不上怎么办&#xff1f;&#xff09; 这种情况就像接力赛交接棒&#xff0c;每台电脑的账户名不同&#xff0…...

【数据结构】优先级队列

目录 1. 优先级队列概念 2. 优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 向下调整的时间复杂度 2.3.2 建堆时间复杂度 2.3.3 向上调整的时间复杂度 2.4 堆的插入与删除 3. 堆的应用 4. 常用接口介绍 4.1 PriorityQueue的特性 4.2 Pri…...

Myweb项目——面试题总结

一.项目描述 项⽬概述&#xff1a;本项⽬在云服务上开发了⼀个后端服务器与前端⻚⾯为⼀体的⾳乐专辑 鉴赏⽹站&#xff0c;旨在为⽤⼾提供丰富的⾳乐专辑信息展⽰和优 质的浏览体验。 主要内容及技术&#xff1a; 后端开发&#xff1a;利⽤ C 语⾔构建后端服务器&#xff0c;…...

用高德API提取广州地铁线路(shp、excel)

目录 结果示例html文件——直观看出输出的效果excel文件——包括地铁的具体信息完整代码网络上现有的地铁数据要么过于老旧且不便于更新,要么过于定制化限定于具体的城市无法灵活调整得到自己真正想要的那部份数据。而使用高德的API可以非常方便得到全国各地的地铁数据,而且可…...

leetcode110 平衡二叉树

一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度&#xff1a;指从该节点到叶子节点的最长简单路径边的条数。 递归&#xff1a;…...

二、信息时代社会结构的转变

到了信息时代,以及在核武器的前提下,上述的社会结构的逻辑,就有了一个根 本性的转变,就是暴力的成本和收益,都在下降。 暴力的成本在降低。比如说枪支,它的制造和分发都变得非常容易。现在我们都 知道有 3D 打印,它就好像工业时代的印刷机,印刷圣经或者书籍,使知识更加 普及和容…...

Vue2+ElementUI实现无限级菜单

使用Vue2和ElementUI实现无限级菜单,通常菜单数据以树形结构存储,每个菜单包含多个子菜单 ,子菜单又可以继续包含更深层次的子菜单项。所以,需要使用递归形式,完成子项菜单的渲染。 这里,结合Element UI界面的el-menu和el-submenu组件来构建菜单结构,有子菜单时使用el-s…...

YTJ笔记——FFT、NCC

FFT算法 快速傅里叶算法 为了计算两个多项式相乘&#xff08;卷积&#xff09;&#xff0c;将多项式系数表示法转换成点值表示法 F(g(x)∗f(x))F(g(x))F(f(x)&#xff09; 超详细易懂FFT&#xff08;快速傅里叶变换&#xff09;及代码实现_傅立叶变换编程-CSDN博客 NCC算法…...

模型 隐含前提

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。隐藏的思维地基&#xff0c;决策的无声推手。 1 隐含前提模型的应用 1.1 金融投资决策—科技股估值隐含前提的验证 行业&#xff1a;金融投资 应用方向&#xff1a;投资逻辑验证 背景解读&#xff1…...

大模型微调与蒸馏的差异性与相似性分析

大模型微调与蒸馏的差异性分析 一、定义与核心目标差异 大模型微调 在预训练大模型基础上&#xff0c;通过少量标注数据调整参数&#xff0c;使模型适应特定任务需求。核心目标是提升模型在特定领域的性能&#xff0c;例如医疗影像分析或金融预测。该技术聚焦于垂直场景的精度…...

Ubuntu下安装vsode+qt搭建开发框架(一)

Ubuntu下安装vsode+qt搭建开发框架(一) g++的编译环境,这里不介绍,可点击这里查看 查看一下当前的g++环境 g++ --version g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copyin…...

单片机-89C51部分:3、创建工程

飞书文档https://x509p6c8to.feishu.cn/wiki/Mzhnwb1qni6YkykJtqXc17XMnre 创建工程 首先创建一个文件夹&#xff0c;用来存放工程文件&#xff0c;文件夹名称最好为英文&#xff0c;例如Demo1。 打开软件KEIL&#xff0c;上方菜单栏选择Project ->new uVision Project&am…...

从零实现 registry.k8s.io/pause:3.8 镜像的导出与导入

以下是为 registry.k8s.io/pause:3.8 镜像的导出与导入操作定制的完整教程&#xff0c;适用于 Kubernetes 集群中使用 containerd 作为容器运行时的场景。本教程包含详细步骤、常见问题解析及注意事项。 从零实现 registry.k8s.io/pause:3.8 镜像的导出与导入 背景说明 Kuber…...

详解Adobe Photoshop 2024 下载与安装教程

Adobe Photoshop下载安装和使用教程 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作&#xff0c…...

thinking-intervention开源程序用于DeepSeek-R1等推理模型的思维过程干预,有效控制推理思考过程

一、软件介绍 文末提供程序和源码下载 thinking-intervention开源程序用于DeepSeek-R1等推理模型的思维过程干预&#xff0c;有效控制推理思考过程。基于论文 《Effectively Controlling Reasoning Models through Thinking Intervention》 实现的思维干预技术&#xff0c;用于…...

Qt 5.15 编译路径吐槽点

在Qt 5.15以前&#xff0c;勾选“Shadow build”会自动将编译文件放在同一个目录下&#xff08;区分编译器类型、Qt版本、debug和release等&#xff09;&#xff0c;可将代码文件和编译文件区分开&#xff0c;用户不用操心。但是奇葩的是&#xff0c;这个功能Qt 5.15居然失效了…...

【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现

在机器学习的世界里&#xff0c;线性回归是最基础也是最常用的算法之一。作为预测分析的基石&#xff0c;简单线性回归为我们理解更复杂的模型提供了完美的起点。无论你是机器学习的新手还是希望巩固基础的老手&#xff0c;理解简单线性回归都至关重要。本文将带你全面了解简单…...

【MCP Node.js SDK 全栈进阶指南】中级篇(5):MCP客户端高级开发

在前面的系列文章中,我们主要关注了服务器端的开发,包括基础服务器构建、资源设计、身份验证与授权以及错误处理与日志系统。本篇文章将转向客户端,探讨MCP TypeScript-SDK在客户端开发中的高级应用。 客户端开发是MCP应用的重要组成部分,它连接了用户与服务器,提供了交互…...

RASP技术在DevOps中的安全应用

随着新技术的不断演进&#xff0c;DevOps开发模式不断被利用&#xff0c;Web应用程序的开发相比过往更高效。随之而来的是保护这些应用程序同样面临着巨大挑战&#xff0c;黑客的攻击手段不断多变&#xff0c;而DevOps团队成员却不都是安全专家&#xff0c;难以保证应用程序的安…...

2025.04.26-饿了么春招笔试题-第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 魔法网格变换计数 问题描述 LYA是一位魔法研究学者,她正在研究一种特殊的魔法网格。这个网格有 n n n...

Linux线程与进程:探秘共享地址空间的并发实现与内

Linux系列 文章目录 Linux系列前言一、线程的概念二、线程与地址空间2.1 线程资源的分配2.2 虚拟地址到物理地址的转换 三 、线程VS进程总结 前言 在Linux操作系统中&#xff0c;线程作为CPU调度的基本单位&#xff0c;起着至关重要的作用。深入理解线程控制机制&#xff0c;是…...

数据结构手撕--【堆】

目录 ​编辑 定义结构体&#xff1a; 初始化&#xff1a; 插入数据&#xff1a; 删除&#xff1a; 取堆顶元素&#xff1a; 堆销毁&#xff1a; 判断堆是否为空&#xff1a; TopK问题&#xff1a; 堆其实是完全二叉树 物理结构&#xff1a;二叉树的层序遍历&#xff08…...

MySQL基本命令--系统+用户+表

前言&#xff1a;在当今数据驱动的时代&#xff0c;关系型数据库依然是构建信息系统的中坚力量&#xff0c;而MySQL作为开源领域中最广泛使用的数据库管理系统之一&#xff0c;以其高性能、稳定性和易用性赢得了开发者和企业的青睐。无论是在小型博客系统中承担数据存储职责&am…...

4.23-4.26学习总结 HTML—CSS常见标签和样式

页部导航栏&#xff1a; flex样式&#xff1a; 表单标签&#xff1a; &#xff08;25行是设置点击按钮&#xff09; 表单项标签&#xff1a; 搜索表单区域&#xff1a; 底部版权区域&#xff1a; 总结&#xff1a;...

使用Django框架表单

使用Django框架表单 文章目录 使用Django框架表单[toc]1.使用Form类构建表单2.表单字段与Widget控件 1.使用Form类构建表单 【创建项目和应用】 PS C:\Users\ls> cd E:\Python\ PS E:\Python> django-admin.exe startproject FormSite PS E:\Python> cd .\FormSite\…...

OpenCV第6课 图像处理之几何变换(缩放)

1.简述 图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。几何变换并不改变图像的像素值,只是在图像平面上进行像素的重新安排。 根据OpenCV函数的不同,本节课将映射关系划分为缩放、翻转、仿射变换、透视等。 2.缩放 2.1 函数…...

Python AI图像生成方案指南

1. 简介 AI图像生成是当前最热门的AI应用领域之一&#xff0c;Python提供了多种工具和库来实现这一功能。本指南将介绍几种主流的AI图像生成方案及其Python实现方法。 2. 主流AI图像生成技术 2.1 生成对抗网络(GANs) 原理&#xff1a;由生成器和判别器组成的对抗系统 特点&am…...

【C++】stack、queue和priority_queue的模拟实现

文章目录 前言一. stack1.1 stack的介绍1.2 stack的使用1.3 stack的模拟实现 二. queue2.1 queue的介绍2.2 queue的使用2.3 queue的模拟实现 三. deque3.1 deque的原理介绍3.2 deque的缺陷3.3 为什么选择deque作为stack和queue的底层默认容器 四. priority_queue&#xff08;优…...

Jmeter数据库url开关设置+常用Beanshell

1、数据库url开关设置 &#xff08;79 90&#xff09; jdbc:mysql://test.lemonban.com:3306/future?allowMultiQueries-true&characterEncodingUTF-8 多条查询开关&#xff1a;allowMultiQueriestrue 字符集配置:characterEncodingUTF-8 2、用BeanShell提取Map中的方…...

NtripShare 2025第一季度主要技术进展

GNSS方面 1、开源GNSS接收机配置软件基础版本。 2、商业版本GNSS接收机配置软件&#xff0c;增加PPP、文件保存、前端解算&#xff08;静态、RTK-Static&#xff09;&#xff0c;前端坐标转换。 3、GNSS接收机配置软件全面适配米尔T133i硬件方案。 视觉检测方面 1、做出第…...

Linux系统编程之内存映射

概述 内存映射是操作系统提供的一种机制&#xff0c;使得文件或设备的内容可以直接映射到进程的虚拟地址空间中。这意味着&#xff0c;我们可以像访问数组一样读写文件内容&#xff0c;而不需要显式地调用I/O函数进行数据传输。内存映射适用于多种应用场景&#xff0c;包括但不…...