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

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

🚀📊 OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南 🚀


📑 目录

  • 🚀📊 OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南 🚀
    • 一、前言 🎯
    • 二、系统架构 🏗️
    • 三、配置与校验 🔧
      • `appsettings.json`
      • 校验示例
      • 📜 配置校验流程
    • 四、OpcUaService 增强:线程安全 + Polly 重试 🔐🔄
      • 🔒 OPC UA 会话重连流程
    • 五、数据采集作业:异常隔离 + 告警上报 🚨
      • 📥 数据采集 & 缓存流程
    • 六、模块注册补全 🎛️
      • `OpcUaHealthCheck` 示例
    • 七、证书 & Kubernetes 部署 ☸️
      • 1. 生成并信任证书(Linux)
      • 📦 证书生成与挂载流程
      • 2. Kubernetes Secret 示例
      • 3. Pod 挂载
      • 4. Liveness/Readiness Probes
      • ☸️ K8s 探针配置流程
    • 八、日志采集与可观测性 🔍
    • 九、结语 🎉


一、前言 🎯

本文基于企业级生产环境需求,全面重构 OPC UAABP vNext 集成框架,涵盖:

  • 配置集中化 & 校验
  • 安全封装 & Polly 重试 🔄
  • 原生作业调度 (BackgroundWorkerBase) ⏱️
  • 分布式缓存 & 更新 幂等 🔒
  • 健康检查 & 告警事件 🚨
  • OpenTelemetry 跟踪 🕵️
  • 证书管理 & Kubernetes 部署 ☸️

实现「即克隆、即运行、即监控」的工业数据平台!✨


二、系统架构 🏗️

🔍 读数据
OPC UA Server
OpcUaService
OpcUaCollectorWorker
ApplicationService
EF Core / PostgreSQL
Redis 缓存 IDistributedCache
UI Layer

三、配置与校验 🔧

appsettings.json

"OpcUa": {"Endpoint": "opc.tcp://localhost:4840","NodeIds": ["ns=2;s=Device1", "ns=2;s=Device2"],"CacheDurationSeconds": 120,"AutoAcceptUntrusted": false,"Certificate": {"StorePath": "/etc/opcua/certs","SubjectName": "CN=OpcAbpIntegration"}
}

校验示例

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{var config = context.ServiceProvider.GetRequiredService<IConfiguration>();var section = config.GetSection("OpcUa");if (!section.Exists())throw new ConfigurationErrorsException("🔴 OpcUa 配置节缺失!");var endpoint = section["Endpoint"];if (string.IsNullOrWhiteSpace(endpoint))throw new ConfigurationErrorsException("🔴 OpcUa.Endpoint 不能为空!");var nodeIds = section.GetSection("NodeIds").Get<string[]>();if (nodeIds == null || nodeIds.Length == 0)throw new ConfigurationErrorsException("🔴 OpcUa.NodeIds 至少配置一个!");
}

📜 配置校验流程

读取 appsettings.json OpcUa 节
节是否存在?
抛出 “配置节缺失” 异常
读取 Endpoint 与 NodeIds
Endpoint 非空?
抛出 “Endpoint 不能为空” 异常
NodeIds 数组长度 > 0?
抛出 “NodeIds 至少配置一个” 异常
配置校验通过 🎉

四、OpcUaService 增强:线程安全 + Polly 重试 🔐🔄

public class OpcUaService : IOpcUaService, ISingletonDependency
{private readonly IOptions<OpcUaOptions> _options;private readonly ILogger<OpcUaService> _logger;private Session? _session;private readonly SemaphoreSlim _lock = new(1, 1);public OpcUaService(IOptions<OpcUaOptions> options, ILogger<OpcUaService> logger){_options = options;_logger = logger;}public async Task<Session> EnsureSessionAsync(){await _lock.WaitAsync();try{if (_session?.Connected == true) return _session;var config = new ApplicationConfiguration{ApplicationName         = "OpcAbpIntegration",ApplicationUri          = "urn:abp:opcua",ApplicationType         = ApplicationType.Client,SecurityConfiguration   = new SecurityConfiguration{ApplicationCertificate = new CertificateIdentifier{StoreType   = "Directory",StorePath   = _options.Value.Certificate.StorePath,SubjectName = _options.Value.Certificate.SubjectName},AutoAcceptUntrustedCertificates = _options.Value.AutoAcceptUntrusted},ClientConfiguration    = new ClientConfiguration { DefaultSessionTimeout = 60000 },TransportQuotas        = new TransportQuotas { OperationTimeout = 15000, MaxMessageSize = 4_194_304 }};await config.Validate(ApplicationType.Client);var endpointDesc = CoreClientUtils.SelectEndpoint(_options.Value.Endpoint, false);var endpoint     = new ConfiguredEndpoint(null, endpointDesc, EndpointConfiguration.Create(config));_session = await Session.Create(config, endpoint, false, "OPC UA", 60000, new UserIdentity(), null);_logger.LogInformation("✅ OPC UA 会话已连接:{Endpoint}", _options.Value.Endpoint);return _session;}finally{_lock.Release();}}public async Task<string> ReadNodeAsync(string nodeId){return await Policy.Handle<Exception>().WaitAndRetryAsync(retryCount: 3,sleepDurationProvider: attempt => TimeSpan.FromSeconds(1 << attempt),onRetry: (ex, delay) => _logger.LogWarning(ex, "重试读取节点 {NodeId}", nodeId)).ExecuteAsync(async () =>{var session = await EnsureSessionAsync();_logger.LogDebug("📡 读取节点 {NodeId}", nodeId);var node    = new ReadValueId { NodeId = new NodeId(nodeId), AttributeId = Attributes.Value };var results = new DataValueCollection();await session.Read(null, 0, TimestampsToReturn.Both, new[] { node }, out results, out _);return results.FirstOrDefault()?.Value?.ToString() ?? "";});}
}

🔒 OPC UA 会话重连流程

调用 ReadNodeAsync(nodeId)
Policy 重试入口
确保获取 Session:EnsureSessionAsync
Session 已连接?
直接返回同一 Session
创建 ApplicationConfiguration
SelectEndpoint & ConfiguredEndpoint
Session.Create 建立会话
返回新会话
执行 Read 操作
返回节点值 或 抛出异常

五、数据采集作业:异常隔离 + 告警上报 🚨

public class OpcUaCollectorWorker : BackgroundWorkerBase
{private readonly IOpcUaService _opcUa;private readonly IDistributedCache<MyDeviceCacheItem> _cache;private readonly IMyDeviceRepository _repository;private readonly IDistributedEventBus _eventBus;private readonly IOptions<OpcUaOptions> _options;private readonly ILogger<OpcUaCollectorWorker> _logger;public override float DelayFactor => 1; // 可配置执行间隔public OpcUaCollectorWorker(IOpcUaService opcUa,IDistributedCache<MyDeviceCacheItem> cache,IMyDeviceRepository repository,IDistributedEventBus eventBus,IOptions<OpcUaOptions> options,ILogger<OpcUaCollectorWorker> logger){_opcUa      = opcUa;_cache      = cache;_repository = repository;_eventBus   = eventBus;_options    = options;_logger     = logger;}[UnitOfWork]public override async Task ExecuteAsync(CancellationToken stoppingToken){var failedNodes = new List<string>();var sw          = Stopwatch.StartNew();foreach (var nodeId in _options.Value.NodeIds){try{var value = await _opcUa.ReadNodeAsync(nodeId);await _repository.InsertOrUpdateAsync(new MyDeviceData(nodeId, value),existing => existing.Update(value));await _cache.SetAsync(nodeId,new MyDeviceCacheItem(value),new DistributedCacheEntryOptions {AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(_options.Value.CacheDurationSeconds)});_logger.LogInformation("📥 节点 {NodeId} 数据已更新", nodeId);}catch (Exception ex){_logger.LogError(ex, "❌ 读取节点 {NodeId} 失败", nodeId);failedNodes.Add(nodeId);}}sw.Stop();_logger.LogInformation("🔄 本次采集用时 {Elapsed} ms", sw.ElapsedMilliseconds);if (failedNodes.Count > 0){await _eventBus.PublishAsync(new NodeReadFailedEvent(failedNodes));_logger.LogWarning("⚠️ 发布读取失败告警,节点:{Nodes}", string.Join(',', failedNodes));}}
}

📥 数据采集 & 缓存流程

Worker 启动 ExecuteAsync
遍历 OpcUaOptions.NodeIds
调用 ReadNodeAsync(nodeId)
读取成功?
InsertOrUpdate 到数据库
SetAsync 到 Redis 缓存
记录失败节点到 failedNodes
继续下一个 nodeId
循环结束?
failedNodes 非空?
Publish NodeReadFailedEvent
完成,结束本次作业

六、模块注册补全 🎛️

[DependsOn(typeof(AbpEntityFrameworkCoreModule),typeof(AbpDistributedCacheModule),typeof(AbpBackgroundWorkersModule),typeof(AbpAutofacModule))]
public class OpcUaModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// 1️⃣ 配置绑定与校验(见 OnApplicationInitialization)context.Services.Configure<OpcUaOptions>(context.Services.GetConfiguration().GetSection("OpcUa"));// 2️⃣ 核心服务注册context.Services.AddSingleton<IOpcUaService, OpcUaService>();// 3️⃣ EF Core & 仓储context.Services.AddAbpDbContext<MyDbContext>(opts =>{opts.AddDefaultRepositories(includeAllEntities: true);});// 4️⃣ Background Workercontext.Services.AddBackgroundWorker<OpcUaCollectorWorker>();// 5️⃣ 健康检查context.Services.AddHealthChecks().AddCheck<OpcUaHealthCheck>("opcua").AddNpgSql("YourPostgreConnection").AddRedis("localhost");// 6️⃣ OpenTelemetry 跟踪context.Services.AddOpenTelemetryTracing(builder =>{builder.AddAspNetCoreInstrumentation().AddHttpClientInstrumentation().AddEntityFrameworkCoreInstrumentation().AddSource("OpcUaService").AddJaegerExporter();});}
}

OpcUaHealthCheck 示例

public class OpcUaHealthCheck : IHealthCheck
{private readonly IOpcUaService _opcUa;public OpcUaHealthCheck(IOpcUaService opcUa) => _opcUa = opcUa;public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken token = default){try{await _opcUa.EnsureSessionAsync();return HealthCheckResult.Healthy("OPC UA session is healthy");}catch (Exception ex){return HealthCheckResult.Unhealthy("OPC UA session failed", ex);}}
}

七、证书 & Kubernetes 部署 ☸️

1. 生成并信任证书(Linux)

openssl genrsa -out client.key 2048
openssl req -new -x509 -key client.key -out client.crt -days 365 \-subj "/CN=OpcAbpIntegration"
mkdir -p /etc/opcua/certs/trusted
cp client.crt /etc/opcua/certs/trusted/

📦 证书生成与挂载流程

Kubernetes 部署
本地生成证书
Pod spec 中挂载 volume
创建 Secret opcua-certs
容器启动时可读 /etc/opcua/certs
openssl req -new -x509 client.crt
openssl genrsa client.key
mkdir /etc/opcua/certs/trusted
cp client.crt 到 trusted 目录

2. Kubernetes Secret 示例

apiVersion: v1
kind: Secret
metadata:name: opcua-certsnamespace: your-ns
stringData:client.crt: |-----BEGIN CERTIFICATE-----...base64...-----END CERTIFICATE-----

3. Pod 挂载

volumeMounts:
- name: opcua-certsmountPath: /etc/opcua/certs
volumes:
- name: opcua-certssecret:secretName: opcua-certs

4. Liveness/Readiness Probes

readinessProbe:httpGet:path: /health/readyport: 5000initialDelaySeconds: 10periodSeconds: 30livenessProbe:httpGet:path: /health/liveport: 5000initialDelaySeconds: 30periodSeconds: 60

☸️ K8s 探针配置流程

容器启动
InitContainer 挂载证书
主容器启动 ABP 应用
应用暴露 /health/ready 与 /health/live
K8s ReadinessProbe 调用 /health/ready
K8s LivenessProbe 调用 /health/live
Ready?
开始接收流量
持续探测
Alive?
重启 Pod
继续运行

八、日志采集与可观测性 🔍

  • 推荐安装 NuGet 包:
    • OpenTelemetry.Extensions.Hosting
    • OpenTelemetry.Instrumentation.Http, AspNetCore, EntityFrameworkCore
  • 日志平台:SeqELKJaeger
  • ABP 自带日志面板可实时查看采集结果

九、结语 🎉

此版本已实现企业级「高可用、可复现、可维护」规范,覆盖从 证书配置作业调度缓存优化健康检查可观测 的全链路实践。

📦 推荐 将此框架部署于 IoT EdgeKubernetes,并结合 CI/CD自动化证书脚本,打造工业物联网的实时采集+可视化体系!


相关文章:

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…...

【springcloud学习(dalston.sr1)】Ribbon负载均衡(七)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; &#xff08;一&#xff09;Ribbon 负载均衡的理解 ribbon是一种客户端的负载均衡。类似于比如我们在火车站窗口…...

编程题 03-树1 树的同构【PAT】

文章目录 题目输入格式输出格式输入样例1&#xff08;对应图一&#xff09;输出样例1输入样例2&#xff08;对应图二&#xff09;输出样例2 题解解题思路完整代码 编程练习题目集目录 题目 给定两棵树 T 1 T_1 T1​ 和 T 2 T_2 T2​ 。如果 T 1 T_1 T1​ 可以通过若干次左右…...

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…...

Chrome安装最新vue-devtool插件

本vue-devtool版本是官方的 v7.6.8版本&#xff0c;兼容性好、功能齐全且稳定。 操作步骤&#xff1a; 方法一&#xff1a; 打开谷歌浏览器 --> 右上角三个点 --> 扩展程序 --> 管理扩展程序 --> 加载已解压的扩展程序&#xff0c; 然后选择解压后的文件夹即可。…...

鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp

使用UniApp打造多功能图表展示组件 在当前移动应用开发领域&#xff0c;数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标&#xff0c;一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架&#xff0c;如何在其中实现…...

海量数据Top k 与查重问题

海量数据求top k 问题&#xff1a; - 求最大的前k个元素、求最小的前k个元素 - 求最大的第k个元素、求最小的第k个元素 解法&#xff1a; - 大根堆、小跟堆 -》 优先级队列&#xff08;priority_queue&#xff09; - 快速分割函数 priority_queue<int,vector<int>…...

Beats

Beats是一个开放源代码的数据发送器。我们可以把Beats作为一种代理安装在我 们的服务器上&#xff0c;这样就可以比较方便地将数据发送到Elasticsearch或者Logstash 中。Elastic Stack提供了多种类型的Beats组件。 Beats可以直接将数据发送到Elasticsearch或者发送到Logstash&a…...

微型PCB打样厂家选型指南

智能手机、可穿戴设备、医疗电子等高精尖领域&#xff0c;微型PCB&#xff08;印制电路板&#xff09;如同设备的“神经中枢”&#xff0c;承载着信号传输、电源分配、元件互联等核心功能。其设计精度与制造质量直接决定了产品的性能上限与可靠性。而打样环节&#xff0c;则是从…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

编程技能:字符串函数04,直接使用 strcpy,解决报错

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数03&#xff0c;strncpy 回到目录…...

网络编程超时检测,unix域套接字,粘包

刷题&#xff1a; # 超时检测核心要点## 1. 基本类型### 阻塞模式- 永久等待数据&#xff0c;无超时机制- 典型函数&#xff1a;recv()阻塞调用### 非阻塞模式- 立即返回结果&#xff08;成功/错误&#xff09;- 设置方式&#xff1a;fcntl(fd, F_SETFL, O_NONBLOCK)### 超时检…...

springboot AOP 接口限流(基于IP的接口限流和黑白名单)

使用 Spring Boot 自定义注解和AOP实现基于IP的接口限流和黑白名单 在我们日常开发的项目中为了保证系统的稳定性&#xff0c;很多时候我们需要对系统做限流处理&#xff0c;它可以有效防止恶意请求对系统造成过载。常见的限流方案主要有&#xff1a; 网关限流&#xff1a; NG…...

Python uv包管理器使用指南:从入门到精通

Python uv包管理器使用指南&#xff1a;从入门到精通 作为一名Python开发者&#xff0c;你是否曾经为虚拟环境管理和依赖包安装而头疼&#xff1f;今天我要向大家介绍一个强大的工具——uv包管理器&#xff0c;它将彻底改变你的Python开发体验。 什么是uv包管理器&#xff1f…...

【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证

TLS工作流程简化版 证书验证流程 客户端通过CA的公钥验证服务器数字证书的签名&#xff0c;确保服务器身份可信&#xff0c;防止中间人攻击。 预主密钥加密传输 客户端生成预主密钥&#xff0c;用服务器证书中的公钥加密后发送给服务器&#xff0c;只有服务器&#xff08;持有…...

Stable Diffusion WebUI 插件大全:功能详解与下载地址

Stable Diffusion WebUI 的强大之处在于其丰富的插件生态&#xff0c;这些插件可以大幅提升 AI 绘画的效率和质量。本文将详细介绍 21 个常用插件&#xff0c;包括它们的功能、效果说明以及下载地址&#xff0c;帮助你更好地使用 Stable Diffusion WebUI。 插件的安装方式 直…...

【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略

文章目录 &#x1f3ae; 策略模式&#xff08;Strategy Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;动态伤害计算系统&#xff09;1. 定义策略接口与上下文2. 实现具体策略3. 客户端使用 四、模式进阶技巧1. 策略组合2. 策…...

第二十九节:直方图处理-直方图均衡化

在数字图像处理中,直方图均衡化(Histogram Equalization)是一种经典的对比度增强技术。它通过重新分配图像像素的亮度值,使图像的灰度级分布更加均匀,从而显著提升图像的视觉效果。 一、直方图基础 1.1 什么是直方图? 直方图(Histogram)是图像处理中用于描述图像像素…...

性能比拼: Nginx vs. Envoy

本内容是对知名性能评测博主 Anton Putra Nginx vs. Envoy performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 Envoy 被设计为服务网格中的高性能代理。 你可以将它部署在虚拟机&#xff08;VM&#xff09;中&#xff0c;或作为 sidecar 方式部…...

在 C 语言中,U、UL、ULL、L、LL 等符号使用说明

在 C 语言中&#xff0c;U、UL、ULL、L、LL 等符号是用于明确指定整数字面量类型的后缀&#xff0c;其核心作用是避免数据类型隐式转换导致的溢出或未定义行为。以下是具体分类和使用场景&#xff1a; 一、整数字面量后缀分类 后缀全称适用场景示例说明Uunsigned100U无符号整数…...

一般枚举题目合集

一般枚举题目合集 枚举NOIP 2011 提高组 铺地毯P2327 [SCOI2005] 扫雷蓝桥真题 跑步蓝桥真题 猜年龄 二进制枚举常用的技巧整理子集 - 力扣P10449 费解的开关UVA11464 Even Parity通过Virtual Judge提交代码正解 日期枚举蓝桥真题 跑步NOIP 2016 普及组 回文日期日期统计 写这段…...

MCP(Model Context Protocol,模型上下文协议)

1. 起因&#xff0c; 目的: MCP, 貌似最近很火&#xff0c;简单了解一下&#xff0c; 跟上时代节奏。看似是一个工具&#xff0c;一个新概念&#xff0c;其实是个鸡肋&#xff08;仅仅代表个人观点&#xff09;。 2. 先看效果 这里插入图片 3. 过程: 问题1, 什么是 MCP h…...

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常会借助 Spring Integration 项目提供的 MQTT 支持。这使得 MQTT 的集成可以很好地融入 Spring 的消息驱动和企业集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的详细步骤&#xff1a; 前提条件&#xff1a; MQTT Broker&#xff…...

uniapp使用全局组件,

在 Uniapp 中&#xff0c;如果你的组件是应用层组件&#xff08;例如全局悬浮按钮、全局通知栏等&#xff09;&#xff0c;并且希望它自动出现在所有页面而无需在每个页面模板中手动添加组件标签&#xff0c;可以通过以下两种方案实现&#xff1a; 方案一&#xff1a;通过 app.…...

【三维重建】三维场景生成:综述

标题&#xff1a;《3D Scene Generation: A Survey》 来源&#xff1a;新加坡南洋理工大学 项目&#xff1a;https://github.com/hzxie/Awesome-3D-Scene-Generation 文章目录 摘要一、前言二、准备工作2.1 任务定义2.2 三维场景表示2.3 生成模型 三、方法&#xff1a;分层分类…...

怎样将MM模块常用报表设置为ALV默认格式(MB52、MB5B、ME2M、ME1M等)

【SAP系统研究】 对SAP系统中的报表,最方便的格式就是ALV了,可排序、可导出,非常友好。 但有些常见报表却不是默认ALV界面的,譬如MB52: 是不是有点别扭?但其实是可以后台配置进行调整的。 现将一些常用报表修改为默认ALV的方法进行总结,便于大家使用。 一、MB52、MB5…...

Flutter 开发入门:从一个简单的计数器应用开始

在当今快速发展的移动应用开发领域&#xff0c;Flutter 框架以其高效、跨平台的特点脱颖而出&#xff0c;成为许多开发者的首选。本文将通过一个简单的 Flutter 项目代码&#xff0c;带你深入了解 Flutter 开发的基本概念和流程。这个项目是一个简单的计数器应用&#xff0c;它…...

Python解释器、REPL与脚本的区别

用ChatGPT做软件测试 “初学者写代码&#xff0c;高手理解运行。” 要成为真正理解代码的人&#xff0c;必须透彻理解&#xff1a;Python 是如何运行你的代码的&#xff1f;解释器、REPL 和脚本之间的界限与联系究竟是什么&#xff1f; 一、编程学习常见误区&#xff1a;把“运…...

总共76dp 空出20dp然后放一个控件的写法

<FrameLayout android:id"id/bt_user_agree" android:layout_width"120dp" android:layout_height"76dp" > <ImageView android: 这里里上一个 android:layout_width"wrap_content" android:layout_height"40dp" …...

【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级

在微服务架构中&#xff0c;保障服务的稳定性和高可用性至关重要。本文将详细介绍在 PmHub 中如何利用 Sentinel Gateway 进行网关限流&#xff0c;以及集成 Sentinel OpenFeign 实现自定义的 fallback 服务降级。 1 熔断降级的必要性 在微服务架构中&#xff0c;服务间的调…...

C#扩展方法的入门理解

public static class CanGetModelExtension {public static T GetModel<T>(this ICanGetModel self) where T : class, IModel >self.GetArchitecture().GetModel<T>(); } 前言&#xff1a; 在学习QFramework时&#xff0c;看底层框架代码注意到这个函数&#…...

HTML应用指南:利用POST请求获取全国圆通快递服务网点位置信息

圆通快递作为国内物流行业的领军企业&#xff0c;自2000年成立以来&#xff0c;始终秉持 “客户要求&#xff0c;圆通使命” 的服务宗旨&#xff0c;致力于为客户提供高效、优质的物流服务。凭借其庞大的物流网络、先进的信息技术以及卓越的运营管理&#xff0c;圆通快递在激烈…...

vulnhub靶场——secarmy

靶机&#xff1a;secarmy靶机&#xff0c;IP地址为192.168.230.18 攻击&#xff1a;kali&#xff0c;IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用NAT模式 端口扫描&#xff1a; nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…...

Daily AI 20250514 (迁移学习与元学习)

参考资料&#xff1a;神经网络与深度学习 目录 迁移学习 &#xff08;Transfer Learning&#xff09;归纳迁移学习转导迁移学习 元学习 &#xff08;Meta Learning&#xff09;基于优化器的元学习模型无关的元学习&#xff08;Model-AgnosticMeta-Learning&#xff0c;MAML&am…...

牛市买卖数字货币逻辑

在牛市中进行数字货币交易&#xff0c;核心逻辑是顺势而为、控制风险、把握周期。以下是关键策略和逻辑框架&#xff1a; 一、牛市的核心逻辑 资金驱动 牛市由增量资金&#xff08;新投资者、机构资金、杠杆资金&#xff09;推动&#xff0c;流动性充裕时&#xff0c;市场情绪乐…...

7.DTH11和PWM波

目录 室内/本地温湿度检测 温湿度传感器介绍 获取手册和例程的方法 从手册中提取重要信息 传感器的分类 温度传感器类型 DHT11 的介绍 温湿度传感器的接口 温湿度传感器的时序 温湿度传感器电路介绍 IO 的配置 定时器输出 PWM 波 PWM 波介绍 PWM 波的作用&#x…...

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中&#xff0c;交互规则主要有三个核心要素&#xff0c;分别为重要性、原则与实践&#xff0c;具体表现在&#xff1a; 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑&#xff1a;设计阶段制定交互规则&#xff0c;清晰定义界面元素操作响应。 如社交应用…...

树的直径 | 树的最长路径

树的直径&#xff1a; 树上任意两节点之间最长的简单路径即为树的「直径」。 定理&#xff1a; 在一棵树上&#xff0c;从任意节点 u 开始进行一次 DFS&#xff0c;到达的距离其最远的节点 v 必为直径的一端。 B4016 树的直径 - 洛谷 思路&#xff1a; 由于这题中每条边的…...

AbMole解读:脂质体的关键组分和主要合成方法

脂质体&#xff08;Liposome&#xff09;是一种由磷脂等两性分子自发形成的封闭囊泡结构&#xff0c;随着纳米技术、材料科学等多学科的交叉发展&#xff0c;脂质体的研究与应用进入了一个新的阶段&#xff0c;并在肿瘤研究、疫苗研发、基因递送等多个领域发挥着关键作用。AbMo…...

Python爬虫之品牌口碑数据抓取

上一篇我们介绍了爬虫营销的优势&#xff0c;这次我就展开详细的说说&#xff0c;如何通过爬取社交媒体或电商平台的公开评论来分析自己或竞争对手的品牌声誉。 选择微博这样的平台&#xff0c;因为它的数据相对公开&#xff0c;而且有API支持&#xff0c;但要注意频率限制和反…...

【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】

“车机蓝牙音乐免切源” 是近年来车载系统&#xff08;IVI&#xff0c;In-Vehicle Infotainment&#xff09;中常见的一个用户体验优化功能。它主要是为了简化蓝牙音乐播放流程、减少用户操作&#xff0c;提升使用便捷性。 一、什么是“切源”&#xff1f; 在车机系统中&#…...

眼镜店哪个品牌好,你会选择哪一款眼镜

有些人买眼睛是为了耍帅&#xff0c;有些人买眼镜&#xff0c;可能就是为了调节视力。现在手机以及其他的电子产品越来越普及&#xff0c;近视眼的人群是越来越多了&#xff0c;那么要准备去配眼镜的话&#xff0c;就要找到一个正规的眼镜店&#xff0c;一起来了解一下眼镜店哪…...

基于EFISH-SCB-RK3576/SAIL-RK3576的畜禽养殖监控仪技术方案‌

&#xff08;国产化替代J1900的农业物联网解决方案&#xff09; 一、硬件架构设计‌ ‌多源环境感知模块‌ ‌空气质量监测‌&#xff1a; 集成NH₃/CO₂/H₂S三合一气体传感器&#xff08;量程0-500ppm&#xff0c;精度2%FS&#xff09;&#xff0c;采样间隔≤1秒激光粉尘检测…...

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户&#xff08;root&#xff09;&#xff1a; 普通用户&#xff1a; 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…...

LeRobot 框架的核心架构概念和组件(中)

本文档概述构成 LeRobot 框架的核心架构概念和组件。它介绍主要的子系统&#xff0c;并解释它们如何相互作用以实现机器人学习。 。。。。。。继续。。。。。。 环境接口 环境系统提供与模拟环境交互的统一接口。这些环境允许在部署到物理机器人之前&#xff0c;在受控环境中…...

鸿蒙5.0项目开发——鸿蒙天气项目的实现(主页1)

【高心星出品】 文章目录 页面效果&#xff1a;页面功能&#xff1a;页面执行流程&#xff1a;1. 页面初始化阶段2. 定位获取阶段3. 天气数据加载阶段 这个页面是整个天气应用的核心&#xff0c;集成了天气查询、定位、搜索等主要功能&#xff0c;提供了完整的天气信息服务。 …...

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析

虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之摄像机与场景捕获相关概念的解析1. UE中SceneCapture和UCameraComponent的关系是什么&#xff1f;Camera和SceneCapture2D的关系是什么1.1 UCameraComponen…...

【vim】--- vim 插件说明 超详细持续更新中

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】--- vim 插件说明 超详细持续更新中 开发环境一、vim 插件管理器1、Vim-Plug2…...

医学影像系统的集成与工作流优化

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

Vue 和 React 状态管理的性能优化策略对比

一、Vue 状态管理优化策略 合理使用 Vuex 模块化 将全局状态拆分为模块&#xff0c;按需加载&#xff0c;避免单一 Store 文件过大。通过命名空间隔离状态&#xff0c;减少状态冗余和无效更新。 const moduleA { namespaced: true, state: { /* ... */ } }; const store new …...