医药流通行业批发公司IT运维转型:Prometheus+Grafana监控Spring Boot 3应用实践
一、引言:医药流通行业IT运维挑战与工具换代需求
在医药流通行业批发领域,业务的核心在于供应链的高效运转、订单处理的精准及时以及库存管理的动态平衡。随着互联网医疗的兴起和电商平台的渗透,传统医药批发企业正加速向数字化、智能化转型,IT系统的复杂度也呈指数级增长。以某中型医药批发企业为例,其核心业务系统已从单一的ERP系统扩展为包含订单管理、仓储物流、供应链协同、客户关系管理等多个微服务的分布式架构,基于Spring Boot 3构建的微服务集群日均处理订单量超过10万笔,系统可用性要求达到99.99%,这对IT运维监控体系提出了前所未有的挑战。
传统的运维监控工具,如Zabbix、Nagios等,在面对微服务架构时逐渐显露出局限性:闭源生态导致定制化困难,无法高效获取Spring Boot应用的深层指标;监控数据存储和查询性能瓶颈明显,难以应对高频次的指标采集;可视化能力不足,业务人员难以通过监控数据快速定位问题。因此,引入更适应分布式系统和云原生架构的监控工具成为必然选择。Prometheus与Grafana的组合,以其开源生态、强大的数据采集能力和灵活的可视化特性,成为医药流通行业IT运维工具换代的首选方案。
二、Prometheus:构建微服务监控的数据基石
(一)Prometheus核心特性与行业适配性
Prometheus是由SoundCloud开发的开源监控系统,基于Go语言构建,具备以下核心优势,特别适合医药流通行业的分布式业务场景:
- 多维数据模型:通过指标名称和键值对标签,能够精准描述微服务的各项指标(如订单处理延迟、库存查询吞吐量),支持复杂的维度组合查询。例如,可按“服务名称=order-service”“环境=production”“接口=createOrder”等标签筛选特定服务的性能指标。
- 高效的数据采集:采用拉取(Pull)模式获取指标,支持通过HTTP端点暴露数据,与Spring Boot Actuator天然兼容,无需额外代理组件,降低部署复杂度。在医药仓储物流系统中,每个仓库节点的库存服务均可通过独立端点暴露库存周转率、出入库峰值等指标。
- 强大的查询语言PromQL:支持实时数据查询和聚合计算,能够动态生成业务所需的监控报表。例如,通过
rate(order_processing_errors[5m])
计算过去5分钟订单处理错误率的增长率,帮助运维人员预判系统风险。 - 分布式存储与横向扩展:支持将监控数据存储到本地磁盘或远程存储系统(如InfluxDB、Grafana Loki),满足医药企业对历史数据长期留存和分析的需求。某企业通过Prometheus存储了近3年的订单处理延迟数据,为系统容量规划提供了数据支撑。
(二)Prometheus部署架构设计
在医药流通企业的IT环境中,Prometheus的典型部署架构包括以下组件:
- Prometheus Server:核心组件,负责定时从目标端点拉取指标数据,存储到本地时序数据库(默认使用RocksDB),并提供PromQL查询接口。建议部署在独立的服务器或容器中,配置SSD存储以提升数据读写性能。
- Exporter:数据采集代理,用于将非标准格式的指标转换为Prometheus可识别的格式。对于Spring Boot应用,直接使用Spring Boot Actuator即可暴露标准指标;对于传统遗留系统(如基于Java EE的供应链管理系统),可开发自定义Exporter实现指标转换。
- Alertmanager:报警管理组件,与Prometheus Server集成,支持通过邮件、Slack、企业微信等多种渠道发送报警通知。在订单处理系统中,当订单积压量超过阈值时,Alertmanager会立即向运维团队和业务主管发送预警信息。
- 中间件与存储扩展:对于数据量较大的企业,可引入Grafana Tempo进行分布式链路追踪,结合Prometheus指标实现全链路故障定位;通过Thanos或Cortex实现Prometheus的集群化部署,解决单节点存储容量限制问题。
三、Grafana:打造业务可视化监控大屏
(一)Grafana在医药行业的应用价值
Grafana是一款开源的数据可视化工具,支持接入多种数据源(包括Prometheus),其核心优势契合医药流通行业的监控需求:
- 多数据源统一展示:可同时接入Prometheus(指标数据)、Elasticsearch(日志数据)、InfluxDB(时序数据)等,在单个仪表盘上呈现全栈监控数据。例如,在仓储监控大屏中,左侧展示货架温湿度传感器的实时数据(来自InfluxDB),右侧展示仓储管理服务的CPU使用率和内存占用(来自Prometheus),下方滚动显示近期的异常日志(来自Elasticsearch)。
- 丰富的可视化组件:提供折线图、柱状图、仪表盘、表格、热力图等多种图表类型,支持自定义告警阈值和颜色标记。在订单峰值监控中,通过热力图展示不同区域订单量的分布,红色高亮显示订单量突增的区域,帮助业务团队快速调整资源分配。
- 灵活的权限管理:支持基于角色的访问控制(RBAC),可针对不同用户组(如运维团队、业务部门、管理层)设置不同的数据查看权限。例如,管理层只能查看全局业务指标(如订单总量、库存周转率),而运维人员可深入查看具体服务的JVM内存状态和线程池指标。
- 强大的报表与分享功能:支持定时生成PDF报表并发送至指定邮箱,方便企业进行月度运维报告汇总;通过公开链接或嵌入方式,将监控大屏集成到企业内部管理系统,提升数据透明度。某企业将Grafana仪表盘嵌入到OA系统,各部门主管可实时查看业务系统运行状态。
(二)Grafana数据接入与可视化最佳实践
-
Prometheus数据源配置:
- 在Grafana管理界面中,进入“Data Sources”,选择“Prometheus”,输入Prometheus Server的HTTP地址(如
http://prometheus-server:9090
),点击保存并测试连接。 - 配置标签过滤规则,例如只显示环境为“production”和“staging”的指标,避免开发环境数据干扰生产监控视图。
- 在Grafana管理界面中,进入“Data Sources”,选择“Prometheus”,输入Prometheus Server的HTTP地址(如
-
仪表盘设计原则:
- 业务导向:以“订单处理全链路”“库存周转效率”“供应链协同性能”等业务场景为核心组织仪表盘,而非单纯的技术指标堆砌。例如,“订单处理仪表盘”包含订单提交成功率、支付接口延迟、物流单号生成耗时等指标,直接对应业务流程节点。
- 分层展示:采用“全局概览→区域分析→节点详情”的三层架构,管理层查看全局概览,区域经理查看所在区域的详细数据,运维人员可下钻到具体服务器或容器的指标。
- 告警可视化:在图表中添加告警阈值线,当指标超过阈值时自动变色(如红色表示异常,黄色表示预警),并在仪表盘顶部设置滚动告警列表,显示当前未解决的问题。
四、创建Spring Boot 3应用及监控配置:从开发到运维的全流程衔接
(一)pom.xml依赖配置:构建监控就绪的微服务
在医药流通企业的微服务开发中,Spring Boot 3的监控配置需添加以下核心依赖,确保应用能够暴露Prometheus可采集的指标:
<dependencies><!-- Spring Boot Web 核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Actuator 监控端点 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micrometer Prometheus 注册表 --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!-- 其他业务依赖,如数据库连接、消息队列等 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>
关键依赖解析:
spring-boot-starter-actuator
:提供健康检查、指标统计、环境变量等监控端点,默认暴露/actuator
端点,需通过配置进一步开放Prometheus所需的指标端点。micrometer-registry-prometheus
:将Micrometer指标转换为Prometheus兼容的格式,支持自定义指标采集,例如在订单服务中添加“订单创建耗时”“库存锁定成功率”等业务指标。
(二)application.properties配置:细化监控端点与指标暴露
在应用配置文件中,需进行以下配置以启用监控功能并适配Prometheus采集规则:
# 应用基本信息
spring.application.name=pharmacy-order-service
server.port=8080# Actuator 端点配置
management.endpoints.web.exposure.include=health,metrics,prometheus
management.endpoint.health.show-details=always
management.endpoint.metrics.enabled=true
management.metrics.tags.application=${spring.application.name}# Prometheus 指标前缀(可选,用于区分不同业务线)
management.metrics.export.prometheus.step=10s
management.metrics.export.prometheus.enabled=true# 自定义指标配置(以库存服务为例)
metrics.inventory.stock.threshold=100
核心配置说明:
- 端点暴露:通过
management.endpoints.web.exposure.include
指定开放的端点,prometheus
端点用于直接返回Prometheus格式的指标数据,访问路径为http://localhost:8080/actuator/prometheus
。 - 健康检查细节:
management.endpoint.health.show-details=always
确保健康检查返回详细信息,包括数据库连接状态、外部服务调用状态等,这对医药供应链中的第三方物流接口监控至关重要。 - 指标标签:
management.metrics.tags.application
为所有指标添加应用名称标签,便于Prometheus按服务维度分组查询,例如{application="pharmacy-order-service"}
。
(三)Java类开发:自定义业务指标与健康检查
- 自定义指标采集:
使用Micrometer的MeterRegistry
接口,在业务逻辑中添加自定义指标。以下是订单服务中记录订单处理时间的示例:
import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;@Service
public class OrderService {private final Timer orderProcessingTimer;public OrderService(MeterRegistry registry) {this.orderProcessingTimer = Timer.builder("order.processing.time").description("Time taken to process an order").tag("service", "order-service").register(registry);}@Timed("order.create.time") // 自动记录方法执行时间public Order createOrder(OrderRequest request) {Timer.Sample sample = Timer.start(orderProcessingTimer);try {// 订单创建逻辑,包括库存检查、价格计算、物流分配等Order order = new Order();order.setOrderId(UUID.randomUUID().toString());order.setStatus(OrderStatus.PENDING);return order;} finally {sample.stop(orderProcessingTimer);}}
}
- 健康检查扩展:
针对医药行业特有的业务依赖(如药品数据库、冷链物流接口),自定义健康指示器:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;@Component
public class PharmacyDatabaseHealthIndicator implements HealthIndicator {private final PharmacyDatabaseClient databaseClient;public PharmacyDatabaseHealthIndicator(PharmacyDatabaseClient databaseClient) {this.databaseClient = databaseClient;}@Overridepublic Health health() {int connectionCount = databaseClient.getConnectionCount();if (connectionCount < 5) {return Health.down().withDetail("message", "Database connection pool is low").withDetail("currentConnections", connectionCount).build();}return Health.up().withDetail("currentConnections", connectionCount).build();}
}
(四)本地验证:确保监控端点正常暴露
-
端点访问测试:
启动Spring Boot应用后,访问以下路径验证端点是否正常:- 健康检查:
http://localhost:8080/actuator/health
,应返回包含各组件状态的JSON数据。 - 指标列表:
http://localhost:8080/actuator/metrics
,显示所有已采集的指标,包括JVM内存、线程数、HTTP请求耗时等。 - Prometheus格式数据:
http://localhost:8080/actuator/prometheus
,页面应显示以# HELP
和# TYPE
开头的Prometheus指标定义,以及具体的指标值。
- 健康检查:
-
指标逻辑验证:
通过模拟业务操作(如创建订单、查询库存),观察Prometheus指标是否正确更新。例如,调用订单创建接口后,检查order.processing.time
指标的计数和耗时是否增加,确保自定义指标采集逻辑正确。
五、Grafana集成Prometheus:构建端到端监控体系
(一)Prometheus配置文件修改与服务重启
在Prometheus的核心配置文件prometheus.yml
中,添加Spring Boot应用的监控目标,支持静态配置或通过服务发现动态获取目标端点。以下是静态配置示例,适用于医药企业中相对固定的微服务部署环境:
global:scrape_interval: 15s # 数据采集间隔,可根据业务敏感度调整,高频交易场景建议设为5sevaluation_interval: 15sscrape_configs:- job_name: "spring-boot-apps"static_configs:- targets: ["localhost:8080"] # 本地开发环境目标labels:environment: "development"- targets: ["order-service.prod.pharmacy.com:8080", "inventory-service.prod.pharmacy.com:8081"]labels:environment: "production"business_line: "wholesale" # 业务线标签,区分批发与零售业务
配置优化建议:
- 标签规范:统一指标标签命名规则,如使用
environment
(环境)、service_name
(服务名)、business_line
(业务线)等通用标签,便于后续在Grafana中进行维度筛选。 - 服务发现:对于Kubernetes环境,使用
kubernetes_sd_configs
自动发现Pod端点,避免手动维护目标列表,提高配置灵活性。
修改配置后,通过以下命令重启Prometheus服务(以Docker部署为例):
docker restart prometheus-container
(二)Grafana模板导入:快速构建专业监控仪表盘
Grafana官方模板库(https://grafana.com/grafana/dashboards)提供了大量针对Spring Boot和Prometheus的现成模板,医药企业可根据需求选择并导入,以下是操作步骤:
-
搜索合适模板:
在Grafana界面中,点击左侧菜单“+”→“Import”,输入模板ID(如针对Spring Boot的模板ID 4701,包含JVM、HTTP请求、数据库连接等指标),或搜索关键词“Spring Boot Prometheus”。 -
模板配置调整:
导入模板后,需根据企业实际环境调整数据源(确保指向Prometheus)和标签过滤条件。例如,将模板中默认的instance
标签替换为service_name
,以匹配Spring Boot应用的标签配置。 -
自定义模板开发:
对于医药行业特有的业务指标(如药品批次效期监控、冷链运输温度追踪),可在现有模板基础上新建面板,添加自定义PromQL查询。例如,监控药品库存周转率的PromQL语句:rate(inventory_turnover_count[1h])
(三)监控效果验证:从技术指标到业务洞察
-
基础指标验证:
检查Grafana仪表盘是否正确显示以下技术指标,确保Prometheus采集和Grafana展示正常:- JVM指标:堆内存使用量(
jvm_memory_used_bytes
)、垃圾回收次数(jvm_gc_collection_seconds_count
)、线程数(jvm_threads_peak
)。 - HTTP指标:各端点的请求量(
http_server_requests_seconds_count
)、平均响应时间(http_server_requests_seconds_sum / http_server_requests_seconds_count
)、错误率(rate(http_server_requests_seconds_count{status=~"5.."}[1m])
)。 - 自定义业务指标:如订单创建成功率(
order_create_success{result="success"} / order_create_total
)、库存锁定耗时百分位数(histogram_quantile(0.95, rate(order_inventory_lock_seconds_bucket[5m]))
)。
- JVM指标:堆内存使用量(
-
业务场景验证:
通过模拟业务峰值(如促销活动期间的订单突增),观察监控系统的响应能力:- 验证告警是否及时触发:当订单处理延迟超过业务阈值(如200ms)时,Alertmanager是否通过企业微信发送告警,Grafana仪表盘是否显示红色预警。
- 检查数据一致性:对比Prometheus存储的指标数据与业务数据库的订单记录,确保监控数据准确反映实际业务情况。
- 测试故障恢复流程:人为停止某个库存服务实例,观察Grafana是否显示该实例状态为异常,负载均衡是否自动将流量切换至其他实例,故障恢复后指标是否恢复正常。
六、办公工具换代与技能重构:传统IT团队的转型之路
(一)从“被动响应”到“主动预防”:运维工具的范式转变
在传统IT运维中,工具主要用于故障发生后的定位和处理,如通过日志文件分析错误原因,依赖人工巡检发现性能瓶颈。而Prometheus+Grafana体系推动了以下三方面的工具换代:
-
监控维度的立体化:
从单一的服务器指标(CPU、内存)扩展到微服务全链路指标,包括业务逻辑指标(如订单处理成功率)、第三方接口指标(如医保结算接口延迟)、用户体验指标(如页面加载时间)。某企业通过Grafana仪表盘,将客户下单到物流单号生成的全流程耗时分解为12个节点指标,实现了对业务瓶颈的精准定位。 -
数据处理的实时化:
Prometheus的高频次数据采集(支持最低1秒间隔)和Grafana的实时可视化,使运维团队能够在秒级延迟内发现异常。在医药仓储管理中,实时监控货架温湿度传感器数据,当温度超过药品存储阈值(如2-8℃)时,系统立即触发声光报警并通知仓库管理员,避免药品失效损失。 -
报警机制的智能化:
通过PromQL的复杂表达式设置动态告警阈值,替代传统的固定阈值报警。例如,使用increase(order_failure_count[10m]) > 100
检测10分钟内订单失败数增量,结合业务时段(如高峰时段允许更高容错)设置不同的告警策略,减少误报率。
(二)运维技能重构:从“脚本小子”到“全栈监控工程师”
新工具体系对医药企业IT团队的技能要求发生了根本性变化,需要掌握以下核心能力:
-
微服务监控架构设计:
- 理解Spring Boot Actuator的指标体系,能够根据业务需求设计自定义指标(如药品追溯码生成速率、电子处方审核耗时)。
- 掌握Prometheus的配置语法和服务发现机制,针对Kubernetes、Docker Swarm等容器环境进行动态监控配置。
-
PromQL查询与调优:
- 熟练使用PromQL的聚合函数(如
sum()
、rate()
、histogram_quantile()
)进行指标计算,例如计算订单处理延迟的95%分位数:histogram_quantile(0.95, rate(order_processing_seconds_bucket[5m]))
- 优化Prometheus的采集配置,避免因过度采集导致的性能开销,如对低频变化指标(如应用启动时间)设置较长的采集间隔。
- 熟练使用PromQL的聚合函数(如
-
Grafana可视化开发:
- 设计符合业务逻辑的仪表盘布局,使用变量(Variables)实现动态筛选,例如通过下拉菜单选择不同的仓库区域显示对应监控数据。
- 开发自定义插件(如ECharts图表)以满足特殊可视化需求,例如在供应链地图上动态显示各节点的库存状态。
-
故障排查全链路思维:
- 结合Prometheus指标、Grafana日志分析(通过集成Loki或Elasticsearch)和分布式链路追踪(如OpenTelemetry),从“用户请求→服务调用→数据库操作→外部接口”全链路定位故障点。某企业在处理订单提交失败问题时,通过Grafana仪表盘发现库存锁定服务的HTTP 500错误率突增,进一步追踪发现是第三方物流接口认证令牌过期导致。
(三)组织级能力建设:工具换代背后的流程与文化转型
-
跨部门协作机制:
- 建立运维(负责监控工具部署)、开发(负责应用指标暴露)、业务(提出监控需求)三方定期沟通会议,例如每月召开监控指标评审会,根据业务反馈调整监控重点。在医药电商促销活动前,业务部门提出“秒杀订单处理延迟<100ms”的监控需求,开发团队针对性添加秒杀接口的耗时指标,运维团队优化Prometheus采集策略。
- 构建“监控即代码”(Monitoring as Code)流程,将Prometheus配置、Grafana模板、告警规则纳入版本控制系统(如Git),实现监控配置的可追溯和标准化部署。
-
人才培养与知识沉淀:
- 内部培训体系:开展“Prometheus+Grafana实战”系列培训,结合医药行业案例(如疫苗运输监控、中药材库存周转率分析)进行实操教学,培养既懂IT技术又熟悉医药业务的复合型人才。
- 知识库建设:建立内部Wiki,收录常见监控问题解决方案(如“Prometheus数据丢失如何排查”“Grafana仪表盘加载缓慢优化方法”)、自定义指标开发规范、行业最佳实践,形成企业独特的监控方法论。
-
持续改进机制:
- 定期进行监控系统评估,使用Google SLO(服务级别目标)框架定义各微服务的可用性、延迟等指标,通过PromQL计算SLO达成率,推动系统优化。例如,设定订单服务的SLO为“99.9%的请求在500ms内响应”,每月生成SLO报告并公示改进措施。
- 关注开源社区动态,及时引入Prometheus和Grafana的新特性(如Grafana的AI驱动告警分析、Prometheus的远程存储优化),保持监控体系的技术领先性。
七、总结:医药流通行业IT运维的未来图景
通过Prometheus与Grafana的深度集成,医药流通企业实现了从“工具堆砌”到“体系化监控”的跨越,这不仅是技术层面的升级,更是IT团队能力和企业管理模式的全面转型。对于传统IT顾问而言,需要深刻理解以下趋势:
-
监控的业务化:未来的监控系统不再是技术人员的专属工具,而是业务决策的“数字孪生”。通过Grafana的业务可视化大屏,企业高管可以实时掌握供应链效率、库存风险、客户满意度等核心指标,实现数据驱动的精准决策。
-
技能的复合化:传统运维人员需从“工具使用者”转变为“解决方案构建者”,不仅要掌握Prometheus的配置和Grafana的可视化,更要理解医药业务流程,能够将业务需求转化为可监控的技术指标,例如将“药品效期管理”转化为库存服务中的“近效期药品数量”指标。
-
工具的生态化:Prometheus和Grafana的成功得益于其强大的开源生态,企业应积极参与生态建设,贡献行业特定的监控模板和Exporter,同时吸收社区最佳实践,形成“引入-应用-反哺”的良性循环。
在医药流通行业数字化转型的浪潮中,Prometheus+Grafana监控体系不仅是应对当下微服务架构挑战的利器,更是开启IT与业务深度融合的钥匙。通过工具换代和技能重构,传统IT团队将从“成本中心”转变为“价值创造中心”,为企业的高质量发展提供坚实的数字底座。
相关文章:
医药流通行业批发公司IT运维转型:Prometheus+Grafana监控Spring Boot 3应用实践
一、引言:医药流通行业IT运维挑战与工具换代需求 在医药流通行业批发领域,业务的核心在于供应链的高效运转、订单处理的精准及时以及库存管理的动态平衡。随着互联网医疗的兴起和电商平台的渗透,传统医药批发企业正加速向数字化、智能化转型…...
编程助手fitten code使用说明(超详细)(vscode)
这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方,无论是快速修复错误、提升代…...
金融大模型
FinGPT 数据集:https://github.com/AI4Finance-Foundation/FinGPT/tree/master/fingpt/FinGPT-v3 FinGPT v3 系列是在新闻和微博情绪分析数据集上使用 LoRA 方法进行微调的LLM,在大多数金融情绪分析数据集上取得了最佳分数。 FinGPT v3.1 使用 chatgl…...
【Pandas】pandas DataFrame infer_objects
Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...
011_异常、泛型和集合框架
异常、泛型和集合框架 异常Java的异常体系异常的作用 自定义异常异常的处理方案异常的两种处理方式 泛型泛型类泛型接口泛型方法、通配符和上下限泛型支持的类型 集合框架集合体系结构Collection Collection集合Collection的遍历方式认识并发修改异常问题解决并发修改异常问题的…...
QTSql全解析:从连接到查询的数据库集成指南
概览 与数据库的有效集成是确保数据管理效率和应用性能的关键,Qt框架就提供了强大的QtSql模块,使得开发者能够轻松地进行数据库操作,包括连接、查询执行以及结果处理等 一、引入QtSql模块 首先,需要在项目中引入QtSql模块&…...
docker快捷打包脚本(ai版)
直接进入主题: 用这个脚本前提是你本地可以拉镜像仓库的镜像,并且在 本地有了,然后将所有的镜像tag写在一个文件中,和下面docker_tags.txt 对应,文件叫什么,脚本里对应改什么,给小白说的 #!/bi…...
分布式防护节点秒级切换:实战配置与自动化运维
摘要:针对DDoS攻击导致节点瘫痪的问题,本文基于群联AI云防护的智能调度系统,详解如何实现节点健康检查、秒级切换与自动化容灾,并提供Ansible部署脚本。 一、分布式节点的核心价值 资源分散:攻击者难以同时击溃所有节…...
TBE(TVM的扩展)
算子 张量 一个张量只有一种数据类型 在内存中只能线性存储,最终形成一个长的一维数组 晟腾AI的数据格式 AIPP是对我们常见的数据格式转化成AI core支持的数据格式 广播机制 TVM TBE的第一种开发方式:DSL TBE的第二种开发方式:TVM TBE的第…...
Jenkins配置的JDK,Maven和Git
1. 前置 在配置前,我们需要先把JDK,Maven和Git安装到Jenkins的服务器上。 (1)需要进入容器内部,执行命令:docker exec -u root -it 容器号/容器名称(2选1) bash -- 容器名称 dock…...
核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室
核心案例 | 湖南汽车工程职业大学无人机操控与编队技术实验室 为满足当今无人机行业应用需求,推动无人机技术的教育与实践深度融合,北京卓翼智能科技有限公司旗下品牌飞思实验室与湖南汽车工程职业大学强强联手,共同建设无人机操控与编队技术…...
【阻抗匹配】
自动匹配的实现: 检测反射信号:通过传感器(如定向耦合器)监测反射功率或驻波比(SWR),判断是否失配。控制单元:利用微控制器或专用芯片(如FPGA)分析检测数据&a…...
micro常用快捷键
micro常用快捷键 以下是 micro 编辑器 的常用快捷键整理,按功能分类清晰,方便快速查阅: 1. 基础操作 快捷键功能Ctrl S保存文件Ctrl Q退出编辑器Ctrl O打开文件Ctrl E打开命令栏(输入命令)Ctr…...
DNS域名解析服务
目录 DNS系统 DNS系统的作用 DNS系统的类型(服务器分类) 1. 递归解析器(Recursive Resolver) 2. 根域名服务器(Root Name Server) 3. 顶级域服务器(TLD Name Server)…...
Linux的目录结构
倒根树状结构 【注意】 / 表示根目录,相当于Windows的C盘 进入跟目录命令: cd / /bin:存放的系统命令或二进制文件,如:cd ls cp等 /sbin /usr/bin /dev:存放的设备节点文件 , 驱动文件 /…...
【Python】Python 100题 分类入门练习题 - 新手友好
Python 100题 分类入门练习题 - 新手友好篇 - 整合篇 一、数学问题题目1:组合数字题目2:利润计算题目3:完全平方数题目4:日期天数计算题目11:兔子繁殖问题题目18:数列求和题目19:完数判断题目21…...
Three.js 系列专题 7:性能优化与最佳实践
内容概述 随着 3D 场景复杂度的增加,性能优化变得至关重要。Three.js 项目可能因几何体数量、纹理大小或渲染设置而变慢。本专题将介绍减少 draw call、优化纹理和使用调试工具的最佳实践。 学习目标 学会减少 draw call 和几何体复杂度。掌握纹理压缩与内存管理。使用 Stat…...
特权FPGA之Johnson移位
完整代码: module johnson(clk,rst_n,led,sw1_n,sw2_n,sw3_n);input clk; //时钟信号,50MHz input rst_n; //复位信号,低电平有效 output[3:0] led; //LED控制,1--灭…...
聊聊 CSS
先补充一些概念 C/S(客户端/服务器):要下载到本地才能用 需要安装、偶尔更新、不跨平台 B/S(浏览器/服务器):在浏览器输入网址就可以使用 无需安装、无需更新、可跨平台 [!NOTE] B/S 架构优点如此之多&am…...
域名系统DNS
一 概述 域名系统DNS是互联网使用的命名系统,用来把便于人们使用的机器名称转换为IP地址,比如我们熟知的www.baidu.com,www.sina.com,这些域名的背后都对应着一个又一个的IP地址。由域名转换为IP的过程我们称为解析,解析的过程大…...
大模型ui设计SVG输出
你是一位资深 SVG 绘画设计师,现需根据以下产品需求创建SVG方案: 产品需求 约拍app 画板尺寸: 宽度:375px(基于提供的HTML移动设计)高度:812px(iPhone X/XS 尺寸) 配…...
利用securecrt的tftp服务器功能传递文件
日常经常能用到需要调测一些openwrt设备,要互相拷贝文件,没有开启ftp功能时,这时可以用到crt的tftp内置服务器功能,利用tftp功能传递文件。 配置方法: 打开设置→全局配置→终端→tftp配置设置c上内置tftp服务器时&a…...
基于STM32、HAL库的IP2736U快充协议芯片简介及驱动程序设计
一、简介: IP2736U是一款高性能的USB Type-C和Power Delivery(PD)控制器芯片,支持最新的USB PD 3.0规范。它具有以下特点: 支持USB Type-C和PD 3.0协议 内置MCU,可编程配置 支持多种供电角色(Source/Sink/DRP) 支持PPS可编程电源 支持多种快充协议(PD/QC/AFC/FCP/SCP等) I…...
SQL学习笔记七
第九章用正则表达式进行搜索 9.1正则表达式介绍 正则表达式是用来匹配文本的特殊的串(字符集合)。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以 使用一个正则表达式…...
MicroPython 开发ESP32应用教程 之 Timer、GPIO中断
随着我们课程的递进,大家会发现,我们之前课程中的例子,虽然功能都能实现,但总觉得体验感不够好,比如按键控制GRB灯珠的时候,很容易出现按键后,灯珠没有反应,还有蓝牙发送指令控制灯珠…...
【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)
文章目录 私有数据访问私有数据实例存储槽Solidity 中的数据存储方式1. storage(持久化存储)定长数组变长数组 2. memory(临时内存)3. calldata 可见性关键字私有数据存储风险安全措施 私有数据 私有数据(Private Dat…...
20250408在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时拿掉经常出现的list-iodomain.sh警告信息
rootrk3566-buildroot:/usr/bin# vi list-iodomain.sh rootrk3566-buildroot:/usr/bin# sync 【最后】 #chk_env #get_chip_id $1 #echo_msg "Get CHIP ID: $CHIP_ID" #get_iodomain_val 20250408在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时拿掉经常…...
上下拉电阻详解
一、基本定义 上拉电阻:连接信号线与电源(VCC),确保信号在无驱动时保持高电平。 下拉电阻:连接信号线与地(GND),确保信号在无驱动时保持低电平。 二、核心作用 电平稳定 防止悬空引…...
特权FPGA之数码管
case语句的用法: 计数器不断的计数,每一个num对应数码管一种数据的输出。实例通俗易懂,一目了然。 timescale 1ns / 1ps// Company: // Engineer: // // Create Date: // Design Name: // Module Name: // Project Name: //…...
PyTorch 学习笔记
环境:python3.8 PyTorch2.4.1cpu PyCharm 参考链接: 快速入门 — PyTorch 教程 2.6.0cu124 文档 PyTorch 文档 — PyTorch 2.4 文档 快速入门 导入库 import torch from torch import nn from torch.utils.data import DataLoader from torchvision …...
MCP基础学习计划:从MCP入门到项目构建的全面指南
文章简介 ai生成的学计划有的连接是无效的,想着边学习边找输出文章,后续会继续链接更新 在人工智能和大语言模型(LLM)的快速发展下,掌握Model Context Protocol(MCP)成为提升AI应用能力的关键。…...
NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)
什么是单调队列? 单调队列,顾名思义,就是存储的元素要么单调递增要么单调递减的队列。注意,这⾥的队列和普通的队列不⼀样,是⼀个双端队列。单调队列解决的问题 ⼀般⽤于解决滑动窗⼝内最⼤值最⼩值问题,以…...
【有啥问啥】深入浅出讲解 Teacher Forcing 技术
深入浅出讲解 Teacher Forcing 技术 在序列生成任务(例如机器翻译、文本摘要、图像字幕生成等)中,循环神经网络(RNN)以及基于 Transformer 的模型通常采用自回归(autoregressive)的方式生成输出…...
redis数据迁移之通过redis-dump镜像
这里写目录标题 一、redis-dump 镜像打包1.1 安装windows docker1.2 idea项目创建1.3 idea镜像打包 二、redis数据迁移2.1 数据导出2.2 数据导入 一、redis-dump 镜像打包 没有找到可用的redis-dump镜像,需要自己打包一下,这里我是在idea直接打包的 1.…...
Redis哨兵模式下执行sentinel failover mymaster命令可能导致什么风险,如何避免
在 Redis 哨兵模式下执行 SENTINEL FAILOVER mymaster 命令会强制触发主节点切换(手动故障转移),虽然这是合法的管理操作,但可能带来以下风险及规避方法: 一、潜在风险 数据丢失风险 原因:主节点可能在故障…...
软考案例分析实例答题模板
案例分析(全部为主观问答题, 总 5 大题, 第一题必选, 剩下 4 选 2, 每题 25 分, 共75分) 第一题: 案例分析——某企业信息架构优化项目 案例材料: 某企业是一家从事电子商务的大型企业, 随着业务规模的不断扩大, 现有的信息架 构已无法满足企业快速发展的需求。 企业…...
Docker+Jenkins+Gitee自动化项目部署
前置条件 docker安装成功 按照下面配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://register.librax.org"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker一、…...
olib开源图书
8.olib开源图书 该软件作者已开源,开源地址:开源地址:https://github.com/shiyi-0x7f/o-lib 点击该软件,使用管理员权限打开,进入界面可以搜索图书并下载pdf文件。 蓝奏云下载:https://wwph.lanzout.com/…...
react: styled-components实现原理 标签模版
styled-components是针对react中一个前端广泛使用的css-in-js样式库B站 利用标签模版 利用ES6中的 标签模版文档标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。 let a 5; let b 10;…...
AI大模型从0到1记录学习 day15
14.3.5 互斥锁 1)线程安全问题 线程之间共享数据会存在线程安全的问题。 比如下面这段代码,3个线程,每个线程都将g_num 1 十次: import time import threading def func(): global g_num for _ in range(10): tmp g_num 1 # ti…...
macbook pro查询并修改命令提示符的格式
环境 MacBook Pro 描述 我的命令提示符总是: # 前面总是多了(base) (base) yutaoyutaodeMacBook-Pro ~ % vim .zshrc (base) yutaoyutaodeMacBook-Pro ~ % source .zshrc # 期望改成下面这样: yutaoyutaodeMacBook-Pro ~ % 找…...
Baumer工业相机堡盟工业相机如何处理偶发十万分之一或百万分之一几率出现的黑图现象(C#)
Baumer工业相机堡盟工业相机如何处理偶发十万分之一或百万分之一几率出现的黑图现象(C#) Baumer工业相机Baumer工业相机出现黑图的技术背景硬件层面软件层面环境因素 实际案例演示:BaumerVCXG-53M.I.XT 防护相机项目使用环境项目反馈问题项目…...
基于Resemblyzer 声纹识别门禁系统设计
一、整体结构与思路 这份程序的核心目的是: 用麦克风录音 ➜ 识别说话人是谁 ➜ 图形化展示 ➜ 语音播报反馈 它主要由 4 个部分组成: 全局配置和依赖加载 语音采集和声纹提取逻辑 图形界面与交互(PyQt5) 语音播报反馈系统 …...
分布式数据库LSM树
LSM树的核心结构与操作流程 Log-Structured Merge Tree,日志 结构化 合并 树。 追加写:永远不改,就算是update操作,也是追加写,一直新生成文件。 刷盘触发:追加到一定程序,比如到了几M…...
2143 最少刷题数
2143 最少刷题数 ⭐️难度:中等 🌟考点:2022、前缀和、省赛、二分 📖 📚 import java.util.Scanner; import java.util.Arrays;public class Main2 {public static void main(String[] args) {Scanner sc new Sca…...
Ansible:playbook 使用when和ith_items
文章目录 playbook使用 whenplaybook 使用迭代 with_items迭代嵌套子变量 if 和 for在template中使用了,在playbook中加以区分,因此使用when进行条件判断,with_items进行循环迭代 playbook使用 when when语句,可以实现条件测试。…...
python爬取1688.item_search_best-查询榜单列表返回数据说明
在当今数字化时代,电商平台的数据蕴含着巨大的商业价值。1688作为国内领先的B2B电商平台,其商品搜索榜单数据能够为供应商、采购商以及市场研究人员提供诸多洞察。本文将详细介绍如何使用Python爬取1688的商品搜索榜单数据,并对返回数据进行说…...
数据结构(一)KMP+滑动窗口+链表+栈+队列
数据结构-链表 单链表 #include<iostream> using namespace std; const int N 100010; int head,e[N],ne[N],idx; void init() {head -1;idx 0; } void add_to_head(int x) {e[idx] x;ne[idx] head;head idx;idx; } void add(int k,int x) {e[idx] x;ne[id…...
C语言 数据结构 【队列】动态模拟实现
引言 用动态方式模拟实现队列的各个接口 一、队列的结构与概念 概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列…...
Python | 第十三章 | 多态 | 魔术方法 | 静态方法 | 抽象类
P130 多态练习题(1)2025/2/21 一、isinstance函数 基本说明: isinstance()用于判断对象是否为某个类或其子类的对象基本语法:isinstance(object,classinfo)解读形参: object:对象 classinfo:可以是类名、基本类型或者由它们组成…...