0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分布式链路跟踪Sleuth与Zipkin

jf_ro2CN3Fa 来源:芋道源码 2023-01-13 10:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

  • Spring Cloud Sleuth
  • Zipkin
  • 快速上手
    • 方式一、HTTP
    • 方式二、消息总线 RabbitMQ

随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药。于是就有了分布式系统调用跟踪的诞生。

现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,使用最为广泛的开源实现是 Twitter 的 Zipkin,为了实现平台无关、厂商无关的分布式服务跟踪,CNCF 发布了布式服务跟踪标准 Open Tracing。国内,淘宝的 “鹰眼”、京东的 “Hydra”、大众点评的 “CAT”、新浪的 “Watchman”、唯品会的 “Microscope”、窝窝网的 “Tracing” 都是这样的系统。

Dapper, a Large-Scale Distributed Systems Tracing Infrastructure:

https://research.google.com/pubs/pub36356.html

Spring Cloud Sleuth 也为我们提供了一套完整的解决方案。在本章中,我们将详细介绍如何使用 Spring Cloud Sleuth + Zipkin 来为我们的微服务架构增加分布式服务跟踪的能力。

Spring Cloud Sleuth

一般的,一个分布式服务跟踪系统主要由三部分构成:

  • 数据收集
  • 数据存储
  • 数据展示

根据系统大小不同,每一部分的结构又有一定变化。譬如,对于大规模分布式系统,数据存储可分为实时数据和全量数据两部分,实时数据用于故障排查(Trouble Shooting),全量数据用于系统优化;数据收集除了支持平台无关和开发语言无关系统的数据收集,还包括异步数据收集(需要跟踪队列中的消息,保证调用的连贯性),以及确保更小的侵入性;数据展示又涉及到数据挖掘和分析。虽然每一部分都可能变得很复杂,但基本原理都类似。

2c6b6e30-92e3-11ed-bfe3-dac502259ad0.jpg

服务追踪的追踪单元是从客户发起请求(request)抵达被追踪系统的边界开始,到被追踪系统向客户返回响应(response)为止的过程,称为一个 trace 。每个 trace 中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的消耗时间等信息,在每次调用服务时,埋入一个调用记录,称为一个 span 。这样,若干个有序的 span 就组成了一个 trace。在系统向外界提供服务的过程中,会不断地有请求和响应发生,也就会不断生成 trace,把这些带有 span 的 trace 记录下来,就可以描绘出一幅系统的服务拓扑图。附带上 span 中的响应时间,以及请求成功与否等信息,就可以在发生问题的时候,找到异常的服务;根据历史数据,还可以从系统整体层面分析出哪里性能差,定位性能优化的目标。

Spring Cloud Sleuth 为服务之间调用提供链路追踪。通过 Sleuth 可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。此外 Sleuth 可以帮助我们:

  • 耗时分析 :通过 Sleuth 可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时;
  • 可视化错误 :对于程序未捕捉的异常,可以通过集成 Zipkin 服务界面上看到;
  • 链路优化 :对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。

Spring Cloud Sleuth 可以结合 Zipkin,将信息发送到 Zipkin,利用 Zipkin 的存储来存储信息,利用 Zipkin UI 来展示数据。

这是 Spring Cloud Sleuth 的概念图:

2c9f7be4-92e3-11ed-bfe3-dac502259ad0.jpg

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

Zipkin

Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。

Zipkin 提供了可插拔数据存储方式:In-Memory、MySQL、Cassandra 以及 Elasticsearch。接下来的测试为方便直接采用 In-Memory 方式进行存储,生产推荐 Elasticsearch。

2cc4c73c-92e3-11ed-bfe3-dac502259ad0.jpg

上图展示了 Zipkin 的基础架构,它主要由 4 个核心组件构成:

  • Collector :收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。
  • Storage :存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
  • RESTful API :API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
  • Web UI :UI 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地查询和分析跟踪信息。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

快速上手

Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端也就是微服务的应用。

客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。发送的方式主要有两种,一种是 HTTP 报文的方式,还有一种是消息总线的方式如 RabbitMQ。

不论哪种方式,我们都需要:

  • 一个 Eureka 服务注册中心,这里我们就用之前的eureka项目来当注册中心。
  • 一个 Zipkin 服务端。
  • 两个微服务应用,trace-a和trace-b,其中trace-a中有一个 REST 接口/trace-a,调用该接口后将触发对trace-b应用的调用。

方式一、HTTP

在 Spring Cloud Sleuth 中对 Zipkin 的整合进行了自动化配置的封装,所以我们可以很轻松的引入和使用它。

Zipkin 服务端

关于 Zipkin 的服务端,在使用 Spring Boot 2.x 版本后,官方就不推荐自行定制编译了,反而是直接提供了编译好的 jar 包来给我们使用,详情请看 upgrade to Spring Boot 2.0 NoClassDefFoundError UndertowEmbeddedServletContainerFactory · Issue #1962 · openzipkin/zipkin · GitHub

并且以前的@EnableZipkinServer也已经被打上了@Deprecated

If you decide to make a custom server, you accept responsibility for troubleshooting your build or configuration problems, even if such problems are a reaction to a change made by the OpenZipkin maintainers. In other words, custom servers are possible, but not supported.

EnableZipkinServer.javagithub.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/java/zipkin/server/EnableZipkinServer.java

简而言之就是:私自改包,后果自负。

所以官方提供了一键脚本:

curl-sSLhttps://zipkin.io/quickstart.sh|bash-s
java-jarzipkin.jar

如果用 Docker 的话,直接

dockerrun-d-p9411:9411openzipkin/zipkin

任一方式启动后,访问 http://localhost:9411/zipkin/ 就能看到如下界面,嗯还有汉化看起来不错。

2cd6d8a0-92e3-11ed-bfe3-dac502259ad0.jpg

至此服务端就 OK 了。

微服务应用

创建两个基本的 Spring Boot 工程,名字分别为 trace-a 和 trace-b。

两个工程的 pom.xml 均引入以下依赖坐标:

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webfluxartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>

两者的配置文件也一样(除了spring. application.name和server.port,自行修改)

spring:
application:
name:trace-a
sleuth:
web:
client:
enabled:true
sampler:
probability:1.0#将采样比例设置为1.0,也就是全部都需要。默认是0.1
zipkin:
base-url:http://localhost:9411/#指定了Zipkin服务器的地址
server:
port:8080
eureka:
client:
service-url:
defaultZone:http://localhost:7000/eureka/

Spring Cloud Sleuth 有一个 Sampler 策略,可以通过这个实现类来控制采样算法。采样器不会阻碍 span 相关 id 的产生,但是会对导出以及附加事件标签的相关操作造成影响。Sleuth 默认采样算法的实现是 Reservoir sampling,具体的实现类是 PercentageBasedSampler,默认的采样比例为: 0.1(即 10%)。不过我们可以通过 spring.sleuth.sampler.percentage 来设置,所设置的值介于 0.0 到 1.0 之间,1.0 则表示全部采集。

trace-a 工程的启动类如下:

@RestController
@SpringBootApplication
publicclassApplication{

publicstaticvoidmain(String[]args){
SpringApplication.run(Application.class,args);
}

@Autowired
privateLoadBalancerExchangeFilterFunctionlbFunction;

@Bean
publicWebClientwebClient(){
returnWebClient.builder().baseUrl("http://trace-b")
.filter(lbFunction)
.build();
}

@GetMapping("/trace-a")
publicMonotrace(){
System.out.println("===calltrace-a===");

returnwebClient().get()
.uri("/trace-b")
.retrieve()
.bodyToMono(String.class);
}

}

trace-b 工程的启动类如下:

@RestController
@SpringBootApplication
publicclassApplication{

publicstaticvoidmain(String[]args){
SpringApplication.run(Application.class,args);
}

@GetMapping("/trace-b")
publicMonotrace(){
System.out.println("===calltrace-b===");

returnMono.just("Trace");
}

}

至此,一切就绪。Spring 应用在监测到 classpath 中有 Sleuth 和 Zipkin 后,会自动在 WebClient(或 RestTemplate)的调用过程中向 HTTP 请求注入追踪信息,并向 Zipkin Server 发送这些信息。

进行验证

我们分别启动 eureka、zipkin、trace-b、trace-a,然后访问 http://localhost:8080/trace-a 可以得到返回值 Trace,同时还能在它们的控制台中分别获得下面的输出:

--trace-a
===calltrace-a===
2018-04-2320:20:42.016INFO[trace-a,,,]71722---[ender@761e788f}]s.c.a.AnnotationConfigApplicationContext:RefreshingSpringClientFactory-localhost:startupdate[MonApr2320:20:42CST2018];parent:org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@41ab013
2018-04-2320:20:42.103INFO[trace-a,,,]71722---[ender@761e788f}]f.a.AutowiredAnnotationBeanPostProcessor:JSR-330'javax.inject.Inject'annotationfoundandsupportedforautowiring
2018-04-2320:20:42.421INFO[trace-a,,,]71722---[ender@761e788f}]c.netflix.config.ChainedDynamicProperty:Flippingproperty:localhost.ribbon.ActiveConnectionsLimittouseNEXTproperty:niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
2018-04-2320:20:42.441INFO[trace-a,,,]71722---[ender@761e788f}]c.n.u.concurrent.ShutdownEnabledTimer:Shutdownhookinstalledfor:NFLoadBalancer-PingTimer-localhost
2018-04-2320:20:42.476INFO[trace-a,,,]71722---[ender@761e788f}]c.netflix.loadbalancer.BaseLoadBalancer:Client:localhostinstantiatedaLoadBalancer:DynamicServerListLoadBalancer:{NFLoadBalancer:name=localhost,currentlistofServers=[],Loadbalancerstats=Zonestats:{},Serverstats:[]}ServerList:null
2018-04-2320:20:42.485INFO[trace-a,,,]71722---[ender@761e788f}]c.n.l.DynamicServerListLoadBalancer:UsingserverListUpdaterPollingServerListUpdater
2018-04-2320:20:42.492INFO[trace-a,,,]71722---[ender@761e788f}]c.n.l.DynamicServerListLoadBalancer:DynamicServerListLoadBalancerforclientlocalhostinitialized:DynamicServerListLoadBalancer:{NFLoadBalancer:name=localhost,currentlistofServers=[],Loadbalancerstats=Zonestats:{},Serverstats:[]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@516a7895
2018-04-2320:20:42.548INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]s.c.a.AnnotationConfigApplicationContext:RefreshingSpringClientFactory-trace-b:startupdate[MonApr2320:20:42CST2018];parent:org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@41ab013
2018-04-2320:20:42.617INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]f.a.AutowiredAnnotationBeanPostProcessor:JSR-330'javax.inject.Inject'annotationfoundandsupportedforautowiring
2018-04-2320:20:42.855INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.netflix.config.ChainedDynamicProperty:Flippingproperty:trace-b.ribbon.ActiveConnectionsLimittouseNEXTproperty:niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
2018-04-2320:20:42.868INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.n.u.concurrent.ShutdownEnabledTimer:Shutdownhookinstalledfor:NFLoadBalancer-PingTimer-trace-b
2018-04-2320:20:42.869INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.netflix.loadbalancer.BaseLoadBalancer:Client:trace-binstantiatedaLoadBalancer:DynamicServerListLoadBalancer:{NFLoadBalancer:name=trace-b,currentlistofServers=[],Loadbalancerstats=Zonestats:{},Serverstats:[]}ServerList:null
2018-04-2320:20:42.870INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.n.l.DynamicServerListLoadBalancer:UsingserverListUpdaterPollingServerListUpdater
2018-04-2320:20:42.905INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.netflix.config.ChainedDynamicProperty:Flippingproperty:trace-b.ribbon.ActiveConnectionsLimittouseNEXTproperty:niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
2018-04-2320:20:42.907INFO[trace-a,d28b72b2317c023f,d28b72b2317c023f,true]71722---[ctor-http-nio-2]c.n.l.DynamicServerListLoadBalancer:DynamicServerListLoadBalancerforclienttrace-binitialized:DynamicServerListLoadBalancer:{NFLoadBalancer:name=trace-b,currentlistofServers=[172.16.106.93:8081],Loadbalancerstats=Zonestats:{defaultzone=[Zone:defaultzone;Instancecount:1;Activeconnectionscount:0;Circuitbreakertrippedcount:0;Activeconnectionsperserver:0.0;]
},Serverstats:[[Server:172.16.106.93:8081;Zone:defaultZone;TotalRequests:0;Successiveconnectionfailure:0;Totalblackoutseconds:0;Lastconnectionmade:ThuJan0108:00:00CST1970;Firstconnectionmade:ThuJan0108:00:00CST1970;ActiveConnections:0;totalfailurecountinlast(1000)msecs:0;averageresptime:0.0;90percentileresptime:0.0;95percentileresptime:0.0;minresptime:0.0;maxresptime:0.0;stddevresptime:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@31f05c5
2018-04-2320:20:43.878INFO[trace-a,,,]71722---[erListUpdater-1]c.netflix.config.ChainedDynamicProperty:Flippingproperty:trace-b.ribbon.ActiveConnectionsLimittouseNEXTproperty:niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647


--trace-b
===calltrace-b===
2018-04-2320:20:43.944INFO[trace-b,,,]71662---[ender@22a10ac6}]s.c.a.AnnotationConfigApplicationContext:RefreshingSpringClientFactory-localhost:startupdate[MonApr2320:20:43CST2018];parent:org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@49c6c24f
2018-04-2320:20:44.124INFO[trace-b,,,]71662---[ender@22a10ac6}]f.a.AutowiredAnnotationBeanPostProcessor:JSR-330'javax.inject.Inject'annotationfoundandsupportedforautowiring
2018-04-2320:20:44.524INFO[trace-b,,,]71662---[ender@22a10ac6}]c.netflix.config.ChainedDynamicProperty:Flippingproperty:localhost.ribbon.ActiveConnectionsLimittouseNEXTproperty:niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
2018-04-2320:20:44.550INFO[trace-b,,,]71662---[ender@22a10ac6}]c.n.u.concurrent.ShutdownEnabledTimer:Shutdownhookinstalledfor:NFLoadBalancer-PingTimer-localhost
2018-04-2320:20:44.600INFO[trace-b,,,]71662---[ender@22a10ac6}]c.netflix.loadbalancer.BaseLoadBalancer:Client:localhostinstantiatedaLoadBalancer:DynamicServerListLoadBalancer:{NFLoadBalancer:name=localhost,currentlistofServers=[],Loadbalancerstats=Zonestats:{},Serverstats:[]}ServerList:null
2018-04-2320:20:44.610INFO[trace-b,,,]71662---[ender@22a10ac6}]c.n.l.DynamicServerListLoadBalancer:UsingserverListUpdaterPollingServerListUpdater
2018-04-2320:20:44.617INFO[trace-b,,,]71662---[ender@22a10ac6}]c.n.l.DynamicServerListLoadBalancer:DynamicServerListLoadBalancerforclientlocalhostinitialized:DynamicServerListLoadBalancer:{NFLoadBalancer:name=localhost,currentlistofServers=[],Loadbalancerstats=Zonestats:{},Serverstats:[]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@1e1794d0

访问 http://localhost:9411/zipkin

点击 Find Traces 会看到有一条记录:

2ce66284-92e3-11ed-bfe3-dac502259ad0.jpg

点击记录进去页面,可以看到每一个服务所耗费的时间和顺序:

2cf41924-92e3-11ed-bfe3-dac502259ad0.jpg

点击依赖分析,可以看到项目之间的调用关系:

2d0a86aa-92e3-11ed-bfe3-dac502259ad0.jpg

方式二、消息总线 RabbitMQ

因为之前说的 Zipkin 不再推荐我们来自定义 Server 端了,所以在最新版本的 Spring Cloud 依赖管理里已经找不到 zipkin-server 了。

那么如果直接用官方提供的 jar 包怎么从 RabbitMQ 中获取 trace 信息呢?

我们可以通过环境变量让 Zipkin 从 RabbitMQ 中读取信息,就像这样:

RABBIT_ADDRESSES=localhostjava-jarzipkin.jar

可配置的环境变量如下表所示:

属性 环境变量 描述
zipkin.collector.rabbitmq.concurrency RABBIT_CONCURRENCY 并发消费者数量,默认为1
zipkin.collector.rabbitmq.connection-timeout RABBIT_CONNECTION_TIMEOUT 建立连接时的超时时间,默认为 60000毫秒,即 1 分钟
zipkin.collector.rabbitmq.queue RABBIT_QUEUE 从中获取 span 信息的队列,默认为 zipkin
zipkin.collector.rabbitmq.uri RABBIT_URI 符合RabbitMQ URI 规范 的 URI,例如amqp://user:pass@host:10000/vhost

如果设置了 URI,则以下属性将被忽略。

属性 环境变量 描述
zipkin.collector.rabbitmq.addresses RABBIT_ADDRESSES 用逗号分隔的 RabbitMQ 地址列表,例如localhost:5672,localhost:5673
zipkin.collector.rabbitmq.password RABBIT_PASSWORD 连接到 RabbitMQ 时使用的密码,默认为 guest
zipkin.collector.rabbitmq.username RABBIT_USER 连接到 RabbitMQ 时使用的用户名,默认为guest
zipkin.collector.rabbitmq.virtual-host RABBIT_VIRTUAL_HOST 使用的 RabbitMQ virtual host,默认为 /
zipkin.collector.rabbitmq.use-ssl RABBIT_USE_SSL 设置为true则用 SSL 的方式与 RabbitMQ 建立链接

关于 Zipkin 的 Client 端,也就是微服务应用,我们就在之前 trace-a、trace-b 的基础上修改,只要在他们的依赖里都引入 spring-cloud-stream-binder-rabbit 就好了,别的不用改。


org.springframework.cloud
spring-cloud-stream-binder-rabbit

不过为了说明是通过 RabbitMQ 传输的信息,我将 spring.zipkin.base-url 均改为http://localhost:9412/,即指向一个错误的地址。

分别重启 trace-a、trace-b 工程,并启动 Zipkin Server

RABBIT_ADDRESSES=localhostjava-jarzipkin.jar

然后访问 http://localhost:8080/trace-a 并刷新 Zipkin UI,看到如下内容,就说明 Sleuth+Zipkin+RabbitMQ 整合成功了。

2d19db00-92e3-11ed-bfe3-dac502259ad0.jpg

此时看 RabbitMQ Admin,会看到多了一个名为 zipkin 的 Queue

2d25b18c-92e3-11ed-bfe3-dac502259ad0.jpg

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分布式
    +关注

    关注

    1

    文章

    1063

    浏览量

    76424
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    15782

原文标题:分布式链路跟踪 Sleuth 与 Zipkin

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何解决分布式光伏计量难题?

    分布式光伏成增长主力 据《2025-2030年中国分布式光伏行业市场前景预测及未来发展趋势研究报告》显示,2024年中国分布式光伏新增装机118.18GW,同比增长23%,占光伏新增装机总量的43
    的头像 发表于 11-07 14:55 157次阅读
    如何解决<b class='flag-5'>分布式</b>光伏计量难题?

    分布式光伏环境监测站的技术架构与应用实践

    分布式光伏环境监测站的技术架构与应用实践 柏峰【BF-GFQX】一、系统技术架构解析 分布式光伏环境监测站采用“感知层-传输层-应用层”三层架构设计,实现环境数据的全智能化处理。
    的头像 发表于 10-13 10:05 259次阅读
    <b class='flag-5'>分布式</b>光伏环境监测站的技术架构与应用实践

    【节能学院】Acrel-1000DP分布式光伏监控系统在奉贤平高食品 4.4MW 分布式光伏中应用

    摘要:在“双碳”和新型电力系统建设背景下,分布式光伏接入比例不断提高,对配电网电压、调度运行及调峰等环节造成强烈冲击。本文设计包含平台层、设备层二层架构体系的分布式光伏管控平台,以及小容量工商业
    的头像 发表于 08-23 08:04 3306次阅读
    【节能学院】Acrel-1000DP<b class='flag-5'>分布式</b>光伏监控系统在奉贤平高食品 4.4MW <b class='flag-5'>分布式</b>光伏中应用

    分布式光伏发电监测系统技术方案

    分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对分布式光伏电站的全方位、高精度、实时化管理。该系统能
    的头像 发表于 08-22 10:51 2890次阅读
    <b class='flag-5'>分布式</b>光伏发电监测系统技术方案

    怎样确定分布式光伏集群通信网络的负载均衡策略?

    ,具体步骤如下: 1. 明确负载均衡目标 根据分布式光伏集群的核心需求,定义负载均衡的关键目标,例如: 避免单点(如汇聚节点、通信网关)过载,确保数据传输延迟≤100ms; 均衡各通信的带宽占用率(目标:单
    的头像 发表于 08-22 10:10 399次阅读
    怎样确定<b class='flag-5'>分布式</b>光伏集群通信网络的负载均衡策略?

    双电机分布式驱动汽车高速稳定性机电耦合控制

    摘要:为了利用所设计的双电机防滑差速驱动系统来提高分布式驱动汽车的动力学性能,在前期同轴耦合驱动控制理论研究的基础上,开展该车的高速稳定性机电耦合控制研究。建立并验证包含所设计驱动系统在内的分布式
    发表于 06-18 16:37

    曙光存储领跑中国分布式存储市场

    近日,赛迪顾问发布《中国分布式存储市场研究报告(2025)》,指出2024 年中国分布式存储市场首次超过集中式存储,规模达 198.2 亿元,增速 43.7%。
    的头像 发表于 05-19 16:50 1011次阅读

    OLI-P——分布式偏振串扰测量利器

    在保偏光纤系统中,偏振串扰是导致性能劣化的核心因素之一。传统偏振检测手段仅能获得整体消光比,而分布式偏振串扰测量通过连续、高精度地捕捉整条光纤
    的头像 发表于 05-15 17:37 452次阅读
    OLI-P——<b class='flag-5'>分布式</b>偏振串扰测量利器

    分布式光伏电力问题层出不穷?安科瑞分布式光伏运维系统来“救场”

    一、分布式光伏电力运维,痛点大揭秘​ ​ 分布式光伏作为实现绿色能源转型的关键一环,近年来在我国得到了迅猛发展。国家能源局数据显示,截至 2023 年底,中国分布式光伏电站累计并网容量约为 2.5
    的头像 发表于 05-07 17:14 716次阅读
    <b class='flag-5'>分布式</b>光伏电力问题层出不穷?安科瑞<b class='flag-5'>分布式</b>光伏运维系统来“救场”

    分布式光伏发运维系统实际应用案例分享

    安科瑞刘鸿鹏 摘 要 分布式光伏发电系统其核心特点是发电设备靠近用电负荷中心,通常安装在屋顶、建筑立面或闲置空地上,截至2025年,分布式光伏发电系统在全球和中国范围内取得了显著发展,成为能源转型
    的头像 发表于 04-09 14:46 996次阅读
    <b class='flag-5'>分布式</b>光伏发运维系统实际应用案例分享

    分布式光伏如何实现防逆流?

    分布式光伏如何实现防逆流
    的头像 发表于 03-24 13:31 596次阅读
    <b class='flag-5'>分布式</b>光伏如何实现防逆流?

    分布式云化数据库有哪些类型

    分布式云化数据库有哪些类型?分布式云化数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库、新SQL分布式数据库、以列方式存储数据、
    的头像 发表于 01-15 09:43 880次阅读

    基于ptp的分布式系统设计

    在现代分布式系统中,精确的时间同步对于确保数据一致性、系统稳定性和性能至关重要。PTP(Precision Time Protocol)是一种网络协议,用于在分布式系统中实现高精度的时间同步
    的头像 发表于 12-29 10:09 978次阅读

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

    使用分布式数据对象迁移数据,当需要迁移的数据较大(100KB以上)或需要迁移文件时,可以使用分布式数据对象。原理与接口说明详见分布式数据对象跨设备数据同步。 说明:自API 12起,由于直接使用跨
    发表于 12-24 10:11

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    使用分布式数据对象迁移数据,当需要迁移的数据较大(100KB以上)或需要迁移文件时,可以使用分布式数据对象。原理与接口说明详见分布式数据对象跨设备数据同步。 说明:自API 12起,由于直接使用跨
    发表于 12-24 09:40