基于Dubbo的服务管理监控平台实战:从注册中心到Metrics告警

简介:本资源是一个基于Dubbo构建的完整服务管理与监控平台实现,面向Java微服务开发者及分布式系统运维人员,解决Dubbo服务注册发现、动态治理、实时监控与可视化运维等核心问题,适用于电商、金融等高并发业务场景下的服务治理实践。压缩包共698个文件,含91个Java后端逻辑与配置类、260个JavaScript前端交互脚本、145个HTML页面与102个CSS样式文件,支撑起完整的控制台界面与监控看板;另有30个XML配置、5个Properties及1个YML文件用于环境与服务治理参数定义,整体大小为4.37MB。资源已获37人学习下载,提供开箱即用的本地部署能力——包含start-mongodb.bat、install-mysql.bat等一键启停与安装脚本,覆盖MongoDB、MySQL、Lucene等依赖组件,目录结构清晰分层,便于理解Dubbo管控平台前后端协同机制与典型微服务治理落地路径。 接手Dubbo微服务项目后做的最有价值的一件事,就是把散落在日志、命令行和临时脚本里的服务信息,收拢成一套真正能看的服务管理监控平台。展开之前先说一下背景:核心业务系统全面微服务化后,应用数量很快来到五十多个,Dubbo接口超过两千个。日常工作中反复遇到三类问题——新服务上线后,运维同学要确认它有没有成功注册到注册中心、有没有被其他服务发现;开发同学排查问题时,想知道某个接口当前的调用量、耗时、成功率,但只能靠翻日志;线上偶尔出现依赖服务抖动,等我们察觉的时候,用户已经先于我们发现了。这三类问题单靠Dubbo框架本身都没法解决。

Dubbo的核心定位是RPC服务框架,解决的是服务间如何发现、如何调用、如何路由的问题,但它的设计哲学是“把扩展点暴露出来,不替你做运维决策”。所以要在Dubbo之上补齐两块能力:服务治理能力和可观测能力。服务治理解决“服务在哪、如何控制流量、如何管理配置”,可观测能力解决“服务好不好、哪里慢、哪里挂了”。基于这个思路,我把整个平台拆成四个核心模块:服务注册与发现、服务管理控制台、Metrics采集与展示、告警提醒。这篇文章就按这四个模块展开,讲清楚做什么、为什么这么做,以及哪些配置坑是你一定会踩的。

1. 需求分析:什么时候你确实需要这套平台

我见过不少团队把服务管理监控平台做成“大而全、没人用”的摆设,核心原因是没有想清楚当前阶段到底要解决什么问题。先别急着选型,把需求拆清楚,平台架构自然就出来了。

1.1 服务变多后最先暴露的三个问题

第一是服务可见性问题。项目初期服务少,谁依赖谁还能靠脑子记,服务到五十个以后就完全记不住了。Nacos控制台虽然能看到服务列表,但运维同事看的是“服务名+IP”,开发同事想看的是“这个接口有哪些提供者、哪些消费者、最近调用的健康状态”,两种视角不匹配。

第二是调用质量难评估。Dubbo自身有重试、超时、负载均衡机制,但没有任何可视化界面告诉你某个接口过去五分钟的平均耗时、TP99、成功率。没有这些数据,调优就是盲人摸象。我曾经调一个订单查询接口,直觉认为是数据库慢导致超时,加了索引、调了连接池,结果事后看监控才发现瓶颈在某个下游基础服务的GC停顿上。

第三是故障发现太被动。服务依赖关系是网状结构,一个基础服务抖动,上游一堆接口跟着遭殃。如果没有指标趋势和告警,等业务方报障时,问题往往已经扩散到多个服务。监控平台核心价值就是把“被动救火”变成“主动发现”。

1.2 平台能力边界:哪些该做,哪些不该做

搭建平台前必须划定边界。当时有同事建议把日志采集、链路追踪、容器监控全部并入进来,我拦住了。基于Dubbo的服务管理监控平台,重点应放在三个层面:

  • 服务注册数据的管理与可视化:服务列表、实例状态、消费者关系、元数据信息。
  • 动态治理规则的配置入口:权重调整、路由规则、参数校验开关、集群容错策略。
  • 接口级Metrics的采集与展示:调用量、耗时、成功率、线程池状态、QPS等。

日志采集交给ELK,链路追踪交给SkyWalking或Zipkin,容器监控交给Prometheus体系中的Node exporter和cAdvisor。它们之间可以做数据串联,但不要揉进同一个平台里。把平台做成小而精,团队使用意愿才会高,后期维护成本也低。

2. 注册中心选型与服务发现实现

Dubbo老一代项目里最常见的注册中心是Zookeeper,Zookeeper的强一致性和监听机制在传统部署模式下表现稳定,但集群运维成本不低,控制台能力也比较弱。这次选型我最终定了Nacos,核心原因有三个:第一,Nacos原生区分临时实例和非临时实例,健康检查机制比ZK的Session监听更直观;第二,Nacos自带控制台,服务列表和实例状态一目了然,运维同学不需要额外装客户端工具;第三,一个Nacos集群可以同时承担注册中心和配置中心,少维护一套基础设施。

2.1 Nacos部署与Dubbo接入的配置细节

Nacos部署本身不复杂,但有几个关键参数容易被忽略。以Dubbo 3.x接入Nacos为例,核心配置如下:

dubbo.registry.address=nacos://192.168.1.20:8848?namespace=dev
dubbo.metadata-report.address=nacos://192.168.1.20:8848
dubbo.application.name=order-service
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.base-packages=com.example.order.rpc

第一行 namespace=dev 很容易被漏掉。它决定了当前应用注册到Nacos的哪个命名空间,dev、test、prod必须分开,否则测试环境会调到生产服务。这种串环境的事故我亲眼见过不止一次。第二行 dubbo.metadata-report.address 是元数据中心地址,很多项目省略了它,导致服务详情里看不到方法列表和参数信息。老版本Dubbo依赖Zookeeper存储元数据,2.7以后推荐独立配置元数据中心,升级迁移时这一行必须补上。

接入Nacos时,Dubbo客户端会自动向Nacos注册两类服务:一类是 providers:com.example.UserService:1.0.0 这样的提供者服务,一类是 consumers:com.example.UserService:1.0.0 这样的消费者服务。在Nacos控制台看到这两类数据,说明注册链路是通的。

2.2 注解解析:@DubboService与@DubboReference的底层逻辑

新项目基本都是用注解方式暴露和引用服务。Dubbo 3.x里注解名从 @Service 调整为 @DubboService ,兼容老注解但推荐统一使用新的,避免和Spring的 @Service 混淆。

提供者侧写法:

@DubboService(version = "1.0.0", group = "order", timeout = 3000, retries = 0)
public class OrderServiceImpl implements OrderService {
    @Override
    public OrderDetail getOrderById(Long orderId) {
        // 业务逻辑
    }
}

消费者侧写法:

@DubboReference(version = "1.0.0", group = "order", timeout = 3000, check = false)
private OrderService orderService;

每个参数都值得说清楚。 timeout=3000 是单次调用超时上限,单位毫秒。 retries=0 表示失败不重试,这个对写操作特别重要,试想一个下单接口超时后自动重试两次,结果就是重复下单。 check=false 表示应用启动时不强制确认提供者存在,否则消费者启动会直接报 No provider 。对于有依赖延迟提供的场景, check=false 是必须的。

注解背后的处理机制值得了解。Dubbo通过 ServiceAnnotationBeanPostProcessor 扫描 @DubboService 标注的类,把它包装成 ServiceBean ,然后 ServiceBean 在Spring容器刷新时向注册中心暴露服务。 @DubboReference 则通过 ReferenceAnnotationBeanPostProcessor 注入代理对象,代理内部封装了寻址、负载均衡、容错、超时等逻辑。这些后置处理器都是Spring容器扩展点机制的典型应用,理解了这条链路,你排查“注解不生效、服务没暴露”这类问题时思路会清晰很多。

这里有一个很容易踩的坑: dubbo.scan.base-packages 配置的扫描包路径必须覆盖所有服务实现类所在的包。如果漏了,应用能正常启动,但不报任何错误,服务一直不暴露,消费者请求总是超时或报No provider。排查这类问题时,优先到Nacos控制台看有没有 providers 服务注册。

2.3 服务分组、版本与元数据中心

服务标识由 interfaceName:version:group 三部分组成。版本号用于灰度发布和接口兼容升级,group用于逻辑隔离。建议在服务命名时把group定义为业务线名称,比如 group=order 、 group=user ,这样在Nacos控制台和监控大屏上能直接区分服务归属。

元数据中心的作用是存储每个服务的完整接口信息,包括方法列表、参数类型、返回值类型、配置项等。Dubbo 3在服务发现上有一个重要的演进方向是应用级服务发现,注册到注册中心的Key从接口粒度变成应用粒度,元数据信息全部丢给元数据中心。这样在超大规模集群下显著减少了注册中心的存储压力。如果你用的是Dubbo 2.7以下版本,建议至少规划一次升级,否则未来服务规模上来后,注册中心的数据量会成为瓶颈。

3. 服务管理:Dubbo Admin的部署与治理规则

注册中心解决了“服务在哪里”,服务管理平台解决“服务怎么管”。Dubbo社区官方提供了Dubbo Admin,它天然适配Dubbo服务模型,不需要额外开发管理端接口。有人可能会想用Nacos控制台替代,但Nacos只能看到注册数据,Dubbo Admin能下发治理规则,两者的定位完全不同。

3.1 Dubbo Admin部署步骤

部署Dubbo Admin本质上是一个Spring Boot应用,步骤不复杂,但有几个细节操作容易出错。

第一步,拉取源码并构建。如果只是部署使用,建议直接用官方发布的release包。

git clone https://github.com/apache/dubbo-admin.git
cd dubbo-admin
mvn clean package -Dmaven.test.skip=true

这一步耗时较长,网络不好时需要注意。构建产物在 dubbo-admin-distribution/target 目录下。

第二步,修改配置文件。Dubbo Admin主配置在 application.properties ,关键项如下:

admin.registry.address=nacos://192.168.1.20:8848
admin.config-center=zookeeper://192.168.1.21:2181
admin.metadata-report.address=nacos://192.168.1.20:8848
admin.registry.group=dubbo

这里要注意,Dubbo Admin本身依赖配置中心,老版本默认配置了Zookeeper作为配置中心。如果你希望统一用Nacos,需要确保Nacos里放入了对应的配置数据和 dubbo.properties 。我遇到过Admin启动正常但服务列表为空的情况,原因就是配置中心没配好,Admin拉不到注册数据。

第三步,启动并访问。

java -jar dubbo-admin-0.5.0.jar

浏览器访问 http://localhost:8080 ,默认账号密码 root/root。为了安全,必须修改默认密码。我见过有团队把Admin暴露在公网上还保持默认密码,这是非常危险的。

3.2 治理规则配置实操

Dubbo Admin界面里最常用的是“服务查询”和“条件路由”。服务查询可以查某个接口的提供者列表、消费者列表,点击提供者实例能看到IP、端口、版本号、注册时间。条件路由可以在不重启应用的情况下调整流量转发规则。

举一个实际例子:假设 UserService 有四个提供者实例,其中两个是新版本。我想把10%的流量导到新版本实例做灰度。可以在路由规则里配置:

conditions:
  - => host = 10.0.0.18 & host = 10.0.0.19 => 0.1

这条规则的含义是,匹配到两个新版本IP的请求,按0.1的权重比例放行。Dubbo的灰度机制虽然不如Istio精细,但在传统微服务体系内已经够用。

权重调整是另一个高频功能。比如某台机器配置较差,想把它的负载权重降低,在“权重”规则里把该实例的权重从100改成50。注意,权重调整是动态配置,并不需要重启服务,但下发后通常有几秒到几十秒的生效时间,不是即时生效。

治理规则的下发本质上是在配置中心写入一条动态配置,Dubbo客户端会监听配置变化并实时更新。如果调整后规则没生效,优先看配置中心是否正常连通,其次看服务提供者的日志里有没有收到配置变更通知。

4. 监控落地:从Metrics采集到Grafana可视化

服务管理平台有了,但只解决了一半问题。真正让平台有价值的是监控数据。这一部分我详细拆解Metrics采集、Prometheus配置和Grafana面板搭建。

4.1 Dubbo Metrics数据链路解析

Dubbo框架本身就在统计接口调用数据。老版本可以通过Filter机制手工采集,Dubbo 2.7之后官方内置了Metrics模块,底层基于Micrometer。Micrometer是JVM生态的事实标准Metrics门面,支持导出到Prometheus、InfluxDB、Graphite等。

数据链路是这样走的:Dubbo应用内的Metrics数据被Prometheus客户端(micrometer-registry-prometheus)暴露成一个HTTP端点 /prometheus ,Prometheus定时拉取这个端点,把数据写入TSDB,Grafana再从Prometheus查询数据渲染大盘。因为Prometheus是拉取模型,只要应用启动时配置了暴露端点,Prometheus就能持续采集,不需要业务方埋点或者自己推送数据。

在Maven的pom.xml中需要引入两个依赖:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-metrics-prometheus</artifactId>
    <version>3.2.x</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.10.x</version>
</dependency>

然后在配置里开启Metrics端点:

metrics.enable=true
metrics.port=20888

启动应用后访问 http://localhost:20888/prometheus ,能看到一堆 dubbo_ 前缀的指标。常用的指标包括:

指标名 含义
dubbo_provider_service_qps_total 提供者服务每秒请求数
dubbo_provider_service_requests_total 提供者服务总请求数
dubbo_provider_service_duration_seconds_sum 调用总耗时
dubbo_provider_service_duration_seconds_max 最近窗口最大耗时
dubbo_consumer_service_requests_total 消费者侧请求数
dubbo_consumer_service_duration_seconds_sum 消费者侧总耗时
jvm_gc_pause_seconds JVM GC暂停时间

4.2 Prometheus抓取配置与关键指标计算

Prometheus抓取配置的核心是 scrape_configs 。每个Dubbo应用实例都要配置成一个target,最简单的做法是基于文件发现或者静态配置。

scrape_configs:
  - job_name: 'dubbo-services'
    metrics_path: '/prometheus'
    static_configs:
      - targets: ['192.168.1.10:20888', '192.168.1.11:20888']

生产环境实例数量多,静态列表维护成本高,建议用Consul或Nacos的服务发现机制自动发现target。这里是Prometheus配置文件里的一个示例:

scrape_configs:
  - job_name: 'dubbo'
    metrics_path: '/prometheus'
    consul_sd_configs:
      - server: 'consul-server:8500'
        services: ['dubbo-provider']

有了原始指标,需要在Prometheus里计算衍生的业务指标。比如成功率,用两个指标做除法:

sum(rate(dubbo_provider_service_requests_total{job="dubbo-services"}[5m])) 
/
sum(rate(dubbo_provider_service_requests_total{job="dubbo-services"}[5m]) 
+ 
rate(dubbo_provider_service_fail_requests_total{job="dubbo-services"}[5m]))

TP99的计算相对复杂,Dubbo的Metrics默认输出的是Summary类型的直方图,可以直接用 histogram_quantile 函数:

histogram_quantile(0.99,
  sum(rate(dubbo_provider_service_duration_seconds_bucket{job="dubbo-services"}[5m])) by (le)
)

如果你发现指标里没有 _bucket 后缀的直方图数据,说明Micrometer暴露的Summary没启用直方图。需要在配置里显式打开:

management.metrics.distribution.percentiles-histogram.http.server.requests=true

4.3 Grafana面板搭建与告警规则

Grafana配置数据源选择Prometheus,填写Prometheus地址后保存。面板创建时推荐分三层:

第一层是总览面板,显示平台内所有Dubbo服务的数据汇总,包括总QPS、平均耗时、整体成功率、当前注册服务数。配合Google的Console模板风格,图越少越好,让值班同学一眼看清整体情况。

第二层是服务详情面板,按服务名筛选,展示单个接口的调用量QPS、耗时百分位线、成功率、提供者实例数。这一层是开发排查问题的主力面板,建议把服务的group、interface、method作为一个变量维度加进去。Grafana的Dashboard Variables可以做成下拉框,数据源用Prometheus label即可。

第三层是实例面板,按IP和实例维度展示每个节点的JVM线程、GC、内存、CPU。数据Source来自Micrometer暴露的JVM指标和Node exporter,关联起来能在定位问题时快速把“服务慢”和“机器资源不足”建立关联。

告警规则我用的是Prometheus的Alertmanager加Grafana的告警通道。常见的几条告警规则:

  • 成功率低于99%持续5分钟,触发WARNING。
  • QPS突然降为0(服务可能挂掉),触发CRITICAL。
  • P99耗时超过1秒持续10分钟,触发WARNING。
  • 提供者实例数 < 2,触发WARNING。

告警要克制,不要所有指标都设阈值,否则群消息一多,真正的异常会被淹没。我的原则是:只告警影响用户或者代表系统异常的核心信号,其余指标做成图表供主动查看。

5. 实战排查:常见问题与避坑记录

平台上线后,我花了大量时间做故障排查和根因分析,这里把踩过的问题整理出来,每一条都是真实经历。

5.1 服务注册成功但消费者拿不到实例

现象是Nacos控制台能看到 providers:com.example.UserService 的服务名和实例,消费者调用却报 No provider available 。

排查路径:第一,检查消费者的 dubbo.registry.address 和提供者是否指向同一个Nacos且namespace一致。namespace不一致是最常见原因,dev环境消费者调test环境提供者这种事,配置错了就发生。第二,检查group是否匹配,提供者暴露在 group=order ,消费者引用时没指定group,默认找空group,找不到实例。第三,检查注册元数据里有没有 enabled=true 标记,Dubbo 3有时因为动态配置把实例置为禁用状态。

5.2 监控指标出现缺口

某个服务在Prometheus里能抓到数据,但Grafana面板上部分时段没有数据。最可能的不是应用挂了,而是Prometheus抓取周期过长导致了一些短窗口指标被跳过。Prometheus默认抓取间隔是15秒,如果实例重启频率高,会出现指标不连续。

另一个原因是我在自定义Filter里采集指标时,使用了本地缓存并异步上报,应用突然被kill -9时缓存数据还没刷出,导致丢失。排查这类问题最直接的办法:登录Prometheus的Targets页面,看各target的抓取状态,如果出现 context deadline exceeded ,说明应用端响应变慢或连接数打满。

5.3 超时重试导致雪崩的真实现场

有一次线上一个基础服务响应变慢,平均耗时从200ms涨到2秒。下游消费者配置的是 timeout=1000, retries=2 ,结果每个请求都等满超时后重试两次,调用量瞬间放大三倍,基础服务直接被打挂。

复盘时发现,问题不仅出在基础服务,更关键的是消费者侧没有做降级和熔断。Dubbo自带的容错机制是Failover,默认重试两次,这是针对读操作比较友好的策略,但应用到写操作或高并发的下游依赖上,风险非常高。建议场景化配置:读接口可以 retries=1 ,写接口必须 retries=0 ,依赖服务稳定性差时开启 cluster=failfast 或引入熔断降级组件。

5.4 常见问题速查表

问题现象 可能原因 解决方案
注解不生效,服务未暴露 scan包路径配置错误 检查dubbo.scan.base-packages覆盖范围
消费者启动报No provider namespace/group不一致 统一配置注册中心地址和group
服务列表在Nacos可见但在Admin为空 Admin配置中心不可达 检查dubbo-admin的config-center配置
调用超时无异常 下游慢或线程池耗尽 用P99和线程池指标定位瓶颈
指标缺失 抓取周期过长/Filter未启用 调整scrape interval,检查暴露端点
动态配置不生效 配置中心连接断开 查看注册中心客户端日志

6. Dubbo进阶考点与平台演进方向

这套平台搭建过程中,我对Dubbo的服务治理理解也上了一个台阶。面试中被问到的几个高频问题,其实正对应平台中的核心模块,一并整理出来。

6.1 面试里高频出现的Dubbo服务治理问题

第一个问题是“Dubbo是如何做到服务发现的”。答案不仅仅是“注册中心”,要讲清楚临时节点、订阅关系、通知机制这三层。传统ZK模式下,消费者订阅某个服务后会对路径注册Watcher,任何变更都会触发推送;Nacos模式下,消费者通过定时拉取UPSert数据和UDP推送弥补实时性。讲到这里,如果能带着说一句“我的监控平台上看到的服务列表,背后的数据源就是这套机制”,会显得经验扎实。

第二个问题是“@DubboReference 注入的代理对象是怎么工作的”。要答出三层:端口级的调用协议、注册中心寻址、集群容错策略。代理对象内部是一个 Invoker 链,包含 ClusterInvoker (集群策略)、 LoadBalanceInvoker (负载均衡)、 FilterInvoker (过滤器链)、 ListenerInvoker (监听器)。实际调用时,Invoker链逐层执行,最终把请求通过Netty发到提供者。

第三个问题是“Dubbo 3相比Dubbo 2有哪些核心变化”。重点讲三点:应用级服务发现、Triple协议(基于HTTP/2)、云原生友好的Kubernetes支持。Dubbo 3在服务发现上的迁移不是简单API替换,而是重新设计了 ServiceNameMapping 和 MetadataInfo 体系。如果你负责监控平台改造,这块是关键点。

第四个问题是“如何设计一个服务监控指标”。从RED方法展开:Rate(请求速率)、Errors(错误数)、Duration(持续时间)。再结合Dubbo的具体指标名称去说明,就能展示出你确实做过组件落地,而不是只会背理论。

6.2 平台演进方向

平台当前版本满足日常运维需求,但演进空间还很大。我自己想到三个可以继续推进的方向。

第一,接入调用链追踪。Prometheus系指标只能显示聚合视图,单次调用的链路数据缺失。接入SkyWalking或Jaeger后,可以实现从入口到所有Dubbo下游的调用链串联,和Metrics互补。第二,引入自动化巡检。定时检查服务健康状态、检查配置一致性,把人工巡检变成脚本和告警。第三,结合Kubernetes做弹性伸缩。等容器化之后,根据Metrics数据实现HPA,比如某个Dubbo服务的QPS超过阈值后自动扩容实例。

这些演进不是一次做完,而是要在日常迭代中逐步完善。平台不是“搭完就完结”的项目,而是一个需要持续运营的基础设施。

实际运维中我最大的体会是:好平台不是功能堆出来的,而是让使用它的人在每次故障中都能更快定位问题、更有底气做变更。如果你正在为Dubbo服务治理发愁,先按这套方案把注册、管理、监控三根柱子立起来,再往里添砖加瓦。后面遇到具体问题,欢迎一起交流。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

C#Mysql批量查询、自定义DataTable存储数据 asp:Button ID="btn_export" runat="server" Text="导出" Width="100px" Height="25px" BorderStyle="None" BackColor="White" ForeColor="Black" OnClick="btn_export_Click" />//===================后端==============================tb_result.Rows[i]["字段4"] = "-"; 阅读详情

相关推荐

多条件查询DataTable返回DataTable

///         /// 执行DataTable中的查询返回新的DataTable         ///         /// 源数据DataTable         /// 查询条件(多条件逗号分离)         /// 排序         ///         public static DataTable FillDataTable(DataTable

W_xiaoming的专栏 1197

Linq 多个DataTable表关联查询,实现考勤统计。

最近在做考勤系统时,由于不同的分公司的数据源在不同的服务器上,关联查询比较麻烦,因此想到了用Linq实现关联查询。 思路:查询各个考勤信息的dataTable,然后用Linq实现DataTable的多张表左关联查询。贴出来,与大家分享。 代码实现如下: 1.View显示: /// &lt;summary&gt; /// 考勤统计表-用于工资核算 /// &lt;/...

shenjqiang的专栏 3290

多个datatable共存造成多个表格的checkbox都被选中

所以当有多个datatable 引用到一个页面中的时候,全选事件会匹配全部的datatable,所以造成全部多个表格的checkbox被都被选中

mysql 多个datatable_多表查询返回多个DataTable,合并到一个Table中.

本文意在说明一下DataSet.Merge(Table)和多个Table合并到一个里面的操作.因为是新手,代码肯定有很多问题,欢迎大家批评指正. 如果你有更好的解决方案,请告诉我.谢谢.先说一下需求:ASP.NET+MYSQL查询连续N天的邮件发送日志.在库里,表是按天存放的,表名也是按天命名的.例如:mailsend20090302,mailstatus20090302,两张表有ID关联....

weixin_39874809的博客 611

用Verilog搭出RISC-V架构单周期CPU

这是笔者学校暑期学期的必修课,难度并不高(仅追求及格的话),但相当耗时,对于在硬件设计方面完全不感冒的同学更是一场避不开的折磨,所以笔者想通过自己的成果和被折磨经验来帮助有此方面需求的同学,或是对于CPU设计有浓厚兴趣的人。

paticita的博客 1万+

基于wxWidgets框架,使用DialogBlocks建立OpenGL界面

前言 之前公司要求使用wxWidgets做GUI,基于OpenGL图形内核,开发三维可视化工具。目前初步开发工作基本已经完成,剩下都是完善了。这里记录一下最开始的框架搭建过程(当然是简化版啦)。wxWidgets结合OpenGL开发可以实现跨平台应用,再结合CMake和VS Code,整体开发工具用习惯了会感觉非常顺手。 界面编辑 首先,使用DialogBlocks新建一个工程,这里工程目录...

cyberobot的博客 2742

JavaScript连表查询

我们学习MVC还有一项常用的方法就是查询,这里有单表查询、连表查询以及多表查询。下面我们就来说连表查询吧! 一、首先我们先看一下我们的方法,下面这个图是一个基本的例子;我们先看tabA他要连接我们的tabB,他需要什么通过什么条件,然后就能连接上我们的tabB;好的这里我们简单的介绍了一下,下面就看我们的操作吧。 1、我们先来看一下我们的表,一个是S_UserType表另一个是S_User表然后我们要让这两个表连接,就要使用我们的连表查询。 2、(如下图所示)我们的连表查询也很简单他就需要我们S_Use

weixin_44588195的博客 521

Pytorch.nn.Linear 解析(数学角度)

pytorch.nn.Linear 是一个类,下面是它的一些初始化参数 in_features : 输入样本的张量大小 out_features : 输出样本的张量大小 bias : 偏置 它主要是对输入数据做一个线性变换。 y=xAT+b y=xA^T+b y=xAT+b 这里A是权重矩阵,b是偏置。他们都是根据 in_features 生成 测试代码: m = torch.nn.Linea...

Medlen 1万+

jquery datatable 多条件查询

可以根据查询条件重新生成一个新的datatable 先销毁,再生成 dataTable.fnDestroy();  var dataTable = $('#example').dataTable({ "autoWidth":false, "bPaginate": true, //是否显示分页 "bFilter": true, //搜索栏 "bProcess...

iteye_3842的博客 989

立创EDA开源项目:小北极冰冰杯(夏)——基于ESP32-C3的智能半导体制冷杯硬件设计与功能解析

本文详细解析了基于ESP32-C3的智能半导体制冷杯——小北极冰冰杯的硬件设计与核心功能。项目利用半导体制冷片实现快速降温,并集成了PWM智能调速散热、四路温度监控、杯具检测及PD/DC双电源输入等实用功能。文章深入剖析了其硬件架构、控制逻辑及实战注意事项,为嵌入式开发与智能硬件爱好者提供了宝贵的参考。

weixin_33245447的博客 267

基于立创·天猛星MSPM0G3507的简易PID电机控制入门项目实战

本文详细介绍了基于立创·天猛星MSPM0G3507开发板的简易PID电机控制入门项目实战。从硬件选型、电路设计、PCB布局,到软件编程中的编码器读取、PID算法实现与调参,手把手教你完成一个带屏幕显示的电机定速与定距控制项目,是学习嵌入式开发和经典PID控制算法的绝佳实践。

weixin_42596011的博客 502

DataTable多表合并 同结构和不同结构的合并

有时我们知道了两个DataTable1和DataTable2,我们希望将它们合并为一个新的DataTable(下面的例子中命名为了newDataTable),这就分为两种情况:DataTable1和DataTable2结构相同、DataTable1和DataTable2结构不同,下面分别介绍怎么进行合并。 一、DataTable1和DataTable2结构相同的情况,结构相同我们只需要把两者的数

ruirui 8870

实战指南!基于STM32的智能环境监测系统(代码+硬件设计+云端控制)

本文详细介绍了基于STM32的智能环境监测系统的设计与实现,包括硬件选型、电路设计、软件架构和云端控制。系统通过DHT11温湿度传感器和MQ-2烟雾传感器实时监测环境数据,STM32F103C8T6主控芯片处理数据并通过ESP8266上传至中国移动物联网平台,支持手机APP远程监控。项目成本低、稳定性高,适合智能家居和环境监测应用。

weixin_29194817的博客 428

DataTable筛选器

//datatable筛选器,函数包装模板:传入源table,目标table,db名,多表查询table,列条件数组,where筛选列,selsect筛选列 public DataTable Filter(DataTable room, DataTable room1, string dbname, DataTable build, string[] split,string c_Name,...

weixin_30807779的博客 79

ArcGIS栅格拼接全攻略:从核心原理到色彩平衡与大数据处理

在GIS数据处理中,栅格拼接是一项基础且关键的操作,其本质是将多幅具有重叠区域的栅格图像无缝整合为一张完整地图。该技术涉及空间参考统一、像元对齐与色彩融合等核心原理,是构建连续地理空间数据的基石。其技术价值在于保障数据完整性、提升可视化效果,并为后续的空间分析提供可靠底图。在遥感影像处理、数字高程模型构建及地图制图等应用场景中,高质量的拼接成果至关重要。本文聚焦于ArcGIS平台,深入解析其栅格拼接工具,并针对常见的色彩不一致与大数据量处理难题,提供了基于**色彩平衡**和**金字塔**优化的实战解决方案,

weixin_33158887的博客 254

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1655

C#多表查询,使用视图查询

正常来说是不能多表查询的,只能是查询一个表的,但是我们可以创建视图来进行多表查询。视图相当于一个表,把查询出来的内容放到视图中,加快查询速度。 我们要在数据库中创建视图,创建视图语句就自己百度啦,有不懂的可以搜索相关视图的知识。 这里我就放上查看视图语句,这只是两表查询,要想实现三表甚至四表查询只要把查询语句改改就可以了。 ALTER view [dbo].[视图名称] as select a...

qq_41942913的博客 2565

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

datatable linq 查询排序用法总结

LINQ

qq_18932003的博客 4984

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linq 查询多个集合/查询多个Datatable linq to sql 联合查询

最近接手 了一个非常古老的项目,使用aspx开发的项目,令人不得不感叹,政府的项目就是水准不太高。钱也好挣。 分库查询,多个结果集如何计算取交集。 利用sql查询返回的数据DataTable,如何去查询其中的数据,兵进行条件删选,排序等。 这里又两个DataTable数据集,分别是data1,data2. 利用linq获取联合查询,根据data1连接data2,data1为主表,...

qq_27307951的博客 1598

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

多表查询,模糊查询

菜鸟一枚,记录一下学习 1,首先创建aaa,bbb两张表并加入一定的数据(图个方便这里wage就使用了varchar类型) 2,查询工资大于等于5000的人员的名字 表连接分为内连接和外连接;两种都会产生笛卡尔积(下章看一下如何避免笛卡尔积) 内连接:取出两张表中匹配到的数据,匹配不到的不保留;笛卡尔积是不可避免的; 这是不加限制条件形成的一张大表,但是我们需要的要加上匹配条件如下 加入匹配条件;当然这里inner是可以省去的 看着两个id碍眼,我们也可以通过using(...

weixin_56549741的博客 2325

程序员的日常操作—多表查询

开发工具与关键技术:Visual Studio ASP.NET MVC 作者:刘剑鸿 撰写时间:2019年2月2日星期六 程序员的日常操作—多表查询 在网页查询某条数据的时候,偶尔会出现该条数据关联到好几张表的字段 而在数据库里面是没有办法在一张表中找到好几种字段。所以我们就要自己去构建一张能找到那么多字段的表,因为涉及到多张表的字段,所以...

weixin_44538469的博客 1445

C# DataSet和DataTable:将查询结果保存到DataSet或DataTable中

在执行对表中数据的查询时还能将数据保存到 DataSet 中,但需要借助 DataAdapter 类来实现。 在实际应用中,DataAdapter 与 DataSet 是在查询操作中使用最多的类。 此外,还可以通过 DataSet 实现对表中数据的增加、修改、删除操作。 DataAdapter 与 DataSet 类简介 DataAdapter 类用于将数据表中的数据查询出来并添加到 DataSet 中,DataAdapter 在 System.Data.SqlClient 命名空间下对应的类名是 S

ba_wang_mao的专栏 2915

DataTable 查询

using (SqlConnection con = new SqlConnection(ConStr)) { try { string sql = "select * from mainUser with(nolock) where 1=1"; ...

樱花园丁 1858

判断DataTable为空,获取值,查询数据,datarow转datatable

判断DataTable为空 请几天项目中增加了一个功能,就是通过windows服务往数据库里填充数据。 有一表A,表A里有字段“日期”,如果表A中有日期为“XXXX”的数据,则windows服务不在往改表中添加数据。我是这样写的: public bool HasData(datetime dt) {   string sql="select *from A WHERE date="+...

你要明白,任何问题都不是孤立存在的,一定有人曾经遇到过,并且已经有更好的解决办法了,只是我还不知道。我不应该在黑暗中独自前行,去重新发明轮子,也许我的顿悟,只是别人的基本功!我应该要站在巨人的肩膀上,学习更成熟的经验和方法,然后再来解决这个问题 2117

db-多表组合查询

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Dat...

dxm809的博客 299
上一篇: VisualComponents 4.10 机器人外部TCP配置:从概念到高精度仿真实践
下一篇: LabVIEW CAN通讯上位机开发指南:从协议到调试全流程解析
weixin_34301132
博客等级 码龄11年 6271粉丝 1164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值