微服务链路追踪:SleuthZipkin

news2025/5/18 11:45:48

文章目录

  • Sleuth & Zipkin
    • 一、Sleuth\&Zipkin介绍
    • 二、搭建环境
    • 三、Sleuth入门操作
    • 四、Zipkin搭建及操作
    • 五、RabbitMQ方式发送信息
    • 六、Elasticsearch持久化
  • SpringBootAdmin
    • 一、Actuator介绍
    • 二、Actuator快速入门
    • 三、SpringBootAdmin介绍
    • 四、SpringBootAdmin快速入门
      • 4.1 搭建AdminServer
      • 4.2 AdminClient注册
    • 五、SpringBootAdmin安全配置
    • 六、SpringBootAdmin注册中心连接
    • 七、定制内容监控发邮件
      • 7.1 服务下线自动发送邮件
      • 7.2 制定监控的内容

在这里插入图片描述
个人主页:道友老李
欢迎加入社区:道友老李的学习社区

Sleuth & Zipkin

学习当前课程,比必须要先掌握SpringCloud的基本应用(Nacos,Feign调用)

对Docker有一定的了解,知道docker-compose.yml如何启动一个容器

RabbitMQ,Elasticsearch有一定了解。

而且学习每一个技术前,一定要先知道有什么问题是现在无法解决的,通过学习的这个技术来解决当前产生的问题

一、Sleuth&Zipkin介绍

现存问题是什么?

image.png

这个问题需要监控整个请求的微服务调用链过程,为了可以监控网上可以使用的工具很多:

  • Sleuth&Zipkin:SpringCloud中的一个组件,专门链路追踪
  • SkyWalking:Apache组织下的一个开源框架,并且是个顶级项目
  • 阿里鹰眼:没玩过~~
  • 美团Cat:没玩过~~

Sleuth&Zipkin对比SkyWalking

  • 相同点,都是链路追踪框架
  • Sleuth是收集信息,Zipkin是图形化展示。 SkyWalking一锅端~~
  • SkyWalking的报表展示比Sleuth&Zipkin更丰富。
  • SkyWalking支持监控类的手段,但是Sleuth&Zipkin不支持,一般要配合SpringBootAdmin做单独监控
  • SkyWalking支持阈值报警,但是Sleuth&Zipkin不支持
  • Sleuth&Zipkin文档丰富,网上解决问题的方式或者博客很多,但是SkyWalking相对差一内内。

二、搭建环境

image.png

第一步:安装Nacos

image.png

第二步:准备两台服务

  • 准备聚合工程,

  • 管理好各个依赖的版本:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

  • Alibaba依赖:https://spring.io/projects/spring-cloud-alibaba

  • Cloud依赖:https://spring.io/projects/spring-cloud

  • 准备两个服务

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
    

    添加好启动类和各个配置

    @SpringBootApplication
    @EnableDiscoveryClient
    #-----------------------------
    server:
      port: 端口
    
    spring:
      application:
        name: 服务名
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.11.32:8848
    

中间处理了几个小BUG~~~

三、Sleuth入门操作

Sleuth是要在服务内部收集信息一个框架。将收集的信息交给Zipkin做图形化界面展示

官网滴干活:

  • 导入依赖:
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    
  • 编写配置
    logging:
      level:
        org.springframework.web.servlet.DispatcherServlet: DEBUG
    

再次访问consumer到provider后,可以看到日志中多了一些信息

  • consumer:[consumer, db108ebea9c15ea1, db108ebea9c15ea1, true]
  • provider: [provider, db108ebea9c15ea1, 847d0be306bc1395, true]

[服务名,总链路ID,子链路ID,信息发送其他系统了]

可以看到整体是一个链路信息。

四、Zipkin搭建及操作

前面Sleuth已经收集到信息了。

Zipkin需要单独安装,本身也是一个Java编写的Web项目。

官网滴干活:https://zipkin.io/

采用docker-compose.yml文件的方式去安装Zipkin

version: "3.1"
services:
  zipkin:
   image: openzipkin/zipkin
   restart: always
   container_name: zipkin
   ports:
     - 9411:9411

docker-compose up -d启动即可

查看到图形化界面image.png

让Sleuth收集的日志信息发送到Zipkin上

需要让服务做导入一些依赖并且写入一些配置

  • 导入依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
    
  • 编写配置
    spring:
      sleuth:
        sampler:
          probability: 100  # 设置Sleuth手机信息的百分比
      zipkin:
        sender:
          type: web    # 信息发送方式
        base-url: http://192.168.11.32:9411/     # Zipkin地址
    

访问几次请求链路后,查看Zipkinimage.png

五、RabbitMQ方式发送信息

如果日志量足够大,如果每次都让服务以HTTP的方式传输给Zipkin,成本有点高。

所以可以让服务将Sleuth收集的日志推给MQ,让Zipkin去监控MQ的信息,通过MQ的队列获取到服务的信息

如果日志量足够大,其实一般推荐使用Kafka。

准备RabbitMQ服务。

version: "3.1"
services:
  rabbitmq:
    image: daocloud.io/library/rabbitmq:3.8.5
    container_name: rabbitmq
    restart: always
    volumes:
      - ./data/:/var/lib/rabbitmq/
    ports:
      - 5672:5672
      - 15672:15672

第一件事:需要服务将消息扔到RabbitMQ。

  • 导入依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  • 编写配置
    spring:
      zipkin:
        sender:
          type: rabbit
      rabbitmq:
        host: 192.168.11.32
        port: 5672
        username: guest
        password: guest
        virtual-host: /
    

第二件事:需要Zipkin从RabbitMQ中获取消息。

https://github.com/openzipkin/zipkin/tree/master/zipkin-collector/rabbitmq

修改docker-compose.yml文件,并重新构建容器

version: "3.1"
services:
  zipkin:
   image: openzipkin/zipkin
   restart: always
   container_name: zipkin
   ports:
     - 9411:9411
   environment:
     - RABBIT_ADDRESSES=192.168.11.32:5672
     - RABBIT_USER=guest

六、Elasticsearch持久化

Zipkin容器重启之后,存储的链路信息全丢了。

刚刚发现Zipkin重启后,之前的链路信息全丢了,默认应当是内存存储。

为了可以保留一定Zipkin的链路信息,可以让Zipkin将链路信息持久化。

持久化操作支持很多种DB、

因为采用了最新的Zipkin:latest,那么ES就需要7.x版本。

Docker安装7.6.2的es

  • 准备yml文件
    version: "3.1"
    services:
      elasticsearch:
        image: daocloud.io/library/elasticsearch:7.6.2
        restart: always
        container_name: elasticsearch
        ports:
          - 9200:9200
        environment:
          - "discovery.type=single-node"
          - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
        volumes:
          - ./data:/usr/share/elasticsearch/data
          - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      kibana:
        image: daocloud.io/library/kibana:7.6.2
        restart: always
        container_name: kibana
        ports:
          - 5601:5601
        environment:
    		# 记得改IP
          - elasticsearch_url=http://192.168.11.32:9200
        depends_on:
          - elasticsearch
        volumes:
          - ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
    
  • 准备数据卷的映射
    • elasticsearch.yml
      cluster.name: "docker-cluster"
      network.host: 0.0.0.0
      
    • kibana.yml
      server.name: kibana
      server.host: "0"
      elasticsearch.hosts: [ "http://elasticsearch:9200" ]
      xpack.monitoring.ui.container.elasticsearch.enabled: true
      

准备Zipkin的配置:https://github.com/openzipkin/zipkin/tree/master/zipkin-server

修改docker-compose.yml

version: "3.1"
services:
  zipkin:
   image: openzipkin/zipkin
   restart: always
   container_name: zipkin
   ports:
     - 9411:9411
   environment:
     - STORAGE_TYPE=elasticsearch
     - ES_HOSTS=http://192.168.11.32:9200

做链路跟踪的时候 说超时了 让把优化 优化思路是单线程改成多线程 请问怎么改?是把原来的代码写进run方法 然后把这样一个线程放入线程池么?是这个思路么?像这种优化思路 老师能否分享下?

image.png

SpringBootAdmin

一、Actuator介绍

SpringBoot提供的,是一个指标监控的组件。

Actuator的官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/html/production-ready-features.html#production-ready

在一个微服务架构层面下,如果某一个服务出现了问题,导致出现了一些不可控的情况。需要快速的定位出故障的服务,从而解决问题。

二、Actuator快速入门

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

展示全部对外暴露的端点(EndPoint)

management:
  endpoints:
    web:
      exposure:
        include: '*'

启动服务连接Nacos的时候,发现之前能跑的服务,现在连接Nacos出问题。

  • Nacos服务端有木有问题……
  • 网络……
  • 版本问题(官网给定的版本貌似有坑)

查看Actuator提供的端点信息,可以查看到服务的很多信息

image.png

但是,这种JSON的展示形式,很难排查一些问题,此时需要一个更友好的图形化界面做展示

三、SpringBootAdmin介绍

Admin就是Actuator的一个图形化界面,是基于vue写的。

本质上就是Actuator的接口响应数据做图形化的展示,方便开发人员和运维人员监控信息。

SpringBootAdmin并不是Spring官方提供的,是一个github的开源项目。

SpringBootAdmin的Github地址:https://github.com/codecentric/spring-boot-admin

官网文档:https://codecentric.github.io/spring-boot-admin/2.5.1/#getting-started

在使用SpringBootAdmin时,尽量选择大版本和SpringBoot类似的。

四、SpringBootAdmin快速入门

使用方式和Eureka很像,需要先单独的搭建SpringBootAdminServer端,让各个微服务连接上AdminServer即可。

4.1 搭建AdminServer

创建项目、导入依赖、添加启动类、编写配置

<dependencies>
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
@SpringBootApplication
@EnableAdminServer
public class AdminServerStarterApp {

    public static void main(String[] args) {
        SpringApplication.run(AdminServerStarterApp.class,args);
    }
}

image.png

4.2 AdminClient注册

导入依赖、编写配置

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.3.1</version>
</dependency>
spring:
  boot:
    admin:
      client:
        url: http://localhost:9000

image.png

image.png

五、SpringBootAdmin安全配置

所有的微服务对外暴露了actuator的端点,这样会不会不安全?

微服务不需要暴露公网IP,服务内部通过内网去访问即可,所以Actuator端点是否安全,其实无所谓。

SpringBootAdmin需要运维人员或者开发人员放假了,回家了等等,可能需要基于外网去访问。

考虑到Admin图形化界面的安全问题。

为了保证SpringBootAdminServer的安全,需要基于官方文档提供的内容去实现

导入依赖、编写配置类

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {

    private final AdminServerProperties adminServer;

    public SecuritySecureConfig(AdminServerProperties adminServer) {
        this.adminServer = adminServer;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
        successHandler.setTargetUrlParameter("redirectTo");
        successHandler.setDefaultTargetUrl(this.adminServer.path("/"));

        http.authorizeRequests(
                (authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll()
                        .antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated()
        ).formLogin(
                (formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()
        ).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults())
                .csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                        .ignoringRequestMatchers(
                                new AntPathRequestMatcher(this.adminServer.path("/instances"),
                                        HttpMethod.POST.toString()),
                                new AntPathRequestMatcher(this.adminServer.path("/instances/*"),
                                        HttpMethod.DELETE.toString()),
                                new AntPathRequestMatcher(this.adminServer.path("/actuator/**"))
                        ))
                .rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));
    }

    @Value("${spring.admin.user}")
    private String user;
    @Value("${spring.admin.password}")
    private String password;
    @Value("${spring.admin.role}")
    private String role;
    // Required to provide UserDetailsService for "remember functionality"
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser(user).password("{noop}" +password).roles(role);
    }


}

客户端在AdminServer提供安全机制后,无法正常注册到AdminServer,此时需要在AdminClient中设置好连接的用户名和密码

spring.boot.admin.client:
   username: sba-client
   password: s3cret

六、SpringBootAdmin注册中心连接

因为一般在微服务的架构下需要使用AdminServer,但是这样话,会造成所有的微服务都需要主动去设置AdminServer的地址,从而实现监控效果。

这样一来AdminServer地址的耦合性就特别的高。

基于注册中心,来让AdminServer监控所有注册中心列表上的服务。

可以直接让AdminServer也注册到注册中心(Nacos,Eureka,Zookeeper)

别的什么都不用管,AdminServer支持注册中心监控服务的方式

导入依赖,编写配置,启动

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件

spring:
  boot:
    admin:
      discovery:
        ignored-services:
          - adminserver
  application:
    name: adminserver
  cloud:
    nacos:
      discovery:
        server-addr: 49.233.115.171:8848

七、定制内容监控发邮件

7.1 服务下线自动发送邮件

AdminServer提供了服务下线后,自动通知功能,通知的方向有很多

国内更多的是:JavaMail,DingDing…

导入依赖、编写配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
  mail:
    host: smtp.126.com
    password: RPRVYYXGIAEQSFSV
    username: zjw_2301211@126.com
  boot:
    admin:
      notify:
        mail:
          to: 402424668@qq.com
          from: zjw_2301211@126.com  #出现了553的错误,发送方必须是授权的邮箱地址

7.2 制定监控的内容

查看健康信息的详细信息

management:
  endpoint:
    health:
      show-details: always

image.png

仿照他自动生成的监控信息,自己写一个~~~

找到了他实现的类

image.png

仿照这个类,玩一下。

@Component
public class MyHealthIndicator extends AbstractHealthIndicator {

    private static long time = System.currentTimeMillis() + (60 * 1000) ;

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        long currTime = System.currentTimeMillis();
        if(currTime >= time){
            // 发送邮件,给予通知
            // 如果一些通知Admin不支持,在这自己玩~~
            System.out.println("凉凉~");
            builder.down();
        }else {
            // 没什么事
            System.out.println("一切ok~~");
            builder.up();
        }
    }
}

类名别乱写,后缀要一致,默认是去掉HealthIndicator,没用前缀作为名称。

绿色健康。

红色是某个组件出问题。(可以访问到health,但是有组件凉凉~)

灰色是服务下线。(宕机,也有可能是某写组件出问题,导致无法接收请求)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java面试篇 4.9(mybatis+微服务+线程安全+线程池)

目录 mybatis&#xff1a; 1、mybatis的执行流程 2、mybatis是否支持延迟加载&#xff1f; 当我们需要去开启全局的懒加载时&#xff1a; 3、mybatis的一级和二级缓存 微服务 1、springcloud五大组件有哪些 2、服务注册和发现是什么意思&#xff1f;springcloud如何实现…

基于电子等排体的3D分子生成模型 ShEPhERD - 评测

一、背景介绍 ShEPhERD 是一个由 MIT 开发的一个 3D 相互作用感知的 ligand-based的分子生成模型&#xff0c;以 arXiv 预印本的形式发表于 2024 年&#xff0c;被ICLR2025 会议接收。文章链接&#xff1a;https://openreview.net/pdf?idKSLkFYHlYg ShEPhERD 是一种基于去噪扩…

GR00T N1:面向通用类人机器人的开放基础模型

摘要 通用型机器人需要具备多功能的身体和智能的大脑。近年来&#xff0c;类人机器人的发展在构建人类世界中的通用自主性硬件平台方面展现出巨大潜力。一个经过大量多样化数据源训练的机器人基础模型&#xff0c;对于使机器人能够推理新情况、稳健处理现实世界的多变性以及快…

QT简单实例

QT简单实例 QT简单实例一&#xff1a;通过拖动创建1.创建工程2.拖动控件实现响应3.文件目录3.1 TestQDialog.pro3.2 main.cpp3.3 dialog.h3.4 dialog.cpp 二&#xff1a;通过动态创建1.创建工程2.文件目录2.1 TestQDialogSelf.pro2.2 main.cpp2.3 dialog.h2.4 dialog.cpp QT简单…

Linux:初学者的简单指令

文章目录 pwd&#xff08;Print working directory&#xff09;whoamilsmkdir ~~cd ~~touch ~~rm ~~ 充当后端服务,我们用xshell工具来进行操作 其中Linux文件是/目录/目录/目录或文件/来表示的&#xff08;其中目录可以看作是windows操作系统的文件夹&#xff0c;只是Linux中…

端侧大模型综述On-Device Language Models: A Comprehensive Review

此为机器翻译&#xff0c;仅做个人学习使用 设备端语言模型&#xff1a;全面回顾 DOI&#xff1a;10.48550/arXiv.2409.00088 1 摘要 大型语言模型 &#xff08;LLM&#xff09; 的出现彻底改变了自然语言处理应用程序&#xff0c;由于减少延迟、数据本地化和个性化用户体验…

python实现音视频下载器

一、环境准备 确保当前系统已安装了wxPython 、 yt-dlp 和FFmpeg。当前主要支持下载youtube音视频 1、安装wxPython pip install wxPython2、安装yt-dp pip install wxPython yt-dlp3、安装FFmpeg 在Windows 10上通过命令行安装FFmpeg&#xff0c;最简便的方式是使用包管理…

三、小白如何用Pygame制作一款跑酷类游戏(按键图片和距离的计算)

三、小白如何用Pygame制作一款跑酷类游戏&#xff08;实现移动距离的计算&#xff0c;以及按键指引的添加&#xff09; 文章目录 三、小白如何用Pygame制作一款跑酷类游戏&#xff08;实现移动距离的计算&#xff0c;以及按键指引的添加&#xff09;前言一、创建字体文件夹1.可…

H5:实现安卓和苹果点击下载App自动跳转到对应的应用市场

一、需求场景 手机扫描下载App&#xff0c;需要根据不同手机自动跳转到对应的应用市场&#xff08;商店&#xff09;里&#xff0c;苹果手机直接打开App Store里指定的app页面&#xff0c;安卓手机如果是海外用户则打开GooglePlay 商店里指定的app页面&#xff0c;国内直接下载…

【Linux】文件传输归档与压缩

目录 配置实验环境 文件传输方法--scp&#xff0c;rsync scp rsync 归档与压缩--tar&#xff0c;gz&#xff0c;bz2&#xff0c;xz&#xff0c;zip 归档---tar 压缩 zip gzip bzip2 xz 归档并压缩 gz bz2 xz 拓展du 配置实验环境 在多个linux系统进行系统传输…

3D人脸扫描技术如何让真人“进入“虚拟,虚拟数字人反向“激活“现实?

随着虚拟人技术的飞速发展&#xff0c;超写实数字人已经成为数字娱乐、广告营销和虚拟互动领域的核心趋势。无论是企业家、知名主持人还是明星&#xff0c;数字分身正在以高度还原的形象替代真人参与各类活动&#xff0c;甚至成为品牌代言、直播互动的新宠。 3D人脸扫描&#…

Git标签的认识

Git标签完全指南&#xff1a;从基础到企业级发布策略 前言 在软件发布领域&#xff0c;Git标签是版本管理的基石。根据2023年GitHub年度报告显示&#xff0c;85%的开源项目使用标签进行版本控制。然而&#xff0c;许多开发者仅停留在git tag的基础使用层面&#xff0c;未能充分…

【Rust基础】使用Rocket构建基于SSE的流式回复

背景 我们正在使用Rust开发基于RAG的知识库系统&#xff0c;其中对于模型的回复使用了常用的SSE&#xff0c;Web框架使用Rocket&#xff0c;Rocket提供了一个简单的方式支持SSE&#xff0c;但没有会话保持、会话恢复等功能&#xff0c;因此我们自己简单实现这两个功能。 使用R…

大前端基础学习

一、cs架构和bs架构 c&#xff1a;客户端&#xff0c; b&#xff1a;浏览器&#xff08;无需安装&#xff0c;无需更新&#xff0c;可跨平台&#xff09;√ s&#xff1a;server服务端&#xff0c;帮我们保 存信息&#xff0c;传递信息 二、 altshift向下键向下复制一行 …

Axios 的 POST 请求:QS 处理数据的奥秘与使用场景解析

在现代前端开发中&#xff0c;Axios 已经成为了进行 HTTP 请求的首选库之一&#xff0c;它的简洁易用和强大功能深受开发者喜爱。当使用 Axios 进行 POST 请求时&#xff0c;我们常常会遇到一个问题&#xff1a;是否需要使用 QS 库来处理请求数据&#xff1f;什么时候又可以不用…

Linux 防火墙( iptables )

目录 一、 Linux 防火墙基础 1. 防火墙基础概念 &#xff08;1&#xff09;防火墙的概述与作用 &#xff08;2&#xff09;防火墙的结构与匹配流程 &#xff08;3&#xff09;防火墙的类别与各个防火墙的区别 2. iptables 的表、链结构 &#xff08;1&#xff09;规则表 …

【redis进阶三】分布式系统之主从复制结构(1)

目录 一 为什么要有分布式系统&#xff1f; 二 分布式系统涉及到的非常关键的问题&#xff1a;单点问题 三 学习部署主从结构的redis (1)创建一个目录 (2)进入目录拷贝两份原有redis (3)使用vim修改几个选项 (4)启动两个从节点服务器 (5)建立复制&#xff0c;要想配…

EM储能网关ZWS智慧储能云应用(9) — 远程OTA升级

ZWS智慧储能云平台支持远程OTA固件升级&#xff0c;可以针对具体的储能设备进行升级&#xff0c;升级储能网关、EMS主控软件、PCS、BMS等。 简介 储能系统通常高度集成化&#xff0c;一体化设计&#xff0c;将EMS、BMS&#xff08;电池管理系统&#xff09;、PCS&#xff08…

ubuntu24.04LTS安装向日葵解决方案

去向日葵官方下载ubuntu使用的deb包 向日葵 输入如下命令安装&#xff0c;将具体版本修改成自己下载的版本 andrew in ~/下载 λ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 290947…

达梦官方管理工具SQLark:自动识别外键约束、check约束与虚拟列,助力高效生成测试数据

在数据库管理和应用开发过程中&#xff0c;高质量的测试数据对于系统调试和POC测试至关重要。达梦官方推出的新一代管理工具 SQLark百灵连接&#xff0c;其数据生成功能&#xff0c;可以为应用开发者、DBA 以及测试人员带来极大便利&#xff0c;能够轻松应对各类复杂的测试场景…