Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】
| 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、链路追踪框架对比
-
Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
-
Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能强大,接入端无代码侵入。
-
SkyWalking是本士开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
-
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 #路由的唯一标识,路由到orderuri: 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();}@Tracepublic 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;@Datapublic 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】 | 跳转 |
相关文章:
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…...
wpf devexpress设置行和编辑器
如下教程示范如何计算行布局,特定的表格单元编辑器,和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源,如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…...
AdaBoost 算法:理解、实现和掌握 AdaBoost
一、介绍 Boosting 是一种集成建模技术,由 Freund 和 Schapire 于 1997 年首次提出。从那时起,Boosting 就成为解决二元分类问题的流行技术。这些算法通过将大量弱学习器转换为强学习器来提高预测能力 。 Boosting 算法背后的原理是,我们首先…...
基于ssm+vue设备配件检修管理系统
摘要 随着工业设备的日益复杂和多样化,设备配件的检修管理成为保障生产运行和设备寿命的关键环节。本研究基于SSM框架(Spring Spring MVC MyBatis),致力于设计和实现一套全面、高效的设备配件检修管理系统。该系统不仅能够提高设…...
Reids集群
目录 一、集群的概念 1.为什么要搭建集群? 2.Redis搭建集群是否需要考虑状态同步的问题? 二、Redis集群的模式 1.redis集群--主从模式 1.1什么是Redis的主从模式? 1.2.主从模式它们之间的数据是怎么实现一个同步的? 1.3.主…...
自定义指令基础
除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives) 选项式API_自定义指令 <template><h3>自定义指令</h3><p v-author>文本信息</p> </template> <script> e…...
软考-高级-系统架构设计师教程(清华第2版)【第5章 软件工程基础知识(190~233)-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第5章 软件工程基础知识(190~233)-思维导图】 课本里章节里所有蓝色字体的思维导图...
Oneid方案
一、前文 用户画像的前提是标识出用户,存在以下场景:不同业务系统对同一个人的标识,匿名用户行为的行为归因;本文提供多种解决方案,提供大家思考。 二、方案矩阵 三、其他 相关连接: 如何通过图算法能力获…...
【超好用的工具库】hutool-all工具库的基本使用
简介(可不看): hutool-all是一个Java工具库,提供了许多实用的工具类和方法,用于简化Java开发过程中的常见任务。它包含了各种模块,涵盖了字符串操作、日期时间处理、加密解密、文件操作、网络通信、图片处…...
趣学python编程 (一、计算机基础知识科普)
未来是高度科技化和智能化的时代。过去不识字的叫“文盲”,如今不懂点计算机知识,则可能是新时代的“文盲”。不论从事什么行业,了解下计算机和编程都是有益的。Python 连续多年占据最受欢迎的编程语言榜首,未来Python有机会成为像…...
亚马逊云科技云存储服务指南
文章作者:Libai 高效的云存储服务对于现代软件开发中的数据管理至关重要。亚马逊云科技云存储服务提供了强大的工具,可以简化工作流程并增强数据管理能力。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏…...
随机链表的复制
文章目录 🍉前言🍉题目🍉分析🍉思路一:暴力解法🍉思路二:很绝的办法 🍉前言 果然,力扣的简单题不一定简单,但是中等和较难的题一定很麻烦。 这道题相当综合&…...
树莓派4b编译FFmpeg支持硬件编解码
ffmpeg h264_omx解码器充分发挥树莓派gpu性能 准备 树莓派4b ,64位系统 修改树莓派的启动设置文件(/boot/config.txt)进行如下的调整: gpu_mem=256 framebuffer_depth=16安装依赖 常规依赖: sudo apt update sudo apt upgrade sudo apt -y install autoconf automake …...
开启CentOS/Debian自带的TCP BBR加速
BBR 是什么我就不多做介绍了。如果系统自带内核高于4.9 则默认已包含 BBR。 操作方法: 1、使用 root 权限运行下面代码 uname -r //内核版本高于 4.9 就行。2、开启BBR echo "net.core.default_qdiscfq" >> /etc/sysctl.conf echo "net.ip…...
视频推拉流EasyDSS直播点播平台获取指定时间快照的实现方法
视频推拉流直播点播系统EasyDSS平台,可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能,可兼容多操作系统,在直播点播领域具有广泛的场景应用。为了便于用户集成、调用与二次开发。 今天我们来介绍下在…...
CSS---关于font文本属性设置样式总结
目录 1、color属性 2、font-size属性 3、font-weight属性 4、font-family属性 5、text-align属性 6、line-height属性 7、text-indent属性 8、letter-spacing属性 9、word-spacing属性 10、word-break属性 11、white-space属性 12、text-transform 12、writing-mo…...
7、使用真机调试鸿蒙项目
此处以华为手机为例,版本为鸿蒙4.0. 一、打开手机调试功能 1、打开开发者模式 打开“设置”—“关于手机”,连续点击“软件版本”可打开开发者模式 2、开启USB调试功能 打开“设置”—“系统更新”—“开发者选项”,下拉找到“USB调试”…...
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)
GPT实战系列-如何使用P-Tuning本地化训练ChatGLM2等LLM模型? 文章目录 GPT实战系列-如何使用P-Tuning本地化训练ChatGLM2等LLM模型?P-Tuning微调训练概述1、预训练模型或者是torch模型2、训练器的超参数3、数据预处理工具4、加载数据5、分词处理6、数据预…...
【Python】爬虫代理IP的使用+建立代理IP池
目录 前言 一、代理IP 1. 代理IP的获取 2. 代理IP的验证 3. 代理IP的使用 二、建立代理IP池 1. 代理IP池的建立 2. 动态维护代理IP池 三、完整代码 总结 前言 在进行网络爬虫开发时,我们很容易遭遇反爬虫机制的阻碍。为了规避反爬虫机制,我们…...
JS-项目实战-新增水果库存功能实现
1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
