微服务链路追踪SkyWalking学习笔记

news2024/11/15 17:18:21

目录

1、skywalking是什么

1.2 链路追踪框架对比

1.3 性能对比

1.4 Skywalking主要功能特性

2、 SkyWalking 环境搭建部署

2.1 下载 SkyWalking 

 2.2 搭建SkyWalking OAP 服务

2.3 SkyWalking中三个概念

3、 SkyWalking 接入微服务

3.1 linux环境—通过jar包方式接入

3.2 windos环境—在IDEA中使用Skywalking

3.3 Skywalking跨多个微服务跟踪

4、 Skywalking持久化跟踪数据

 4.1 基于mysql持久化

5、 自定义SkyWalking链路追踪

5.1 @Trace将方法加入追踪链路

​编辑 5.2 加入@Tags或@Tag

6.性能分析

7.Skywalking集成日志框架

7.1Skywalking通过grpc上报日志 (需要v8.4.0+)

8.SkyWalking 告警功能

8.1告警规则

8.2Webhook(网络钩子)

8.3邮件告警功能实践

9.Skywalking高可用

10.demo源码:springcloudAlibaba: Alibaba微服务学习demo


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/

1.2 链路追踪框架对比

1. Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
2. Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无 代码侵入。
3. SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端 无代码侵入。目前已加入Apache孵化器。
4. CAT是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。

 

1.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%之内。

1.4 Skywalking主要功能特性

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

2、 SkyWalking 环境搭建部署

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

2.1 下载 SkyWalking 

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

 根据需求下载对应版本解压即可。

目录结构

 2.2 搭建SkyWalking OAP 服务

启动脚本bin/startup.sh

 日志信息存储在logs目录

启动成功后会启动两个服务,一个是skywalking-oap-server,一个是skywalking-web-ui
skywalking-oap-server服务启动后会暴露11800 和 12800 两个端口 ,分别为 收集监控数据的端口11800和接受前端请求的端口12800 修改端口可以修改config/applicaiton.yml
skywalking-web-ui服务会占用 8080 端口, 修改端口可以修改webapp/webapp.yml
server.port :SkyWalking UI服务端口,默认是8080;  
collector.ribbon.listOfServers: SkyWalking OAP服务地址数组,SkyWalking UI界面的数据是通过请求SkyWalking OAP服务来获得;
访问: http://192.168.3.100:8444/

 页面的右下角可以中英文切换,可以切换选择要展示的时间区间的跟踪数据

2.3 SkyWalking中三个概念

服务(Service) : 表示对请求提供相同行为的一系列或一组工作负载,在使用Agent时,可以定义服务的名字;
服务实例(Service Instance) : 上述的一组工作负载中的每一个工作负载称为一个实例, 一个服务实例实际就是操作系统上
的一个真实进程;
端点(Endpoint) : 对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名 + 方法签名;

 

3、 SkyWalking 接入微服务

3.1 linux环境—通过jar包方式接入

准备一个springboot程序,打成可执行jar包,写一个shell脚本,在启动项目的Shell脚本上,通过 -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
参数名对应 agent/ config/agent.config配置文件中的属性。
我们也可以使用skywalking.+配置文件中的配置名作为系统配置项来进行覆盖。 javaagent参数配置方式优先级更高。

3.2 windos环境—在IDEA中使用Skywalking

在运行的程序配置jvm参数,如下图所示:

-javaagent:E:\apache-skywalking-apm-8.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-DSW_AGENT_NAME=api-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES   可以指定远程地址, 但是-javaagent必须绑定你本机物理路径的skywalking
agent.jar

3.3 Skywalking跨多个微服务跟踪

Skywalking跨多个微服务跟踪,只需要每个微服务启动时添加javaagent参数即可。
启动微服务gateway,order-service,stock-service,配置skywalking的jvm参数
注意:此处存在bug,跟踪链路不显示gateway
解决:拷贝agent/ optional-plugins目录下的gateway插件到 agent/ plugins目录

访问8444端口:

4、 Skywalking持久化跟踪数据

默认使用的H2数据库存储
config/application.yml

 4.1 基于mysql持久化

1. 修改 config目录下的application.yml, 使用mysql作为持久化存储的仓库

2. 修改mysql连接配置

 

注意: 需要添加mysql数据驱动包,因为在lib目录下是没有mysql数据驱动包的,所以修改完配置启动是会报错,启动失败的。

3. 添加对应版本的mysql数据驱动包到oap-libs目录下

4. 启动Skywalking

查看swtest数据库,可以看到生成了很多表。

说明启动成功了,打开配置对应的地址 http://127.0.0.1:8444/ ,可以看到skywalking的web界面。

测试:重启skywalking,验证跟踪数据会不会丢失

5、 自定义SkyWalking链路追踪

如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,可以使用如下的代码
引入依赖
   <!-- SkyWalking 工具类, 跟服务版本一致 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.5.0</version>
        </dependency>

5.1 @Trace将方法加入追踪链路

如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上 @Trace 注解即可

测试

 5.2 加入@Tags或@Tag

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加@Tag或者@Tags。
@Tag 注解中 key  = 方法名; value =  returnedObj  返回值   arg[0] 参数

测试

6.性能分析

skywalking的性能分析,在根据服务名称、端点名称,以及相应的规则建立了任务列表后,在调用了此任务列表的端点后。skywalking会自动记录,剖析当前端口,生成剖析结果,具体流程如图:

 

7.Skywalking集成日志框架

ogback官方配置: skywalking/Application-toolkit-logback-1.x.md at v8.5.0 · apache/skywalking · GitHub

 引入依赖

       <!-- apm-toolkit-logback-1.x -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.5.0</version>
        </dependency>

添加logback-spring.xml文件,并配置 %tid 占位符

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引入 Spring Boot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>


    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder  class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

    <!-- 设置 Appender -->
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>

</configuration>
测试

7.1Skywalking通过grpc上报日志 (需要v8.4.0+)

gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器上
logback-spring.xml中添加
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引入 Spring Boot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>


    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder  class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 设置 Appender -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="grpc-log"/>
    </root>

</configuration>
打开agent/config/agent.config配置文件, 添加如下配置信息:
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800} plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
以上配置是默认配置信息,agent与oap在本地的可以不配
agent配置信息大全:  https://skywalking.apache.org/docs/main/v8.4.0/en/setup/service-agent/java-agent/readme/#table-of-agent-configuration-properties

Skywalking UI效果

8.SkyWalking 告警功能

SkyWalking 告警功能是在6.x版本新增的,其核心由一组规则驱动,这些规则定义在 config/alarm-settings.yml 文件中。告警规则的定义分为两部分:
1. 告警规则 skywalking/backend-alarm.md at v8.5.0 · apache/skywalking · GitHub
它们定义了应该如何触发度量警报,应该考虑什么条件。
2. Webhook(网络钩子)
skywalking/backend-alarm.md at v8.5.0 · apache/skywalking · GitHub
定义当警告触发时,哪些服务终端需要被告知

8.1告警规则

SkyWalking 的发行版都会默认提供 config/alarm-settings.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脚本中的度量名,目前只支持longdoubleint类型。详见Official OAL script
  • Include names:该规则作用于哪些实体名称,比如服务名,终端名(可选,默认为全部)
  • Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空)
  • Threshold:阈值
  • OP: 操作符,目前支持 ><=
  • Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配
  • Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报
  • Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着 相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次
  • message:告警消息

8.2Webhook(网络钩子)

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" : "" ,
  "ruleName" : "service_resp_time_rule" ,
  "alarmMessage" : "alarmMessage xxxx" ,
  "startTime" : 1560524171000
  }, {
  "scopeId" : 1 ,
  "scope" : "SERVICE" ,
"name" : "serviceB" ,
  "id0" : "23" ,
"id1" : "" ,
"ruleName" : "service_resp_time_rule" ,
  "alarmMessage" : "alarmMessage yyy" ,
"startTime" : 1560524171000
}]
字段说明:
scopeId、scope: 所有可用的Scope 见  org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
name: 目标 Scope 的实体名称
id0: Scope 实体的 ID
id1: 保留字段,目前暂未使用
ruleName: 告警规则名称
alarmMessage: 告警消息内容
startTime: 告警时间,格式为时间戳

8.3邮件告警功能实践

根据以上两个小节的介绍,可以得知:SkyWalking是不支持直接向邮箱、短信等服务发送告警信息的,SkyWalking只会在发生告警时将 告警信息发送至配置好的Webhook接口。
但我们总不能人工盯着该接口的日志信息来得知服务是否发生了告警,因此我们需要在该接口里实现发送邮件或短信等功能,从而达到个性化的告警通知。
接下来开始动手实践,这里基于Spring Boot进行实现。首先是添加依赖:
  < dependency >
< groupId > org . springframework . boot </ groupId >
  < artifactId > spring boot starter mail </ artifactId >
</ dependency >
配置邮箱服务:
server :
    port : 9134
# 邮箱配置
  spring :
    mail :
       host :  smtp . 163. com
# 发送者邮箱账号
       username : 你的邮箱 @ 163. com
   # 发送者密钥
       password : 你的邮箱服务密钥
  default encoding :  utf 8
       port : 465  # 端口号 465 587
       protocol :  smtp
       properties :
mail :
  debug :
     false
   smtp :
      socketFactory :
           class :  javax . net . ssl . SSLSocketFactory
根据SkyWalking发送的JSON数据定义一个DTO,用于接口接收数据:
 @Data
 public class SwAlarmDTO {

 private Integer scopeId;
 private String scope;
 private String name;
 private Integer id0;
 private Integer id1;
 private String ruleName;
 private String alarmMessage;
 private Long startTime;
 }
接着定义一个接口,实现接收SkyWalking的告警通知,并将数据发送至邮箱:
 @Slf4j
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/alarm")
 public class SwAlarmController {

 private final JavaMailSender sender;

  @Value("${spring.mail.username}")
 private String from;

 /**
 * 接收skywalking服务的告警通知并发送至邮箱
 */
  @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);
  log.info("告警邮件已发送...");
 }

 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\n‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐\n\n");
 }

 return sb.toString();
 }
 }
最后将该接口配置到SkyWalking中,Webhook的配置位于 config/alarm-settings.yml 文件的末尾,格式为 http://{ip}:
{port}/{uri} 。如下示例:
我在 /producer 接口中增加了一行睡2秒的代码:
 @Override
 @Trace
 @Tag(key="getAll",value="returnedObj")
 public List<Order> all() throws InterruptedException {
  TimeUnit.SECONDS.sleep(2);
return orderMapper.selectAll();
 }
执行完测试代码,等待约两分钟后,告警接口的控制台输出了一段日志信息:

9.Skywalking高可用

在大多数生产环境中,后端应用需要支持高吞吐量并且支持高可用来保证服务的稳定,所以你始终需要在生产环境进行集群管理。
Skywalking集群是将skywalking oap作为一个服务注册到nacos上,只要skywalking oap服务没有全部宕机,保证有一 个skywalking oap在运行,就能进行跟踪。
搭建一个skywalking oap集群需要:
(1)至少一个Nacos(也可以是nacos集群)
(2)至少一个ElasticSearch/mysql(也可以是es/msql集群)
(3)至少2个skywalking oap服务;
(4)至少1个UI(UI也可以集群多个,用Nginx代理统一入口)
1.修改config/application.yml文件
使用nacos作为注册中心
修改nacos配置

 可以选择性修改监听端口 

修改存储策略,使用elasticsearch7作为storage

 

 2. 配置ui服务webapp.yml文件的listOfServers,写两个地址

 3.启动服务测试

启动Skywalking服务,指定springboot应用的jvm参数
DSW_AGENT_COLLECTOR_BACKEND_SERVICES = 192.168.3.10 : 11800 , 192.168.3.12 : 1180

10.demo源码:springcloudAlibaba: Alibaba微服务学习demo

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

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

相关文章

SAP ADM100-2.5 系统启动:日志文件

本节将介绍SAP ABAP系统启动时最重要的log文件和Trce文件,以掌握通过使用系统启动log文件和trace文件分析系统问题。 1、记录系统启动过程 启动过程是一个特别重要的阶段,因此该过程将被操作系统、SAP系统、数据库记录。如果SAP系统没有启动,那么你将在log日志文件中发现相…

C#使用IronPython调用Python

一、前言以下摘自百度百科&#xff1a;IronPython 是一种在 NET 和 Mono 上实现的 Python 语言&#xff0c;由 Jim Hugunin&#xff08;同时也是 Jython 创造者&#xff09;所创造。1.0 版于2006年9月5日发布。随后&#xff0c;在 2007 年&#xff0c;开发者决定改写架构&#…

音视频xxxx

文章目录前言编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量BMP 文件格式格式组成像素排列顺序RGB24格式像素数据…

Apache Solr 9.1-(三)集群模式下通过Http API操作Apache Solr

Apache Solr 9.1-&#xff08;三&#xff09;集群模式下通过Http API操作Apache Solr Solr是一个基于Apache Lucene的搜索服务器&#xff0c;Apache Lucene是开源的、基于Java的信息检索库&#xff0c;Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xf…

网络原理(TCP/IP)(3)

4)滑动窗口 1)咱们滑动窗口的效果就是说在我们尽可能地保证可靠性的情况下&#xff0c;尽可能的提高传输效率2)况且咱们进行发送滑动窗口的本质就是说进行批量的发送数据&#xff0c;咱们尽可能说是把等待ACK的时间总体进行缩短&#xff0c;咱们可以把等待一份ACK的时间变成等待…

凸优化学习:PART1凸集

凸优化学习PART1 一、引言&#xff1a;优化问题简介 优化问题的定义 凸优化是优化的一种&#xff0c;是优化中比较容易的问题。在讲解优化问题前&#xff0c;首先说明什么是优化/数学规划&#xff08;Optimization/Mathematical Planning&#xff09;。 优化&#xff1a;从一…

搭建electron开发环境

electron是使用js,html,css构建桌面端应用程序的框架&#xff0c;可以使用electron开发Windows和Mac端应用。 安装nodejs,npm,cnpm 首先需要安装nodejs,npm和cnpm&#xff0c;安装后在命令行输入 node -v 和npm -v&#xff0c;如果输出了版本号&#xff0c;说明已经正常安装。…

数据仓库-数据模型建设方法总结(全)

一、大数据领域建模综述 1.1 为什么需要数据建模 有结构地分类组织和存储是我们面临的一个挑战。 数据模型强调从业务、数据存取和使用角度合理存储数据。 数据模型方法&#xff0c;以便在性能、成本、效率之间取得最佳平衡 成本&#xff1a;良好的数据模型能极大地减少不必…

MyBatis:批量添加记录

MyBatis&#xff0c;一款优秀的ORM映射框架&#xff0c;可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objects&#xff0c;普通老式 Java 对象&#xff09;为数据库中的记录。同时&#xff0c;MyBatis提供了动态SQL特性&#x…

梦熊杯-十二月月赛-白银组题解-C.永恒

C. Problem C.永恒&#xff08;eternity.cpp&#xff09; 内存限制&#xff1a;256 MiB 时间限制&#xff1a;1000 ms 标准输入输出 题目类型&#xff1a;传统 评测方式&#xff1a;文本比较 题目描述: 「稻妻」是「永恒」的国度。 巴尔泽布认为&#xff0c;如果一个数…

感知机与门电路

前言&#xff1a;简述单层感知机特征及三种表示方式&#xff0c;并用单层感知机描述门电路&#xff0c;借由单层感知机无法处理非线性空间的问题&#xff0c;引出多层感知机。 单层感知机 感知机&#xff08;preceptron&#xff09;接收多个输入信号&#xff0c;输出一个信号…

【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(上)

目录 一、分布式存储 Ceph 基本介绍 1.1 块存储&#xff08;rbd&#xff09; 1.2 文件系统 cephfs 1.3 对象存储 1.4 分布式存储的优点 二、Ceph 核心组件介绍 三、准备安装 Ceph 高可用集群的实验环境 3.1 机器配置 3.2 初始化环境 3.3 配置互信 3.4 配置 Ceph 安…

【精选博客】反爬过程中 x-ca-nonce、x-ca-signature 参数的解密过程

本篇博客在 请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇 的基础上继续编写&#xff0c;大家学习时可以从上一篇入手。 文章目录x-ca-nonce 代码实现python 实现 uuidx-ca-signature代码实现在上一篇博客我们已经捕获了参数的JS代码&#xff0c;这篇博客重点要…

Java设计模式-策略模式Strategy

介绍 策略模式&#xff08;Strategy Pattern&#xff09;中&#xff0c;定义算法族&#xff08;策略组&#xff09;&#xff0c;分别封装起来&#xff0c;让他们之间可以互相替换&#xff0c;此模式让算法的变化独立于使用算法的客户。这算法体现了几个设计原则&#xff0c;第…

这些学习技巧学起来

技巧一&#xff1a;组合多个对象 在PPT页面插入多个图形后&#xff0c;想要移动这些元素时&#xff0c;很多小伙伴会挨个拖动进行位置调整。其实&#xff0c;我们大可以使用快捷键【CtrlG】将多个同类的元素进行组合&#xff0c;使其成为一个图形元素&#xff0c;这样就可以方…

springboot整合mybatis-plus及mybatis-plus分页插件的使用

springboot整合mybatis-plus及mybatis-plus分页插件的使用1. mybatis-plus?2. 引入依赖3. 编写配置文件4. 编写sql表5. mapper层5.1 mybatis-plus做了什么&#xff1f;及创建mapper接口5.2 baseMapper源码6. service层及controller层6.1 service层6.2 controller层6.2.1 page对…

【html】超链接样式

超链接样式超链接样式超链接样式 根据超链接的类型&#xff0c;显示不同图片的前缀 根据 <!doctype html> <html> <head> <meta charset"utf-8"> <title></title> <style type"text/css"> body {background: …

C# 托管堆遭破坏问题溯源分析

一&#xff1a;背景 1. 讲故事 年前遇到了好几例托管堆被损坏的案例&#xff0c;有些运气好一些&#xff0c;从被破坏的托管堆内存现场能观测出大概是什么问题&#xff0c;但更多的情况下是无法做出准确判断的,原因就在于生成的dump是第二现场&#xff0c;借用之前文章的一张…

Exynos4412 移植针对Samsung的Linux-6.1(四)NandFlash卡驱动

系列文章目录 Exynos4412 移植针对Samsung的Linux-6.1&#xff08;一&#xff09;下载、配置、编译Linux-6.1Exynos4412 移植针对Samsung的Linux-6.1&#xff08;二&#xff09;SD卡驱动——解决无法挂载SD卡的根文件系统Exynos4412 移植针对Samsung的Linux-6.1&#xff08;三…

C++基础——C++ 循环

C基础——C 循环C 循环循环类型循环控制语句无限循环C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂…