Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

news2024/11/23 12:22:55
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】跳转

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

    • 一、简介
      • 1、skywalking是什么
      • 2、链路追踪框架对比
      • 3、性能对比
      • 4、skywalking主要功能特性
    • 二、Skywalking环境搭建部署
      • 1、下载skywalking
      • 2、搭建skywalking OAP服务
    • 三、skywalking跨多个微服务跟踪(Windows环境在IDEA中使用skywalking)
    • 四、skywalking设置集成gateway(第三方内容)
    • 五、Linux环境通过jar的方式接入
    • 六、skywalking持久化跟踪数据
      • 1、默认使用的H2数据库存储(内存)
      • 2、基于mysql持久化
    • 七、自定义skywalking链路追踪【设置业务方法记录到skywalking】
      • 1、引入依赖
      • 2、@Trace将方法加入追踪链路
      • 3、加入@Tags或@Tag 设置记录返回值和参数
    • 八、skywalking性能剖析
    • 九、skywalking告警功能

一、简介

1、skywalking是什么

skywalking是一个国产开源框架, 2015年由吴晟开源,2017年加入Apache孵化器。

skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、 K8s、 Mesos) 架构而设计。

它是一款优秀的APM (Application Performance Management)工具,包括了分布式追踪、性能.
指标分析、应用和服务依赖分析等。

官网: http://skywalking.apache.org
在这里插入图片描述

下载: http://skywalking.apache.org/downloads/
Github: https://github.com/apache/skywalking
文档: https://skywalking.apache.org/docs/main/v8.4.0/readme/
中文文档: https://skyapm.github io/document-cn-translation-of-skywalking/

2、链路追踪框架对比

  1. Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。

  2. Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能强大,接入端无代码侵入。

  3. SkyWalking是本士开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。

  4. CAT是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等-系列的监控平台工具。

在这里插入图片描述

3、性能对比

模拟了三种并发用户: 500, 750, 1000。使用jmeter测试, 每个线程发送30个请求,设置思考时间为10ms。使用的采样率为1,即100% ,这边与生产可能有差别。pinpoint默认的采样率为20,即50%,通过设置agent的配置文件改为100%。zipkin默认也是1。组合起来, -共有12种。

下面看下汇总表:
在这里插入图片描述
从上表可以看出,在三种链路监控组件中,skywalking的探针对吞吐量的影响最小,zipkin的吞吐量居中。pinpoint的探针对吞吐量的影响较为明显,在500并发用户时,测试服务的吞吐量从1385降低到774,影响很大。然后再看下CPU和memory的影响,在内部服务器进行的压测,对CPU和memory的影响都差不多在10%之内。

4、skywalking主要功能特性

1、多种监控手段,可以通过语言探针和service mesh获得监控的数据;
2、支持多种语言自动探针,包括Java, .NET Core和Node.JS;
3、轻量高效,无需大数据平台和大量的服务器资源;
4、模块化,UI、存储、集群管理都有多种机制可选;
5、支持告警;
6、优秀的可视化解决方案;

二、Skywalking环境搭建部署

在这里插入图片描述

  • skywalking agent和业务系统绑定在一起, 负责收集各种监控数据
  • Skywalking oapservice是 负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中;接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。Skywalking oapservice通常以集群的形式存在。
  • skywalking webapp,前端界面,用于展示数据。
  • 用于存储监控数据的数据库,比如mysql、elasticsearch等。

1、下载skywalking

下载:http://skywalking.apache.org/downloads/

在这里插入图片描述
这里只能下载最新版本
我们在在这里下载旧版本:https://archive.apache.org/dist/skywalking/

在这里插入图片描述

在这里插入图片描述
解压
在这里插入图片描述
在这里插入图片描述
修改端口号
在这里插入图片描述
在这里插入图片描述

2、搭建skywalking OAP服务

启动
双击
在这里插入图片描述
启动成功后会启动两个服务,一个是skywalking-oap-server, 一个是skywalking-web-ui : 8868

skywalking-oap-server服务启动后会暴露11800和12800两个端口,分别为收集监控数据的端口11800和接受前端请求的端口12800,修改端口可以修改config/applicaiton.yml

访问:http://localhost:8868/
在这里插入图片描述

三、skywalking跨多个微服务跟踪(Windows环境在IDEA中使用skywalking)

在这里插入图片描述

# skywalking-agent.jar 的本地磁盘路径
-javaagent:D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-DSW_AGENT_NAME=api-gateway
# 在skywalking的controller的服务的IP以及端口
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

DSW_AGENT_COLLECTOR_BACKEND_SERVICES可以指定远程地址,但是-javaagent必须绑定你本机物理路径的skywalking-agent.jar
Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。
上述当中的jar路径
在这里插入图片描述

测试:
启动微服务mall-gateway, mall-order, mall-user ,配置skywalking的jvm参数

http://localhost:8888/user/findOrderByUserld/1

四、skywalking设置集成gateway(第三方内容)

在这里插入图片描述

        - id: order_route #路由的唯一标识,路由到order
          uri: lb://alibaba-order-seata # 需要转发的地址  lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略 order-service服务名

修改一下OrderController
在这里插入图片描述

配置项目启动参数
在这里插入图片描述
在这里插入图片描述

-javaagent:D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=api-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

在这里插入图片描述

-javaagent:D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=order-service
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

在这里插入图片描述

-javaagent:D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=stock-service
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

分别启动上述设置的内容
在这里插入图片描述
访问:http://localhost:8088/order/add

在这里插入图片描述

访问:http://localhost:8868/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改OrderController
在这里插入图片描述
在这里插入图片描述
http://localhost:8088/order/add
在这里插入图片描述
可以监控到那个节点抛出异常
在这里插入图片描述
集成gateway
D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\optional-plugins当中的有gateway的jar
在这里插入图片描述

需要进入到复制到D:\ProgramTool\apache-skywalking-apm-es7-8.5.0\apache-skywalking-apm-bin-es7\agent\plugins当中
在这里插入图片描述
重新启动运行Skywalking
重新启动项目并访问
在这里插入图片描述
http://localhost:8088/order/add
在这里插入图片描述
访问:http://localhost:8868/topology
出现了gateway的节点
在这里插入图片描述

五、Linux环境通过jar的方式接入

准备一个springboot程序,打成可执行jar包,写一个shelI脚本,在启动项目的Shel脚本上,通过-javaagent参数进行配置SkyWalking Agent来跟踪微服务;

startup.sh脚本:

#!/bin/sh 
# SkyWalking Agent配置
export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般 使用spring.application.name
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置collector地址。
export SW_AGENT_SPAN_LIMIT=2000 #配置链路的最大Span数量,默认为300。
export JAVA_AGENT=-javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar #jar启动

等同于

java -javaagent:/usr/local/soft/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME = springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar

参数名对应agentconfig/agent.config配置文件中的属性。
属性对应的源码: org.apache.skywalking.apm.agent.core.conf.Config.java

# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName }
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

我们也可以使用skywalking.+配置文件中的配置名作为系统配置项来进行覆盖。javaagent参数配置方式优先级更高

六、skywalking持久化跟踪数据

1、默认使用的H2数据库存储(内存)

confia/application.yml

在这里插入图片描述

2、基于mysql持久化

1)修改config目录下的application.yml,使用mysql作为持久化存储的仓库
在这里插入图片描述

2)修改mysql连接配置
在这里插入图片描述
在mysql当中创建swtest即可,Skywalking会自动创建对应的表结构

在这里插入图片描述
我们本次使用的是mysql8,Skywalking默认没有对应的驱动,需要设置对应的驱动

拷贝MySQL连接驱动到oap-libs文件夹下,可以用:mysql-connector-java-8.0.25.jar这个版本的数据库连接驱动
在这里插入图片描述

重新启动Skywalking
在这里插入图片描述
自动创建好对应的表结构
在这里插入图片描述

在这里插入图片描述

访问:http://localhost:8088/order/add
在这里插入图片描述

访问:http://localhost:8868/
在这里插入图片描述

现在重新启动对应的服务旧的数据依旧是存在的。

七、自定义skywalking链路追踪【设置业务方法记录到skywalking】

1、引入依赖

如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码

引入依赖
在这里插入图片描述

	    <!-- SkyWalking工具类-->
	    <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.5.0</version>
        </dependency>

2、@Trace将方法加入追踪链路

在这里插入图片描述

	@RequestMapping("/all")
    public List<Order> getAll() throws InterruptedException {
        return All();
    }

    @Trace
    public List<Order> All() throws InterruptedException {
        return orderService.all();
    }

重新启动alibaba-order-seata

访问:http://localhost:8088/order/all
在这里插入图片描述

3、加入@Tags或@Tag 设置记录返回值和参数

@Tag注解中 key =方法名 value = returnedObj 返回值 arg[0] 参数I

在这里插入图片描述

// 获取单个订单信息
    @RequestMapping("/get/{id}")
    public Order get(@PathVariable Integer id){
        return getById(id);
    }

    @RequestMapping("/all")
    public List<Order> getAll() throws InterruptedException {
        return All();
    }

    @Trace
    @Tag(key = "list",value = "returnedObj")
    public List<Order> All() throws InterruptedException {
        return orderService.all();
    }

    @Trace
    @Tags({@Tag(key = "param",value = "arg[0]"),@Tag(key = "user",value = "arg[0]"),}
    )
    public Order getById(Integer id) {
        return orderService.get(id);
    }

重新启动alibaba-order-seata
访问:http://localhost:8088/order/all
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里返回了对象的内存地址,我们需要将对应的对象toString
在这里插入图片描述
重新运行并查看

在这里插入图片描述

访问:http://localhost:8088/order/get/1

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

八、skywalking性能剖析

在这里插入图片描述
在这里插入图片描述
设置接口延迟响应
在这里插入图片描述

我们连续请求:http://localhost:8088/order/all 6次
在这里插入图片描述
http://localhost:8868/profile

在这里插入图片描述
上述可以看到对应业务的响应时间
再次修改一下延迟时间
在这里插入图片描述
我们连续请求:http://localhost:8088/order/all 6次

在这里插入图片描述
http://localhost:8868/profile
在这里插入图片描述

九、skywalking告警功能

在这里插入图片描述

SkyWalking告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在config/alarm-settings. yml文件中。告警规则的定 义分为两部分:

1.告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件。
2.Webhook (网络钩子) :定义当警告触发时,哪些服务终端需要被告知


告警规则
SkyWalking的发行版都会默认提供config/alarmrsettings. yml文件,里面预先定义了一-些常用的告警规则。 如下:
1.过去3分钟内服务平均响应时间超过1秒。
2.过去2分钟服务成功率低于80%。
3.过去3分钟内服务响应时间超过1s的百分比。
4.服务实例在过去2分钟内平均响应时间超过1s,并且实例名称与正则表达式匹配。
5.过去2分钟内端点平均响应时间超过1秒。
6.过去2分钟内数据库访问平均响应时间超过1秒。
7.过去2分钟内端点关系平均响应时间超过1秒。

这些预定义的告警规则,打开config/alarm-settings. yml文件即可看到。

告警规则配置项的说明:

  • Rule name:规则名称,也是在告警信息中显示的唯一名称。 必须以rule结尾,前缀可自定义
  • Metrics name:度量名称,取值为oal脚本中的度量名,目前只支持1ong、 double和int类型。 详见official OAL script
  • Include names:该规则作用于哪些实体名称,比如服务名,终端名(可选, 默认为全部)
  • Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
  • Threshold:阈值
  • P: 操作符,目前支持>、< =
  • Period:多久告警规则需要被核实-下。 这是一个时间窗口, 与后端部署环境时间相匹配
  • Count:在- -个Period窗口中, 如果values超过Threshold值 (按op) ,达到Count值, 需要发送警报
  • Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。默认情况下, 它和- Period-样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次

Webhook可以简单理解为是一种Web层面的回调机制, 通常由一些事件触发, 与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。

例如,在告警这个场景,告警就是一个事件。 当该事件发生时,SkyWalking就会 主动去调用一个配置好的接口, 该接口就是所谓的Webhook。
SkyWalking的告警消息会通过HTTP请求进行发送,请求方法为POST, Content-Type 为application/json,其JSON数据实基于List<org. apache. skywalking. oap. server. core. alarm AlarmMessage进行序列化的。

JSON数据
示例:

[{
	”scopeId”: 1,
	”scope":SERVICE,
	”name”:”serviceA”,
	”id0”: 12,
	”id1”: 0,
	”ruleName” :”service_ resp_ time_ rule”,
	”alarmMessage”:”alarmMessage xxxx",
	”startTime”: 1560524171000
}{
	”scopeId”: 1,
	”scope":SERVICE,
	”name”: ”serviceB”,
	”id0": 23,
	”id1”: 0,
	”ruleName”:”service_ resp_ _time_ rule”,
	”alarmMessage”: ”alarmMessage yyy”,
	”startTime" : 1560524171000
}]

字段说明:

  • scopeld, scope:
    所有可用的Scope详见org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
  • name:目标Scope的实体名称
  • id0: Scope 实体的ID
  • id1:保留字段,目前暂未使用
  • ruleName: 告警规则名称
  • alarmMessage:告警消息内容
  • startTime:告警时间,格式为时间戳

邮件告警功能实践
根据以上两个小节的介绍,可以得知: SkyWalking是不支持直接向邮箱、 短信等服务发送告警信息的,SkyWalking只会在发生告警时将告警信息发送至配 好的Webhook接口。

但我们总不能人工盯着该接口的日志信息来得知服务是否发生了告警,因此我们需要在该接口里实现发送邮件或短信等功能,从而达到个性化的告警通知。
在这里插入图片描述

接下来开始动手实践,这里基于Spring Boot进行实现。首先是添加依赖:
在这里插入图片描述

	<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.18</version>
            <scope>compile</scope>
	</dependency>

SwAlarmDTO
在这里插入图片描述

package com.itbluebox.dto;


import lombok.Data;

import java.util.List;
import java.util.Map;

/***

 */
@Data
public class SwAlarmDTO {

    /*
    * "scopeId": 1,
        "scope": "SERVICE",
        "name": "serviceB",
        "id0": "23",
        "id1": "",
        "ruleName": "service_resp_time_rule",
        "alarmMessage": "alarmMessage yyy",
        "startTime": 1560524171000,
        "tags": [{
            "key": "level",
            "value": "CRITICAL"*/
    private int scopeId;
    private String scope;
    private String name;
    private String id0;
    private String id1;
    private String ruleName;
    private String alarmMessage;
    private List<Tag> tags;
    private long startTime;
    private transient int period;
    private transient boolean onlyAsCondition;

    @Data
    public static class Tag{
        private String key;
        private String value;
    }
}

SwAlarmController

package com.itbluebox.controller;

import com.itbluebox.dto.SwAlarmDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/***
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/alarm")
public class SwAlarmController {


    /**
     * 接收skywalking服务的告警通知并发送至邮箱
     *
     * 必须是post
     */
    @PostMapping("/receive")
    public void receive(@RequestBody List<SwAlarmDTO> alarmList) {
       /* SimpleMailMessage message = new SimpleMailMessage();
        // 发送者邮箱
        message.setFrom(from);
        // 接收者邮箱
        message.setTo(from);
        // 主题
        message.setSubject("告警邮件");
        String content = getContent(alarmList);
        // 邮件内容
        message.setText(content);
        sender.send(message);*/
        String content = getContent(alarmList);
        log.info("告警邮件已发送..."+content);
    }

    private String getContent(List<SwAlarmDTO> alarmList) {
        StringBuilder sb = new StringBuilder();
        for (SwAlarmDTO dto : alarmList) {
            sb.append("scopeId: ").append(dto.getScopeId())
                    .append("\nscope: ").append(dto.getScope())
                    .append("\n目标 Scope 的实体名称: ").append(dto.getName())
                    .append("\nScope 实体的 ID: ").append(dto.getId0())
                    .append("\nid1: ").append(dto.getId1())
                    .append("\n告警规则名称: ").append(dto.getRuleName())
                    .append("\n告警消息内容: ").append(dto.getAlarmMessage())
                    .append("\n告警时间: ").append(dto.getStartTime())
                    .append("\n标签: ").append(dto.getTags())
                    .append("\n\n---------------\n\n");
        }

        return sb.toString();
    }
}

在这里插入图片描述

在这里插入图片描述
访问:http://localhost:8088/order/all
在这里插入图片描述
http://localhost:8868/alarm
在这里插入图片描述

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】跳转

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

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

相关文章

【milkv】2、mpu6050驱动添加及测试

前言 本章介绍mpu6050的驱动添加以及测试。 其中驱动没有采用sdk提供的驱动&#xff0c;一方面需要配置irq&#xff0c;另一方面可以学习下如何通过ko方式添加驱动。 一、参考文章 驱动及测试文件编译流程&#xff1a; https://community.milkv.io/t/risc-v-milk-v-lsm6ds…

Semantic Kernel 学习笔记2

本来想白瞟免费Bing Search API如下&#xff0c;但是报错无法链接利用免费的必应 Bing 自定义搜索打造站内全文搜索_bing_subscription_key-CSDN博客 改成按照官方推荐申请&#xff0c;并在.env文件中添加BING_API_KEY""字段。 1. 打开https://www.microsoft.com/en-…

Quarkus 替代 SpringBoot

1 概述2 SpringBoot3 Quarkus4 比较5 调查结果6 从 Spring 转换到 Quarkus7 我是 Spring 开发者&#xff0c;为什么要选Quarkus&#xff1f;8 Spring 开发者可以活用哪些现有知识&#xff1f;9 对Spring开发者有额外的好处吗&#xff1f;10 Spring开发者如何开始学习Quarkus&am…

mp4视频批量截取!!!

mp4视频批量截取&#xff01;&#xff01;&#xff01; 问题&#xff1a;如果我们想截取一个mp4视频中的多个片段&#xff0c;一个一个截会很麻烦&#xff01; 可以将想要截取的开始时间和结束时间保存到 excel表 中&#xff0c;进行批量截取。 1、对一个视频&#xff0c;记…

临床决策分析(DCA)演示APP:理解DCA分析

临床决策分析&#xff08;DCA&#xff09;演示APP&#xff1a;理解DCA分析 之前讨论了DCA分析的分析过程和作用&#xff0c;认为其最主要的作用是确定预测模型的决策阈值&#xff0c;从而促进预测模型与临床的结合。DCA的影响不止于此&#xff0c;在DCA分析中&#xff0c;预测…

C++模拟实现——红黑树

一、介绍 红黑树也是对一般的搜索二叉树不能保证平衡的一个改进&#xff0c;和AVL树采用的思路不同&#xff0c;但同样需要旋转&#xff0c;其本质也是一颗平衡搜索二叉树&#xff0c;其节点有颜色的区分&#xff0c;并且被一些规则束缚&#xff0c;在这些规则下&#xff0c;能…

远勤山丨于无声处听惊雷——写在远航汽车投产下线之际

“只要未来有前途的产业必然竞争激烈。新能源汽车目前还有很多新进入者&#xff0c;证明还有很大的成长空间。对于远航汽车&#xff0c;我们非常有信心坐上最后的牌桌。” 2023年11月8日&#xff0c;在山西运城大运新能源生产基地举办的“远航汽车下线仪式”上&#xff0c;大运…

举报“将我的电脑控作己用者”!

既然“麻辣800727”都说是“街子电信”干的&#xff0c;那么&#xff0c;我现在就正式举报&#xff1a;请依法管理宽带网&#xff0c;你国营的也不可以随意侵犯用户的人权&#xff0c;更不可以将自己变成法外之地&#xff01; 请公开答复&#xff0c;并改正&#xff0c;否则把…

Web实验(总)

目录 网站需求&#xff1a; 思路&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;准备工作 第二步&#xff1a;新建一个存储网页的目录 第三步&#xff1a;修改本地hosts映射 第四步&#xff1a;修改配置文件&#xff0c;建立基于http服务的网站 1)创建用户song和…

都快2024年了,别只使用React,需要学习一下Vue,不然没出路了

最近&#xff0c;我的朋友因为不熟悉 Vue.js 而未能通过面试。 她平时工作中大部分时间都在使用React&#xff0c;所以也懒得去了解其他前端框架。 世界上所有的前端框架我们都应该熟悉吗&#xff1f; 不&#xff0c;这是极其不合理的。 但为了生存&#xff0c;朋友还是要学…

Vue事件绑定

目录 前言 Vue事件处理 指令的语法格式 事件绑定指令—v-on 回调函数 前言 我们知道如何在原生js中实现事件绑定&#xff0c;那在vue中如何实现呢&#xff1f; Vue事件处理 指令的语法格式 <标签 v-指令名&#xff1a;参数名"表达式">{{插值语法}}</…

2D 3D 工业组态技术 meta2d JavaScript

本心、输入输出、结果 文章目录 2D 3D 工业组态技术 meta2d JavaScript前言2D 3D 工业组态技术 meta2d JavaScript 简介2D 3D 工业组态技术 meta2d JavaScript 特性丰富的组态能力0代码数据通信组态的应用多端适配能力强大的扩展能力追求卓越性能丰富的组件库资源广泛的应用场景…

React Virtual DOM及Diff算法

JSX到底是什么 使用React就一定会写JSX&#xff0c;JSX到底是什么呢&#xff1f;它是一种JavaScript语法的扩展&#xff0c;React使用它来描述用户界面长成什么样子&#xff0c;虽然它看起来非常像HTML&#xff0c;但他确实是javaScript&#xff0c;在React代码执行之前&#…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言&#xff0c;近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名&#xff0c;被广…

基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832输出模拟量控制…

ThreadLocal原理及使用场景

ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题 明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的时候&#xff0c;就会出现线程安全问题&#xff0c;即数据不一致问题。常用的解决方法是对访问共享变量的代码…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

F8652X 984865265 F8652E 984865264

F8652X 984865265 F8652E 984865264 亚历克能够满足最严格的建筑规范开箱-不需要大量的定制&#xff0c;设计时间或劳动力&#xff0c;或专门的布线系统。 模块化ALEC系统包括三个简单的硬件组件——区域控制器(ZC001)、标准按钮墙板和物联网(IoT)网关。该系统可以无限扩展&…

Python高级语法----高级Python函数式编程

文章目录 1. 函数式编程概念2. 使用functools模块3. 深入理解lambda, map, filter, reduce函数a. lambda 函数b. map 函数c. filter 函数d. reduce 函数1. 函数式编程概念 函数式编程是一种编程范式,它将计算视为函数的评估,并避免使用程序状态及可变数据。在Python中,函数…

【VS Code插件开发】创建终端(八)

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! ✨优质专栏:VS Code插件开发极速入门 📢 资料领取:前端进阶资料可以找我免费领取 目录 一、createTerminal创建终端二、终端方法1、…