16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--微服务的部署与运维
部署与运维是微服务架构成功实施的关键环节。一个良好的部署与运维体系能够保障微服务的高可用性、可扩展性和可靠性。在这一阶段,重点包括微服务的容器化与编排、API 网关的实现以及日志与监控体系的建设。
一、容器化与编排
1.1 使用 Docker 容器化微服务
容器化是实现微服务独立部署的基础。通过 Docker,将每个微服务连同其运行环境和依赖打包成独立的容器,从而实现“一次构建,到处运行”。容器化的主要步骤包括:
- 创建 Dockerfile:为每个微服务编写 Dockerfile,定义容器的基础镜像、依赖安装和启动命令。
- 构建镜像:使用
docker build
命令生成微服务的镜像。 - 运行容器:通过
docker run
命令启动微服务容器,并配置环境变量、端口映射等。
Docker 容器化的优点在于轻量化、快速启动和运行环境一致性,极大地简化了微服务的部署流程。
1.2 借助 Kubernetes 进行集群管理与扩容
在微服务架构中,单个服务通常需要多实例运行以应对高并发和故障容忍。Kubernetes(K8s)是管理容器集群的主流工具,它提供了自动化部署、滚动更新和弹性扩展功能。使用 Kubernetes 进行编排的核心步骤包括:
- 定义资源清单:编写 Deployment 和 Service 的 YAML 文件,定义每个微服务的副本数、负载均衡和服务发现规则。
- 部署到集群:通过
kubectl apply
命令将微服务部署到 Kubernetes 集群。 - 弹性扩展:设置自动扩展策略(HPA),根据 CPU、内存等指标动态调整实例数量,确保服务的高可用性。
Kubernetes 的编排能力使得微服务的管理更加高效,为复杂系统提供了强大的基础设施支持。
二、API 网关实现
2.1 集中路由与流量管理
API 网关是微服务架构中的重要组件,它作为客户端与微服务之间的统一入口,负责请求的路由、负载均衡和协议转换。常用的 API 网关工具包括 Kong、Traefik 和 AWS API Gateway。
通过配置 API 网关,可以实现:
- 集中路由:根据 URL 路径或请求头,将流量分发到对应的微服务。
- 负载均衡:在多个服务实例之间分配请求,提升系统的吞吐量和可靠性。
- 降级与熔断:在服务故障或高负载时,返回默认响应或熔断请求,保护系统整体稳定性。
2.2 统一安全策略
API 网关还可以统一管理微服务的安全策略,例如认证、授权和速率限制:
- 认证与授权:集成 OAuth2 或 JWT 验证机制,确保只有合法用户可以访问服务。
- 速率限制:防止恶意请求或流量激增对服务造成冲击。
- TLS 加密:通过 HTTPS 协议加密客户端与网关之间的通信,保护数据的传输安全。
API 网关的引入不仅简化了微服务的管理,还增强了系统的安全性和可控性。
三、日志与监控
3.1 使用 ELK 收集日志
在微服务架构中,每个服务都运行在独立的容器中,分散的日志存储给问题排查带来了挑战。通过 ELK(Elasticsearch、Logstash、Kibana)技术栈,可以集中管理和分析微服务日志:
- Logstash:收集各服务的日志,并进行过滤和格式化。
- Elasticsearch:将日志存储到分布式搜索引擎中,支持快速查询。
- Kibana:通过可视化界面展示日志数据,便于开发者进行问题排查。
ELK 的集中日志管理能力,使得微服务的运维效率大幅提升。
3.2 Prometheus 与 Grafana 监控服务性能
为了实时监控微服务的运行状态,可以使用 Prometheus 和 Grafana 搭建监控体系:
- Prometheus:采集微服务的运行指标(如 CPU、内存、请求延迟等),并存储到时间序列数据库中。
- Grafana:通过可视化仪表盘展示监控数据,帮助运维团队快速发现问题。
通过设置告警规则,Prometheus 可以在服务异常时立即通知运维人员,避免问题扩大化。结合 Grafana 的直观界面,运维团队可以更高效地分析性能瓶颈和优化系统。
通过容器化与编排、API 网关的实现以及日志与监控体系的建设,微服务可以实现高效的部署与运维管理。这些实践为微服务架构提供了强大的支撑,确保系统在复杂环境下的稳定运行。
三、持续集成与交付
持续集成与交付(CI/CD)是现代软件开发的重要实践,尤其在微服务架构中,CI/CD 能显著提升开发效率和软件质量。通过自动化流程,开发团队可以实现频繁的代码集成和快速部署,同时具备灵活的升级与回滚能力。
3.1 自动化构建与测试
-
自动化构建
在微服务架构中,每个服务通常都有独立的代码库和依赖环境,因此需要为每个服务配置独立的自动化构建流程。以下是自动化构建的关键环节:- 依赖管理:使用工具(如 Maven、npm 等)管理服务的依赖项,确保构建环境一致。
- 构建脚本:编写构建脚本(如 Makefile、Gradle),实现一键化构建。
- 生成镜像:通过 Docker 自动生成容器镜像,为后续部署提供标准化的运行环境。
-
自动化测试
自动化测试是保障代码质量的重要手段,主要包括以下类型:- 单元测试:验证微服务的核心逻辑是否正确。
- 集成测试:测试服务间的交互是否符合预期。
- 端到端测试:模拟用户完整的操作流程,确保整体系统功能正常。
通过在 CI 流水线中集成自动化测试,可以在代码合并前发现并修复问题。
3.2 使用 CI/CD 工具实现快速部署
持续集成与交付需要借助工具实现自动化和标准化,以下是常用的 CI/CD 工具及其实践:
-
常用工具:
- Jenkins:灵活的开源 CI/CD 工具,支持各种插件。
- GitHub Actions:原生集成于 GitHub 仓库,配置方便。
- GitLab CI/CD:提供从代码管理到部署的一站式解决方案。
-
CI/CD 流程:
- 代码提交触发 CI:开发者提交代码后,CI 工具自动拉取代码并执行构建与测试。
- 生成部署包:通过构建流程生成可部署的 Docker 镜像或可执行文件。
- 部署到环境:CD 工具根据配置将服务部署到开发、测试或生产环境。
通过自动化的 CI/CD 流程,开发团队可以快速将新功能交付到用户手中,同时降低部署风险。
3.3 升级与回滚机制
在微服务架构中,服务的升级与回滚必须谨慎处理,以确保系统的稳定性与可用性。
-
升级机制:
- 滚动更新:逐步替换服务实例,避免因更新导致的全系统中断。
- 蓝绿部署:同时运行两个版本的服务(蓝色为旧版本,绿色为新版本),将流量切换到绿色版本后再下线蓝色版本。
- 金丝雀发布:将新版本的流量限制在少量用户中,逐步扩大范围,确保稳定后再全量发布。
-
回滚机制:
- 快速回滚:通过 CI/CD 工具支持的版本管理,快速切换到上一个稳定版本。
- 数据库回滚:在数据库更新时使用版本控制工具(如 Flyway),确保可以恢复到之前的版本。
- 日志与监控支持:结合实时监控(如 Prometheus)和日志分析(如 ELK),快速定位问题并触发回滚。
升级与回滚机制的完善可以有效降低新版本的发布风险,保障系统的高可用性。
通过自动化构建与测试、CI/CD 工具的高效集成,以及可靠的升级与回滚机制,微服务架构的持续集成与交付能够为开发团队提供强大的支持,助力快速、高质量的软件交付。
四、微服务架构的优化与治理
随着微服务架构的逐步落地与运行,优化与治理成为确保系统高效可靠的重要任务。通过引入服务网格、持续性能调优和清理技术债,可以进一步优化微服务的运行效率和维护成本。
4.1 服务网格(Service Mesh)的引入
- 服务网格概述
服务网格(Service Mesh)是一种用于管理微服务间通信的基础设施层,能够实现流量管理、服务发现、安全认证、监控和日志等功能。它通过在每个服务旁边部署一个代理(Sidecar),负责处理所有进出服务的网络通信,从而减轻服务本身的复杂性。-
Istio 或 Linkerd 实现流量管理
- Istio:功能强大,支持流量路由、熔断、限流、负载均衡等高级功能,同时提供丰富的监控和可视化工具。
- Linkerd:轻量级服务网格,易于部署和管理,适合中小规模的微服务系统。
-
通过服务网格可以实现
- 动态路由:根据请求的来源、用户属性或流量优先级动态调整路由策略。
- 流量切分:支持蓝绿部署、金丝雀发布等多种发布策略。
- 安全通信:为微服务间的通信提供自动化的 TLS 加密。
-
4.2 性能调优
-
基于监控数据优化服务架构
性能调优需要以监控数据为依据,通过分析微服务的运行指标(如响应时间、错误率、资源消耗等),定位性能瓶颈并优化架构:- 优化代码逻辑:针对高负载服务,优化关键路径代码,减少不必要的资源占用。
- 数据库调优:针对数据库查询慢的问题,优化索引、分库分表或引入缓存(如 Redis)。
- 服务拆分:对于性能瓶颈明显的服务,可以进一步拆分为更细粒度的服务。
-
水平扩展与负载均衡策略
- 水平扩展:增加服务实例数量以分担流量,结合 Kubernetes 的 HPA(Horizontal Pod Autoscaler)根据负载动态调整实例数量。
- 负载均衡:使用反向代理工具(如 Nginx)或服务网格中的负载均衡功能,将请求分发到运行状况最佳的服务实例,提升系统的整体吞吐量。
4.3 清理技术债
-
移除遗留代码
随着微服务的演进,旧的遗留代码可能成为系统的负担,影响维护效率和系统性能。通过以下方式清理技术债:- 定期代码审查:识别不再使用的代码模块,并安全地将其移除。
- 自动化工具辅助:使用代码质量工具(如 SonarQube)检测低质量代码段,制定改进计划。
-
持续优化微服务之间的依赖关系
微服务之间的依赖关系可能随着系统的演进而变得复杂,增加治理难度。优化依赖关系可以采用以下方法:- 降低耦合度:通过事件驱动架构减少同步调用,增强服务的独立性。
- 依赖图管理:使用工具(如 Graphviz、Dependency Cruiser)绘制服务依赖图,清晰展示服务间的关系,避免循环依赖和过度依赖。
通过引入服务网格、持续性能调优和清理技术债,可以保障微服务架构的高可用性、可扩展性以及易维护性。这些优化与治理措施将为系统的长期发展奠定坚实基础。
四、总结
微服务架构的成功实施离不开高效的部署与运维体系,这为系统的高可用性、扩展性和稳定性提供了可靠保障。通过容器化与编排技术,微服务得以实现独立部署和高效管理。Docker 容器化能够将微服务及其运行环境打包成独立的容器,简化部署流程,同时保证环境一致性。Kubernetes 则通过集群管理实现自动化部署、负载均衡和弹性扩展,使得微服务能够轻松应对高并发和故障容忍场景。
API 网关作为客户端与微服务的统一入口,承担了流量管理、负载均衡和安全策略的职责。借助 API 网关,系统能够实现集中路由和动态流量分发,并通过认证、授权和速率限制等措施确保通信安全。在服务故障或高负载时,API 网关还能提供降级与熔断功能,保护系统整体的稳定性。
为应对分散的微服务日志存储和性能监控需求,引入 ELK 技术栈和 Prometheus/Grafana 成为必要。ELK 集中管理日志,提供快速查询和问题排查能力,而 Prometheus 与 Grafana 则通过实时监控和可视化仪表盘帮助运维团队迅速发现性能瓶颈,并采取针对性优化措施。
此外,持续集成与交付(CI/CD)进一步提升了开发效率和交付质量。通过自动化构建与测试、快速部署工具以及完善的升级与回滚机制,团队能够在保证系统稳定性的前提下快速响应业务需求。
微服务架构的优化与治理也至关重要。服务网格(如 Istio 或 Linkerd)的引入,为服务通信、流量管理和安全认证提供了高级支持。基于监控数据的性能调优和对技术债的清理则进一步提高了系统的运行效率与维护性。
通过部署与运维、持续交付以及优化治理的多维度努力,微服务架构能够持续演进,满足复杂业务场景的需求,同时保持高效、稳定和可扩展的特性。
相关文章:
16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--微服务的部署与运维
部署与运维是微服务架构成功实施的关键环节。一个良好的部署与运维体系能够保障微服务的高可用性、可扩展性和可靠性。在这一阶段,重点包括微服务的容器化与编排、API 网关的实现以及日志与监控体系的建设。 一、容器化与编排 1.1 使用 Docker 容器化微服务 容器…...
什么是供应链金融
供应链金融(Supply Chain Finance) 是一种基于供应链上下游真实交易场景的金融服务模式,通过整合物流、信息流、资金流和数据流,为核心企业及其上下游中小企业提供灵活、高效的融资解决方案。其核心目标是优化供应链资金周转效率&…...
个人博客系统后端 - 注册登录功能实现指南
一、功能概述 个人博客系统的注册登录功能包括: 用户注册:新用户可以通过提供用户名、密码、邮箱等信息创建账号用户登录:已注册用户可以通过用户名和密码进行身份验证,获取JWT令牌身份验证:使用JWT令牌访问需要认证…...
微信小程序运行机制详解
微信小程序运行机制详解 微信小程序是介于 Web 和原生 App 之间的一种应用形态,具有无需安装、用完即走、体验流畅的特点。本文将从架构层面、运行环境、通信机制等方面深入剖析微信小程序的运行机制。 一、小程序运行架构概览 微信小程序采用双线程模型ÿ…...
GGML源码逐行调试(中)
目录 前言1. 简述2. 加载模型超参数3. 加载词汇表4. 初始化计算上下文5. 初始化计算后端6. 创建模型张量7. 分配缓冲区8. 加载模型权重结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL 的 GGML源码逐行调试 视频,记录下个人学习笔记,仅供自己参考&…...
高阶函数/柯里化/纯函数
本篇文章主要是介绍一下标题里面的概念,在面试的时候经常文档,结合阅读到的资料,结合本人的个人见解出品了该文章,如有写的不好的地方或理解有误的,还望阁下多多指教。 1、高阶函数 什么是高阶函数? 接受…...
docker部署scylladb
创建存储数据的目录和配置目录 mkdir -p /root/docker/scylla/data/data /root/docker/scylla/data/commitlog /root/docker/scylla/data/hints /root/docker/scylla/data/view_hints /root/docker/scylla/conf快速启动拷贝配置文件 docker run -d \--name scylla \scylladb/…...
Python创意:AI图像生成
1. 基本概念 AI 图像生成通常基于以下几种方法: 一.生成对抗网络 (GAN) 生成对抗网络(GAN,Generative Adversarial Network)是一种深度学习框架,主要用于生成新的、类似于训练数据的样本。自2014年由Ian Goodfellow及…...
十九、UDP编程和IO多路复用
1、UDP编程 服务端: #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…...
【MySQL】复合查询
文章目录 👉基本查询回顾👈select 子查询 👉多表查询👈👉自连接👈👉子查询👈单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 👉总结👈 &…...
并发编程--条件量与死锁及其解决方案
并发编程–条件量与死锁及其解决方案 文章目录 并发编程--条件量与死锁及其解决方案1.条件量1.1条件量基本概念1.2条件量的使用 2. 死锁 1.条件量 1.1条件量基本概念 在许多场合中,程序的执行通常需要满足一定的条件,条件不成熟的时候,任务…...
【NLP解析】多头注意力+掩码机制+位置编码:Transformer三大核心技术详解
目录 多头注意力:让模型化身“多面手” 技术细节:多头注意力如何计算? 实际应用:多头注意力在Transformer中的威力 为什么说多头是“非线性组合”? 实验对比:多头 vs 单头 进阶思考:如何设计更高…...
#关于数据库中的时间存储
✅ 一、是否根据“机器当前时区”得到本地时间再转 UTC? 结论:是的,但仅对 TIMESTAMP 字段生效。 数据库(如 MySQL)在插入 TIMESTAMP 类型数据时: 使用当前会话的时区(默认跟随系统时区&#…...
C# --- yield关键字 和 Lazy Execution
C# --- yield关键字 和 Lazy Execution 延迟执行(Lazy Execution)yield关键字lazy execution与yield的关系LINQ 和 lazy exectuion 延迟执行(Lazy Execution) 延迟执行指操作不会立即计算结果,而是在实际需要数据时才执…...
Qt报错dependent ‘..\..\..\..\..\..\xxxx\QMainWindow‘ 或者 QtCore\QObject not exist
Qt5.15编译项目报错如下: dependent ‘..\..\..\..\..\..\Qt\5.15.2\msvc2019_64\include\QtW...
彻底掌握 XMLHttpRequest(XHR):前端通信的基石
一、XHR 的起源与演进 1.1 技术背景 XHR(XMLHttpRequest)是现代 Web 应用的异步通信基石,最早由微软在 IE5 中通过 ActiveXObject 引入,后来被 Mozilla 推广并成为 W3C 的标准接口。XHR 的出现推动了 AJAX(Asynchrono…...
Bartender 5 for Mac 多功能菜单栏管理
Bartender 5 for Mac 多功能菜单栏管理 一、介绍 Bartender 5,是一款菜单栏管理软件,可以帮助用户隐藏、组织和自定义Mac菜单栏中的图标和通知。使用Bartender 5,用户可以将不常用的图标隐藏起来,使菜单栏保持整洁,并…...
重读《人件》Peopleware -(5)Ⅰ管理人力资源Ⅳ-质量—若时间允许
20世纪的心理学理论认为,人类的性格主要由少数几个基本本能所主导:生存、自尊、繁衍、领地等。这些本能直接嵌入大脑的“固件”中。我们可以在没有强烈情感的情况下理智地考虑这些本能(就像你现在正在做的那样),但当我…...
人事招聘专员简历模板
模板信息 简历范文名称:人事招聘专员简历模板,所属行业:人力资源,模板编号:K8TG60 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工作。…...
Java中equals与 “==” 的区别
首先我们要掌握基本数据类型和引用类型的概念 基本数据类型: byte,short,int,long,float,double,boolean,char 基本的八大数据类型都各自封装着包装类,提供了更多的方法,并且都是引言类型 引用类型: 引…...
20250412_代码笔记_CVRProblemDef
文章目录 前言一、get_random_problems 函数分析二、augment_xy_data_by_8_fold 函数分析代码 前言 该笔记分析代码的功能是生成随机VRP问题的数据,包含仓库坐标、节点坐标和节点需求。 对该代码进行改进 20250412-代码改进-拟蒙特卡洛 一、get_random_problems 函…...
《算法笔记》3.4小节——入门模拟->日期处理
日期差值 #include <iostream> using namespace std; int month[13][2]{{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31} }; bool is_leap(int year){return (year%40&&year%100!0||year%4000); }int m…...
JetBrain/IDEA :Request for Open Source Development License
Request for Open Source Development License...
Java学习手册:Java集合框架详解
Java集合框架(Java Collections Framework)是Java语言中用于存储和操作数据集合的一组接口和类的集合。它提供了丰富的数据结构和算法,帮助开发者高效地管理和操作数据。掌握集合框架的使用是Java开发者的必备技能。 本文将深入探讨Java集合…...
20250412 机器学习ML -(3)数据降维(scikitlearn)
1. 背景 数学小白一枚,看推理过程需要很多时间。好在有大神们源码和DS帮忙,教程里的推理过程才能勉强拼凑一二。 * 留意: 推导过程中X都是向量组表达: shape(feature, sample_n); 和numpy中的默认矩阵正好相反。 2. PCA / KPCA PCAKPCA(Li…...
深入解析系统频率响应:通过MATLAB模拟积分器对信号的稳态响应
稳态响应分析与MATLAB可视化 在控制系统中,线性时不变系统的稳态响应是描述输入与输出之间关系的关键。对于一个频率为 ω i \omega_i ωi 的正弦输入 u ( t ) M i sin ( ω i t φ i ) u(t) M_i \sin(\omega_i t \varphi_i) u(t)Misin(ωitφi)&…...
[16届蓝桥杯 2025 c++省 B] 画展布置
解题思路 理解 ( L ) 的本质 当 ( B ) 按平方值从小到大排序后,相邻项的差非负,此时 ( L ) 等于区间内最大平方值与最小平方值的差(数学公式推导) 滑动窗口找最小差值 遍历所有长度为 ( M ) 的连续…...
从代码学习深度学习 - Bahdanau注意力 PyTorch版
文章目录 1. 前言为什么选择Bahdanau注意力本文目标与预备知识2. Bahdanau注意力机制概述注意力机制简述加性注意力与乘性注意力对比Bahdanau注意力的数学原理与流程图数学原理流程图可视化与直观理解3. 数据准备与预处理数据集简介数据加载与预处理1. 读取数据集2. 预处理文本…...
具身智能零碎知识点(三):深入解析 “1D UNet”:结构、原理与实战
深入解析 “1D UNet”:结构、原理与实战 【深度学习入门】1D UNet详解:结构、原理与实战指南一、1D UNet是什么?二、核心结构与功能1. 整体架构2. 编码器(Encoder)3. 解码器(Decoder)4. 跳跃连…...
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(二)
上一篇 文章介绍了arXiv采集处理的任务背景、整体需求,并对数据进行了调研。 本文介绍整体方案设计。 4.整体方案设计 4.1.总体流程 基于上述调研了解的情况,针对工作需求设计处理流程如下: 下载kaggle数据集作为流程输入,出…...
Halo 设置 GitHub - OAuth2 认证指南
在当今数字化时代,用户认证的便捷性和安全性愈发重要。对于使用 Halo 搭建个人博客或网站的开发者而言,引入 GitHub - OAuth2 认证能够极大地提升用户登录体验。今天,我们就来详细探讨一下如何在 Halo 中设置 GitHub - OAuth2 认证。 一、为…...
脑影像分析软件推荐 | AIDA介绍
目录 1.软件界面 2.工具包功能简介 3.软件安装注意事项 1.软件界面 2.工具包功能简介 AIDAmri是一种新型的基于图谱的成像数据分析流程,用于处理小鼠大脑的结构和功能数据,包括解剖MRI、基于扩散张量成像(DTI)的纤维追踪以及基…...
SQL:Relationship(关系)
目录 🔗 什么是 Relationship? 三种基本关系类型(基于实体间的关系): 1. 一对一(One-to-One) 2. 一对多(One-to-Many) 3. 多对多(Many-to-Many…...
【今日三题】压缩字符串(模拟) / chika和蜜柑(topK) / 01背包
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 压缩字符串 (模拟)chika和蜜柑 (topK)01背包 压缩字符串 (模拟) 压缩字符串 class Solution { public:string compressStri…...
PHP多维数组
在 PHP 中,多维数组是数组的数组,允许你存储和处理更复杂的数据结构。多维数组可以有任意数量的维度,但通常我们最常用的是二维数组(数组中的数组)。 首先来介绍一下一维数组, <?php//一维数组 $strAr…...
智能手机功耗测试
随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…...
0x02.Redis 集群的实现原理是什么?
回答重点 Redis 集群(Redis cluster)是通过多个 Redis 实例组成的,每个主节点实例负责存储部分的数据,并且可以有一个或多个从节点作为备份。 具体是采用哈希槽(Hash Slot)机制来分配数据,将整…...
游戏引擎学习第219天
游戏运行时的当前状态 目前的工作基本上就是编程,带着一种预期,那就是一切都会很糟糕,而我们需要一个系统来防止它变得更糟。接下来,我们来看看目前的进展。 简要说明昨天提到的无限调试信息存储系统 昨天我们完成了内存管理的…...
二叉树深度解析:从基础概念到算法实现与应用
一、二叉树的本质定义与核心特性 (一)递归定义与逻辑结构 二叉树是一种 严格有序的树结构,其递归定义为: 空树:不含任何结点的集合,是二叉树的特殊形态。非空二叉树:由以下三部分组成&#x…...
Model Context Protocol(MCP)模型上下文协议
Model Context Protocol(MCP)模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代,将Agent确立为大模型未来…...
代码随想录算法训练营第十六天
LeetCode题目: 530. 二叉搜索树的最小绝对差501. 二叉搜索树中的众数236. 二叉树的最近公共祖先3272. 统计好整数的数目(每日一题) 其他: 今日总结 往期打卡 530. 二叉搜索树的最小绝对差 跳转: 530. 二叉搜索树的最小绝对差 学习: 代码随想录公开讲解 问题: 给你一个二叉搜…...
类似东郊到家的上门按摩预约服务系统小程序APP源码全开源
🔥 为什么上门按摩正在席卷全国? 万亿蓝海市场爆发 2024年中国按摩市场规模突破8000亿,上门服务增速达65% 90后成消费主力,**72%**白领每月至少使用1次上门按摩(数据来源:艾媒咨询) 传统痛点…...
MySQL 5.7.30 Linux 二进制安装包详解及安装指南
MySQL 5.7.30 Linux 安装包详解 mysql-5.7.30-linux-glibc2.12-x86_64.tar 是 MySQL 服务器 5.7.30 版本的 Linux 二进制发行包。 mysql-5.7.30-linux-glibc2.12-x86_64.tar 安装包下载 链接:https://pan.quark.cn/s/2943cd209ca5 包信息 版本: MySQL 5.7.30 平…...
C语言超详细指针知识(二)
在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…...
Java集合框架详解:核心类、使用场景与最佳实践
文章目录 一、Java集合框架概览二、核心集合类详解1. List接口(有序、可重复)**ArrayList****LinkedList****List对比表** 2. Set接口(无序、唯一)**HashSet****TreeSet****Set对比表** 3. Queue接口(队列)…...
模板引擎语法-标签
模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…...
刘火良FreeRTOS内核实现与应用学习之7——任务延时列表
在《刘火良FreeRTOS内核实现与应用学习之6——多优先级》的基础上:关键是添加了全局变量:xNextTaskUnblockTime ,与延时列表(xDelayedTaskList1、xDelayedTaskList2)来高效率的实现延时。 以前需要在扫描就绪列表中所…...
基于红外的语音传输及通信系统设计
标题:基于红外的语音传输及通信系统设计 内容:1.摘要 本设计聚焦于基于红外的语音传输及通信系统,以解决传统通信方式在特定场景下的局限性为背景,旨在开发一种高效、稳定且具有一定抗干扰能力的语音传输系统。方法上,采用红外技术作为语音信…...
解锁AI未来,开启创新之旅——《GPTs开发详解》与《ChatGPT 4应用详解》两本书的深度解析
前言 在这个数字化时代,AI技术正在以前所未有的速度改变我们的生活和工作方式。作为一名AI爱好者和从业者,我深知了解并掌握先进技术的重要性。今天,我想向大家推荐两本极具价值的书籍:《GPTs开发详解》和《ChatGPT 4应用详解》。…...
Linux进程通信入门:匿名管道的原理、实现与应用场景
Linux系列 文章目录 Linux系列前言一、进程通信的目的二、进程通信的原理2.1 进程通信是什么2.2 匿名管道通讯的原理 三、进程通讯的使用总结 前言 Linux进程间同通讯(IPC)是多个进程之间交换数据和协调行为的重要机制,是我们学习Linux操作系…...