当前位置: 首页 > news >正文

【微服务】skywalking自定义告警规则使用详解

目录

一、前言

二、SkyWalking告警功能介绍

2.1 SkyWalking告警是什么

2.2 为什么需要SkyWalking告警功能

2.2.1 及时发现系统异常

2.2.2 保障和提升系统稳定性

2.2.3 避免数据丢失

2.2.4 提高故障处理效率

三、 SkyWalking告警规则

3.1 SkyWalking告警规则配置

3.2 SkyWalking告警规则参数配置说明

3.3 Webhook介绍

3.3.1 什么是Webhook

3.3.2 Webhook 参数说明

3.3.3 常用的Webhook

四、 告警配置之Webhook使用

4.1 操作步骤

4.1.1 添加依赖

4.1.2 添加一个接口

4.1.3 打包部署服务器

4.2 配置Webhook

4.3 触发回调接口

4.3.1 告警信息展示

五、告警通知接入钉钉

5.1 设置钉钉机器人

5.2 告警规则配置钉钉机器人

5.3 效果测试验证

5.4 告警通知注意事项

5.4.1 合理设置告警规则

5.4.2 配置合理的告警通知方式和接收人员

5.4.3 定期检查和更新配置

六、写在文末


一、前言

在大型分布式系统中,如何在系统中某个服务出问题时能得到快速通知和处理呢,比较常见的做法就是接入告警通知。在分布式系统接入链路追踪、链路可视化大屏等之后,接下来就要考虑如何对系统中的异常情况进行监控告警。

在之前的分享中我们相信介绍了SkyWalking的使用,SkyWalking作为一款开源分布式系统性能监控工具、分布式服务链路追踪工具,不仅提供了很好的链路追踪可视化展示入口,也提供了丰富的告警功能,可以帮助开发或运维人员及时发现系统中的异常情况,从而使问题得到快速的响应与处理。

二、SkyWalking告警功能介绍

2.1 SkyWalking告警是什么

 SkyWalking除了提供实时的系统监控、链路追踪与分析功能外,还提供了告警功能,用于监控系统的指标数据,并在系统服务中被监控的指标超过预设阈值时触发告警。如下图,在UI界面上,左侧有一个告警的菜单项,当接入并配置了告警规则后将会看到相关的信息。

2.2 为什么需要SkyWalking告警功能

2.2.1 及时发现系统异常

在分布式系统中,尤其是随着微服务规模越来越大,发生异常情况在所难免,比如服务A调用服务B超时,服务A内部连接mysql超时等等。在SkyWalking中,通过设置告警规则和触发阈值,可以及时监控系统指标数据,并在数据超过预设阈值时触发告警,可以帮助开发和运维人员及时发现系统中的异常情况,让问题得到尽快的处理从而避免问题的进一步扩大。

2.2.2 保障和提升系统稳定性

通过接入告警功能,可以监控系统关键指标,并在指标超过预设阈值时触发告警。通过一段时间或周期性的运行,可帮助团队及时发现系统中潜在的性能问题,并采取相应的措施,从而提升系统的性能和稳定性。

2.2.3 避免数据丢失

在分布式系统中,数据完整性与可靠性是非常重要的。通过设置告警规则和阈值,可以监控系统中服务的关键指标的数据状态,并在数据发送异常时触发告警,从而及时发现数据丢失或损坏的情况,并及时采取相应的措施,避免数据的进一步损失。

2.2.4 提高故障处理效率

当系统出现异常时,如何快速得到通知并及时处理问题是非常重要的。通过接入告警功能,可以将告警的信息及时通知到相关人员,帮助团队人员快速定位和解决问题,从而提高故障处理的效率,减少系统停机时间。

三、 SkyWalking告警规则

3.1 SkyWalking告警规则配置

SkyWalking 告警功能是在6.x版本新增的,其告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,如下在SkyWalking 的config目录中可以找到该配置:

打开配置之后,可以看到提供了多种配置规则的选项,完整的配置如下:

# Sample alarm rules.
rules:# Rule unique name, must be ended with `_rule`.service_resp_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1000period: 10count: 3silence-period: 5message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.service_sla_rule:# Metrics value need to be long, double or intmetrics-name: service_slaop: "<"threshold: 8000# The length of time to evaluate the metricsperiod: 10# How many times after the metrics match the condition, will trigger alarmcount: 2# How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.silence-period: 3message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutesservice_resp_time_percentile_rule:# Metrics value need to be long, double or intmetrics-name: service_percentileop: ">"threshold: 1000,1000,1000,1000,1000period: 10count: 3silence-period: 5message: Percentile response time of service {name} alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 1000, p75 > 1000, p90 > 1000, p95 > 1000, p99 > 1000service_instance_resp_time_rule:metrics-name: service_instance_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 5message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutesdatabase_access_resp_time_rule:metrics-name: database_access_resp_timethreshold: 1000op: ">"period: 10count: 2message: Response time of database access {name} is more than 1000ms in 2 minutes of last 10 minutesendpoint_relation_resp_time_rule:metrics-name: endpoint_relation_resp_timethreshold: 1000op: ">"period: 10count: 2message: Response time of endpoint relation {name} is more than 1000ms in 2 minutes of last 10 minutes
#  Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.
#  Because the number of endpoint is much more than service and instance.
#
#  endpoint_resp_time_rule:
#    metrics-name: endpoint_resp_time
#    op: ">"
#    threshold: 1000
#    period: 10
#    count: 2
#    silence-period: 5
#    message: Response time of endpoint {name} is more than 1000ms in 2 minutes of last 10 minuteswebhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/

在实际使用中,我们就是围绕这个配置文件进行各类告警规则的配置进行展开,从上述的配置文件;来看,告警规则的定义分为两部分:

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

3.2 SkyWalking告警规则参数配置说明

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脚本中的度量名,目前只支持long、double和int类型;
  • Include names:该规则作用于哪些实体名称,如服务名,终端名(可选,默认为全部);
  • Exclude names:该规则作不用于哪些实体名称,比如服务名,终端名(可选,默认为空);
  • include-names-regex:提供一个正则表达式来包含实体名称,如果同时设置包含名称列表和包含名称的正则表达式,则两个规则都将生效;
  • exclude-names-regex:提供一个正则表达式来排除实体名称,如果同时设置排除名称列表和排除名称的正则表达式,则两个规则都将生效;
  • include-labels:包含在此规则之内的标签;
  • exclude-labels:排除在此规则以外的标签;
  • include-labels-regex:提供一个正则表达式来包含标签,如果同时设置包含标签列表和包含标签的正则表达式,则两个规则都将生效;
  • exclude-labels-regex:提供一个正则表达式来排除标签,如果同时设置排除标签列表和排除标签的正则表达式,则两个规则都将生效;
  • Threshold:阈值;
  • OP: 操作符,目前支持 >、<、=;
  • Period:多久告警规则需要被核实一下。这是一个时间窗口,与后端部署环境时间相匹配;
  • Count:在一个Period窗口中,如果values超过Threshold值(按op),达到Count值,需要发送警报;
  • Silence period:在时间N中触发报警后,在TN -> TN + period这个阶段不告警。 默认情况下,它和Period一样,这意味着相同的告警(在同一个Metrics name拥有相同的Id)在同一个Period内只会触发一次;
  • message:告警消息;

3.3 Webhook介绍

3.3.1 什么是Webhook

Webhook,即钩子,Webhook简单理解来说,即一种Web层面的回调机制,通常由一些事件触发,与代码中的事件回调类似,只不过是Web层面的。由于是Web层面的,所以当事件发生时,回调的不再是代码中的方法或函数,而是服务接口。例如,在告警这个场景,告警就是一个事件,当该事件发生时,SkyWalking就会主动去调用一个配置好的接口,该接口就是所谓的Webhook。如下,在SkyWalking告警规则配置文件的最后给出了Webhook的配置样例。

3.3.2 Webhook 参数说明

Webhook 要求一个点对点的 Web 容器,告警消息会通过 HTTP 请求进行发送,请求方法为 POST,Content-Type 为 application/json,JSON 格式包含以下信息:

  • scopeId:目标 Scope 的 ID;

  • name:目标 Scope 的实体名称;

  • id0:Scope 实体的 ID。id1:未使用;

  • ruleName:您在 alarm-settings.yml 中配置的规则名;

  • alarmMessage. 告警消息内容;

  • startTime. 告警时间戳,当前时间与 UTC 1970/1/1 相差的毫秒数;

下面是一个json数据示例:

[{"scopeId": 1, "scope": "SERVICE","name": "user-service", "id0": "001",  "id1": "",  "ruleName": "service_resp_time_rule","alarmMessage": "服务【user-service】的平均响应时间在最近10分钟内有2分钟超过1秒","startTime": 1706324413454
}]

3.3.3 常用的Webhook

事实上,SkyWalking支持多种Webhook,官方文档中提供了丰富的告警规则,下面介绍几种常用的几种Webhook选择。

Alerting | Apache SkyWalking

Slack Chat Hook

您需要遵循传入Webhooks入门指南并创建新的Webhooks。如果您按以下方式配置了Slack Incoming Webhooks,则告警消息将按 Content-Type 为 application/json 通过HTTP的 POST 方式发送。

参考如下示例:

slackHooks:textTemplate: |-{"type": "section","text": {"type": "mrkdwn","text": ":alarm_clock: *Apache Skywalking Alarm* \n **%s**."}}webhooks:- https://hooks.slack.com/services/x/y/z

微信Hook

只有微信的企业版才支持 Webhooks ,如何使用微信的 Webhooks 可参见如何配置群机器人。如果您按以下方式配置了微信的 Webhooks ,则告警消息将按 Content-Type 为 application/json 通过HTTP的 POST 方式发送

参考如下示例:

wechatHooks:textTemplate: |-{"msgtype": "text","text": {"content": "Apache SkyWalking 告警: \n %s."}}webhooks:- https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=dummy_key

钉钉 Hook

您需要遵循自定义机器人开放并创建新的Webhooks。为了安全起见,您可以为Webhook网址配置可选的密钥。如果您按以下方式配置了钉钉的 Webhooks ,则告警消息将按 Content-Type 为 application/json 通过HTTP的 POST 方式发送。

参考如下示例:

dingtalkHooks:textTemplate: |-{"msgtype": "text","text": {"content": "Apache SkyWalking 告警: \n %s."}}webhooks:- url: https://oapi.dingtalk.com/robot/send?access_token=dummy_tokensecret: dummysecret

四、 告警配置之Webhook使用

上面详细介绍了告警规则配置文件和相关参数的使用,接下来先介绍下Webhook的使用流程。整体思路如下:

  • 搭建一个springboot工程;

  • 提供一个用于webhook回调的接口;

  • 部署工程,并在alarm-settings.yml配置接口回调地址;

工程目录如下

4.1 操作步骤

4.1.1 添加依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.23</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><finalName>hook-service</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

4.1.2 添加一个接口

自定义一个接口类,提供一个Webhook中配置使用

@RestController
@RequestMapping("/alert")
@Slf4j
public class AlertController {//localhost:8088/alert/notify@PostMapping("/notify")public void alterNotify(@RequestBody List<AlarmMessage> messages) {log.info("【收到告警通知】,告警消息:【{}】", JSON.toJSONString(messages));}//localhost:8088/alert/test@GetMapping("/test")public String test(){return "test";}}

AlarmMessage消息通知类

@Data
@ToString
public class AlarmMessage {private int scopeId;private String name;private String id0;private String id1;private String alarmMessage;private long startTime;private String ruleName;}

测试一下接口,确保可以正常调用

4.1.3 打包部署服务器

将工程打包并部署到服务器上,进行启动,确保服务接口可以正常访问,

这里假设你的服务器已经提前做好相关的环境配置,并且开放了相应的防火墙端口

4.2 配置Webhook

将上述的接口地址配置到alarm-settings.yml中

按照这样的规则配置之后,当该配置文件中的任何一种规则阈值被触发,理论上就可以触发接口的回调,从而输出相应的日志信息。

4.3 触发回调接口

对接口进行改造,在调用获取order的接口逻辑中增加一个时间休眠,在远程调用的user逻辑中,也增加一个休眠时间,这样可以放大问题的发生,触发告警规则;

public Map getById(String id) {log.info("[订单服务] 基于 id 查询订单详情:{}", id);Map map = new HashMap();Order order = new Order();order.setOrderId("0002");order.setProductId("0001");order.setProductName("小米手机");map.put("order",order);try {Thread.sleep(2000);} catch (InterruptedException e) {log.error("thread sleep error");}User user = userFeignService.getById("001");map.put("user",user);return map;
}

调用的user接口逻辑

public User getById(String id) {try {Thread.sleep(2000);} catch (InterruptedException e) {log.error("thread sleep error");}log.info("[用户服务] 基于 id 查询用户信息:{}", id);String key = "sw:users:" + id;Object json = redisTemplate.opsForValue().get(key);if (json != null) {log.info("[用户服务] redis 中查询到用户信息:key={}, json={}", key, json);return JSON.parseObject(json.toString(), User.class);}User user = userMapper.getById(id);if (user != null) {log.info("[用户服务] redis 中不存在,从数据库查到数据并缓存:{}", user);redisTemplate.opsForValue().set(key, user, 2, TimeUnit.HOURS);return user;}log.warn("[用户服务] 基于 id 查询用户失败,用户不存在:{}", id);return null;
}

启动两个服务,然后调用一下接口,由于调用超时,最后接口响应异常,在控制台的日志中也可以看到详细的信息;

4.3.1 告警信息展示

为了让告警的规则被触发从而将信息展示到UI界面,可以在2分钟内多调用几次接口,而后再在控制台的告警一栏,就能看到展示的告警日志信息了,如下,详细展示了异常的详细链路信息。

也可以点击到某个具体的服务节点查看异常详情

通过上面的示例,演示了如何通过配置webhook进行异常告警的详细过程,事实上,在真实的场景下,将日志投射到界面只是一方面,方便运维回溯异常过程,更通用的诉求是,在触发了告警规则之后,能够将告警信息快速通知到相关的人员,比如通过邮件、短信等方式。这就可以在上述的回调接口中增加对接邮件或短信,或其他通知服务即可。

五、告警通知接入钉钉

在实际工作中,钉钉在企业内部使用的非常多,而SkyWalking也正好支持告警通知接入钉钉,通过将告警通知接入钉钉,严格来说接入钉钉群机器人,当告警规则被触发时,群里将会收到消息通知,方便我们快速响应,官方文档 钉钉接入文档

下面来演示告警规则如何接入钉钉机器人。

5.1 设置钉钉机器人

由于钉钉机器人目前只支持群设置,因此需要先创建一个钉钉群,然后找到下面自定义Webhook的位置进行配置。

添加钉钉机器人,如下

安全设置中,勾选加签(拷贝和保存加签后面生成的密钥串,后面配置Webhook时使用)

最后生成机器人(同样拷贝下Webhook的完整地址并保存一下,后面会用到)

5.2 告警规则配置钉钉机器人

拷贝官网提供的配置信息到alarm-settings.yml中,如下:

然后将上一步中的密钥信息和Webhook地址替换到url和secret中即可,注意信息的保密

5.3 效果测试验证

配置完成后,重启SkyWalking服务,然后再次访问一下上面的接口,多访问几次之后,在UI界面上能看到异常的信息

然后在钉钉群里,就能看到相应的通知告警信息了

上面演示了接入钉钉机器人的过程,其他类型的Webhook配置方式流程大致如此,如果有需要可以查阅官网步骤进行操作即可。

5.4 告警通知注意事项

5.4.1 合理设置告警规则

配置告警规则、设置告警阈值时,需根据实际需求合理设置,避免误报或漏报。以下是一些注意事项:

  • 确定监控指标,在设置告警规则之前,需明确要监控的指标,这些指标应该是对系统性能和稳定性有重要影响的关键指标。比如可以监控系统的响应时间、吞吐量、错误率等;
  • 设置合理的阈值 ,设置告警规则时,需根据系统实际情况设置合理的阈值。阈值应该能够反映系统正常运行的状态,同时也要能够及时发现潜在的问题,过高或过低的阈值都可能导致误报或漏报;
  • 考虑系统负载和峰值情况 ,设置告警规则和阈值时,需考虑系统负载和峰值情况。例如,在系统峰值期间,可能会出现一些短暂的性能下降或错误增加的情况,这些情况不一定需要触发告警;

5.4.2 配置合理的告警通知方式和接收人员

在配置告警通知方式和接收人员时,需要确保正确配置,并且通知能够及时到达,下面是一些注意事项:

  • 在选择告警通知方式时,要根据实际情况进行选择,常用的告警通知方式像邮件、短信、钉钉、飞书等。根据团队的工作习惯和接收方式,选择合适的通知方式;
  • 配置正确的接收人员,在配置告警通知时,需要确保配置接收人员的联系方式准确无误,通知应该发送给能够及时处理问题的人员,避免延误系统异常处理时间;
  • 测试告警通知,在配置完成后,建议进行测试,确保告警通知能够正常发送和接收,可以通过模拟触发告警的方式,验证告警通知的可用性;

5.4.3 定期检查和更新配置

告警规则配置是一个动态过程,随着系统的综合性能越来越好,早期配置的告警规则可能并不能满足当前的状况,因此需要定期检查和更新。以下是一些注意事项:

  • 定期评估告警规则和阈值的有效性,根据系统实际情况逐步调整和优化。随着系统的发展和变化,可能需要更新告警规则和阈值,以适应新的需求和情况;

  • 定期处理告警反馈和建议,根据使用者的反馈和建议进行优化和改进,可以帮助改进告警功能的准确性和可用性;

  • 定期备份告警配置,以防止配置丢失或损坏,备份可以帮助恢复配置,并在需要时进行回滚;

六、写在文末

本文详细介绍了SkyWalking自定义告警规则的详细使用,并结合实际操作完成了对Webhook的配置演示与效果模拟,SkyWalking的告警功能在实际生产运行过程中可以帮助及时发现系统中的异常情况,从而提升系统问题的发现及时率,提升问题的处理效率,从而提高系统的稳定性和可靠性。通过合理的配置告警规则,可以让系统时刻处于我们的掌控之中。本篇到此结束,感谢观看。

相关文章:

【微服务】skywalking自定义告警规则使用详解

目录 一、前言 二、SkyWalking告警功能介绍 2.1 SkyWalking告警是什么 2.2 为什么需要SkyWalking告警功能 2.2.1 及时发现系统异常 2.2.2 保障和提升系统稳定性 2.2.3 避免数据丢失 2.2.4 提高故障处理效率 三、 SkyWalking告警规则 3.1 SkyWalking告警规则配置 3.2 …...

BUGKU-WEB 矛盾

题目描述 进入场景看看&#xff1a; 代码如下&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }解题思路 需要读懂一下这段PHP代码的意思明显是一道get相关的题目&#xff0c;需要提供一个num的参数,然后需要传入一个不…...

2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口

文章目录 1 创建窗口类2 显示窗口3 窗口事件回调函数4 窗口中常用的生命周期函数5 编辑器窗口类中的常用成员6 小结 1 创建窗口类 ​ 当想为 Unity 拓展一个自定义窗口时&#xff0c;只需实现继承 EditorWindow 的类即可&#xff0c;并在该类的 OnGUI 函数中编写面板控件相关的…...

Python 读取pdf文件

Python 实现读取pdf文件简单示例。 安装命令 需要安装操作pdf的三方类库&#xff0c;命令如下&#xff1a; pip install pdfminer3K 安装过程如下&#xff1a; 引入类库 需要引入很多的类库。 示例如下&#xff1a; import sys import importlib importlib.reload(sys)fr…...

人究其一生只是在通用智能模型基础上作微调和对齐

Yann LeCun 在 WGS 上说&#xff1a; 目前的LLM不可能走到AGI&#xff0c;原因很简单&#xff0c;现在训练这些LLM所使用的数据量为10万亿个令牌&#xff0c;也就是130亿个词&#xff0c;如果你计算人类阅读这些数据需要多长时间&#xff0c;一个人每天阅读8小时&#xff0c;需…...

DS:二叉树的链式结构及实现

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、前言 前期我们解释过二叉树的顺序结构&#xff08;堆&#xff09;为什么比较适用于完全二叉树&#xff0c;因为如果用数组来实现非完全二叉树&#xff0c;那么数组的中间部分就可能会存在大量的空间浪费。 …...

PhP+vue企业原材料采购系统_cxg0o

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;原材料采购系统以互联网为基础&#xff0c;利用php技术&#xff0c;结合vue框架和MySQL数据库开发设计一套原材料采购系统&#xff0c;提高工作效率的…...

C++线程池

原因 如果线程的数量很多&#xff0c;频繁的创建和销毁线程会降低系统的效率。线程池可以使线程复用。 using typedef 内联函数和宏定义区别&#xff1a; 内联函数代替部分#define宏定义&#xff1b;代替普通函数&#xff0c;提高程序效率...

SpringCloud-Hystrix:服务熔断与服务降级

8. Hystrix&#xff1a;服务熔断 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系&#xff0c;每个依赖关系在某些时候将不可避免失败&#xff01; 8.1 服务雪崩 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服…...

浅谈Linux环境

冯诺依曼体系结构&#xff1a; 绝大多数的计算机都遵守冯诺依曼体系结构 在冯诺依曼体系结构下各个硬件相互配合处理数据并反馈结果给用户 其中控制器和运算器统称为中央处理器&#xff08;CPU&#xff09;&#xff0c;是计算机硬件中最核心的部分&#xff0c;像人类的大脑操控…...

Spring 用法学习总结(一)之基于 XML 注入属性

百度网盘&#xff1a; &#x1f449; Spring学习书籍链接 Spring学习 1 Spring框架概述2 Spring容器3 基于XML方式创建对象4 基于XML方式注入属性4.1 通过set方法注入属性4.2 通过构造器注入属性4.3 使用p命名空间注入属性4.4 注入bean与自动装配4.5 注入集合4.6 注入外部属性…...

免费软件推荐-开源免费批量离线图文识别(OCR)

近期要批量处理图片转电子化&#xff0c;为了解决这个世纪难题&#xff0c;试了很多软件&#xff08;华为手机自带OCR识别、 PandaOCR、天若OCR、Free OCR&#xff09;等软件&#xff0c;还是选择了这一款&#xff0c;方便简单 一、什么是OCR? 光学字符识别&#xff08;Opt…...

2 scala集合-元组和列表

1 元组 元组也是可以存放不同数据类型的元素&#xff0c;并且最重要的是&#xff0c;元组中的元素是不可变的。 例如&#xff0c;定义一个元组&#xff0c;包含字符串 hello&#xff0c;数字 20。如果试图把数字 20 修改为 1&#xff0c;则会报错。 scala> var a ("…...

Spring Boot开启SSL/Https进行交互。

为2个springboot工程开启进行SSL进行交互的认证步骤 //哪个犬玩意举报我侵权的? 一、认证步骤 1、 为服务器生成证书 keytool -genkey -v -alias testServer -keyalg RSA -keystore E:\ssl\testServer.p12 -validity 36500 2、 为客户端生成证书 keytool -genkey -v -alias…...

88.Go设计优雅的错误处理

文章目录 导言一、Go 的约定二、简单错误创建1、 errors.New()2、fmt.Errorf() 三、哨兵错误四、对错误进行编程1、优雅的错误处理设计2、与错误有关的的API 五、总结 导言 在 75.错误码设计、实现统一异常处理和封装统一返回结果 中&#xff0c;我们介绍了错误码的设计&#…...

Python4Delphi: Delphi 程序使用 Python 抓取网页

想用程序去抓取一个网页的内容&#xff0c;Delphi 有自己的 HTTP 库。比如 Indy 的 TIdHTTP&#xff0c;或者 TNetHTTPClient。 这里测试一下使用 Python 的 HTTP 库抓取网页&#xff0c;然后把抓取的内容给 Delphi 的程序。 Delphi 程序&#xff0c;界面上拖控件如下&#x…...

编辑器Zed

什么是Zed 官网&#xff1a;https://zed.dev/ Zed 是 Atom 编辑器原作者主导的新项目 —— 一款支持多人协作的代码编辑器&#xff0c;底层采用 Rust&#xff0c;且默认支持 Rust&#xff0c;还自带了 rust-analyzer&#xff0c;主打 “高性能”&#xff0c;颜值也十分在线&a…...

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结&#xff1a; 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准&#xff0c;大家在实现时&#xff0c;只要符合规范标准&#xff0c;就可以通用。 在Java中&#xff0c;接口可以看成…...

【计算机网络】计算机软件工程人工智能研究生复试资料整理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序? 序列号:TCP所传送的每段数据都有标有序列号,避免乱序问题发送端确认应答、超时重传:解决丢包问题滑动窗口:避免…...

【Network Management】AUTOSAR架构下CanNm User Data详解

目录 前言 正文 1.CanNm user data概念 2.CanNm user data配置 2.1CDD方式访问CanNm user data...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...