SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信

SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信
在这里插入图片描述
👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!

文章目录

SkyWalking - 告警通知渠道集成:Webhook、Slack、钉钉、企业微信

在现代微服务架构和云原生应用中,可观测性(Observability)已成为保障系统稳定性和快速故障定位的关键能力。Apache SkyWalking 作为一款开源的 APM(Application Performance Monitoring)系统,凭借其强大的分布式追踪、指标监控和拓扑分析能力,被广泛应用于各类复杂系统中。然而,仅仅收集和展示数据是远远不够的——当系统出现异常时,及时、准确地将告警信息通知到相关责任人,才是实现“主动运维”的核心环节。

SkyWalking 内置了灵活的告警机制,支持通过多种渠道发送告警通知,包括 Webhook、Slack、钉钉(DingTalk)、企业微信(WeCom)等。本文将深入探讨如何配置和集成这些通知渠道,帮助你构建一个高效、可靠的告警响应体系。我们将从基础概念讲起,逐步深入到具体配置、自定义 Webhook 开发、以及最佳实践建议,并辅以丰富的 Java 代码示例和清晰的流程图,助你轻松掌握 SkyWalking 告警通知的精髓。

🚨 SkyWalking 告警机制基础

在深入集成细节之前,我们首先需要理解 SkyWalking 告警机制的基本工作原理。SkyWalking 的告警功能主要由 告警规则(Alarm Rules)通知渠道(Notifiers) 两部分组成。

告警规则(Alarm Rules)

告警规则定义了“在什么条件下触发告警”。这些规则基于 SkyWalking 收集的各类指标(如服务响应时间、错误率、吞吐量等)进行判断。规则通常包含以下要素:

  • 指标名称(Metrics Name):要监控的具体指标,例如 service_resp_time(服务平均响应时间)、service_sla(服务成功率)等。
  • 阈值(Threshold):触发告警的临界值。例如,service_resp_time > 1000 表示当服务平均响应时间超过 1000 毫秒时触发。
  • 周期(Period):规则检查的时间窗口,单位为分钟。例如,period: 10 表示在过去 10 分钟内持续满足条件才触发。
  • 标签(Tags):用于更精细地过滤告警对象,例如只对特定的服务或实例生效。
  • 告警消息模板(Message Template):定义告警通知的内容格式。

SkyWalking 的告警规则配置文件通常位于 config/alarm-settings.yml 中。一个简单的规则示例如下:

rules:# 规则名称service_resp_time_rule:# 监控的指标名metrics-name: service_resp_time # 阈值,单位毫秒threshold:1000# 检查周期(分钟)period:10# 在周期内,有多少次检查超过阈值才触发告警count:3# 告警级别severity: WARNING # 告警消息模板message:"服务 {name} 的平均响应时间在过去 {period} 分钟内超过了 {threshold}ms"

通知渠道(Notifiers)

当告警规则被触发后,SkyWalking 需要将告警信息发送出去。这就是通知渠道的作用。SkyWalking 本身不直接实现所有渠道的发送逻辑,而是通过 Webhook 机制作为核心枢纽。对于 Slack、钉钉、企业微信等第三方平台,SkyWalking 提供了内置的 Webhook 集成,你只需提供对应的 Webhook URL 即可。

整个告警流程可以概括为:

  1. SkyWalking OAP Server 持续收集和分析来自 Agent 的数据。
  2. 根据 alarm-settings.yml 中定义的规则,定期评估指标是否达到告警条件。
  3. 一旦条件满足,OAP Server 会生成一条告警事件。
  4. OAP Server 调用配置好的通知渠道(如 Webhook、Slack 等),将告警事件以 JSON 格式发送出去。
  5. 第三方服务(如 Slack、钉钉机器人)接收到 Webhook 请求后,解析内容并推送给用户。

下面,我们将逐一介绍如何集成这四种主流的通知渠道。

🔗 Webhook:最通用的集成方式

Webhook 是一种轻量级的、基于 HTTP 的回调机制。它允许一个应用在特定事件发生时,向另一个应用的 URL 发送一个 POST 请求。在 SkyWalking 的告警场景中,OAP Server 就是 Webhook 的发送方,而你的自定义服务就是接收方。

配置 SkyWalking 使用 Webhook

config/alarm-settings.yml 文件中,找到 webhook 配置项。你可以配置一个或多个 Webhook URL。

webhook:# 可以配置多个 Webhook 地址- http://your-webhook-service:8080/skywalking-alarm - https://another-webhook-endpoint.com/notify 

Webhook 接收端开发(Java 示例)

接下来,我们需要创建一个简单的 Spring Boot 应用来接收 SkyWalking 发送的告警。这个应用的核心是一个处理 POST 请求的 Controller。

首先,添加必要的依赖(pom.xml):

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies>

然后,定义一个 POJO 来映射 SkyWalking 发送的告警 JSON 结构。根据 SkyWalking 官方文档,告警消息的结构大致如下:

importjava.util.List;publicclassAlarmMessage{// 告警消息内容privateString message;// 告警时间(时间戳)privatelong alarmTime;// 告警级别privateString severity;// 触发告警的实体(如服务名、实例名等)privateList<Scope> scope;// 触发告警的规则名称privateString ruleName;// Getters and SetterspublicStringgetMessage(){return message;}publicvoidsetMessage(String message){this.message = message;}publiclonggetAlarmTime(){return alarmTime;}publicvoidsetAlarmTime(long alarmTime){this.alarmTime = alarmTime;}publicStringgetSeverity(){return severity;}publicvoidsetSeverity(String severity){this.severity = severity;}publicList<Scope>getScope(){return scope;}publicvoidsetScope(List<Scope> scope){this.scope = scope;}publicStringgetRuleName(){return ruleName;}publicvoidsetRuleName(String ruleName){this.ruleName = ruleName;}publicstaticclassScope{privateString name;privateString id;privateString type;// e.g., SERVICE, INSTANCE// Getters and SetterspublicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetId(){return id;}publicvoidsetId(String id){this.id = id;}publicStringgetType(){return type;}publicvoidsetType(String type){this.type = type;}}}

现在,创建一个 Controller 来处理告警请求:

importorg.springframework.web.bind.annotation.*;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.util.List;@RestController@RequestMapping("/skywalking")publicclassSkyWalkingAlarmController{privatestaticfinalLogger logger =LoggerFactory.getLogger(SkyWalkingAlarmController.class);/** * 接收 SkyWalking 的告警 Webhook * @param alarmMessages SkyWalking 发送的告警消息列表 */@PostMapping("/alarm")publicvoidreceiveAlarm(@RequestBodyList<AlarmMessage> alarmMessages){for(AlarmMessage alarm : alarmMessages){ logger.info("Received SkyWalking alarm: {}", alarm.getMessage());// 在这里,你可以执行任何自定义逻辑// 例如:记录到数据库、发送邮件、调用其他内部系统等// 示例:根据告警级别决定处理方式if("CRITICAL".equals(alarm.getSeverity())){triggerPagerDuty(alarm);}else{sendToInternalChat(alarm);}}}privatevoidtriggerPagerDuty(AlarmMessage alarm){// 模拟触发 PagerDuty 的逻辑 logger.warn("CRITICAL ALARM! Triggering PagerDuty for: {}", alarm.getMessage());}privatevoidsendToInternalChat(AlarmMessage alarm){// 模拟发送到内部聊天工具 logger.info("Sending to internal chat: {}", alarm.getMessage());}}

启动这个 Spring Boot 应用后,确保 SkyWalking OAP Server 能够访问到 http://your-webhook-service:8080/skywalking/alarm 这个地址。当告警触发时,你就能在应用的日志中看到接收到的消息。

Webhook 集成的优势与注意事项

  • 优势
    • 高度灵活:你可以完全控制告警的后续处理逻辑,集成任何内部系统。
    • 解耦:SkyWalking 只需负责发送,不关心接收方的具体实现。
    • 通用性强:几乎所有现代系统都支持 Webhook。
  • 注意事项
    • 网络可达性:确保 OAP Server 能访问你的 Webhook 服务。
    • 幂等性:由于网络问题,Webhook 请求可能会重试,你的接收端应设计为幂等的,避免重复处理。
    • 安全性:考虑在 Webhook URL 上增加认证(如 Token),防止未授权的调用。SkyWalking 也支持在 Webhook 配置中添加 Headers。
webhook:-url: http://your-webhook-service:8080/skywalking-alarm headers:-Authorization: Bearer your-secret-token -X-Custom-Header: custom-value 

通过 Webhook,我们为 SkyWalking 告警打开了通往无限可能的大门。接下来,我们将看看如何利用 SkyWalking 内置的支持,快速集成几个流行的即时通讯工具。

💬 集成 Slack 通知

Slack 是全球范围内广泛使用的团队协作工具,其强大的 Incoming Webhooks 功能使其成为接收系统告警的理想选择。SkyWalking 对 Slack 的集成非常直接,本质上也是通过 Webhook 实现的,但提供了更友好的配置方式。

在 Slack 中创建 Incoming Webhook

  1. 打开你的 Slack 工作区。
  2. 访问 Slack API Apps 页面
  3. 点击 “Create New App”,选择 “From scratch”。
  4. 为你的应用命名(例如 “SkyWalking Alert”),并选择要安装到的工作区。
  5. 在左侧菜单中,点击 “Incoming Webhooks”。
  6. 将 “Activate Incoming Webhooks” 切换为 On
  7. 向下滚动,点击 “Add New Webhook to Workspace”。
  8. 选择一个频道(例如 #alerts),然后点击 “Allow”。
  9. 复制生成的 Webhook URL,它看起来像这样:https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

配置 SkyWalking

将上一步复制的 Webhook URL 添加到 config/alarm-settings.ymlslackHooks 配置项中。

slackHooks:# 可以配置多个 Slack Webhook- https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX 

自定义 Slack 消息格式(可选)

默认情况下,SkyWalking 会发送一个包含告警信息的简单文本消息。如果你希望消息更美观、信息更丰富(例如使用 Slack 的 Blocks 或 Attachments),你需要使用前面介绍的 通用 Webhook 方式,并在你的接收服务中构造符合 Slack 格式的 JSON。

不过,对于大多数场景,SkyWalking 的默认格式已经足够清晰。一个典型的 Slack 告警消息如下:

[WARNING] Rule: service_resp_time_rule Service: user-service Message: 服务 user-service 的平均响应时间在过去 10 分钟内超过了 1000ms 

流程图:Slack 集成

POST JSON

SkyWalking OAP Server

Slack Incoming Webhook

Slack Server

Slack Channel #alerts

Team Members

通过以上几步,你的 SkyWalking 告警就能实时推送到 Slack 频道中,让团队成员第一时间知晓系统异常。

📱 集成钉钉(DingTalk)通知

钉钉是中国企业广泛使用的办公通讯和协同平台。与 Slack 类似,钉钉也提供了“自定义机器人”功能,用于接收外部系统的通知。SkyWalking 同样内置了对钉钉机器人的支持。

在钉钉中创建自定义机器人

  1. 打开钉钉桌面或手机客户端。
  2. 进入一个你希望接收告警的群聊。
  3. 点击群右上角的 “…” (更多) 按钮。
  4. 选择 “智能群助手”。
  5. 点击 “添加机器人”。
  6. 选择 “自定义” 机器人,点击 “添加”。
  7. 为机器人命名(例如 “SkyWalking 告警”),并设置安全验证方式(强烈建议选择“加签” 以提高安全性)。
  8. 复制生成的 Webhook 地址。它看起来像这样:https://oapi.dingtalk.com/robot/send?access_token=your_access_token
  9. 如果你选择了“加签”,请同时保存好生成的 密钥(Secret)

配置 SkyWalking

config/alarm-settings.yml 中,找到 dingtalkHooks 配置项。

dingtalkHooks:# 钉钉 Webhook URLwebhook: https://oapi.dingtalk.com/robot/send?access_token=your_access_token # 如果使用了“加签”安全设置,需要在这里配置密钥secret: your_dingtalk_robot_secret # 可选:@群里的所有人atAll:false

重要提示secret 字段仅在你在钉钉机器人设置中选择了“加签”时才需要填写。如果选择的是“IP 地址”或“关键词”白名单,则不需要 secret

钉钉消息格式

SkyWalking 会将告警信息封装成钉钉支持的 Markdown 消息格式,使得消息在钉钉中展示得更加清晰和专业。一个典型的钉钉告警消息会包含告警级别、规则名称、服务名和详细信息,并以不同颜色区分警告和严重级别。

流程图:钉钉集成

POST with Sign

SkyWalking OAP Server

DingTalk Custom Robot

DingTalk Server

DingTalk Group Chat

Team Members

通过钉钉集成,国内团队可以无缝地将 SkyWalking 告警融入到日常的办公沟通流中,极大地提升了告警的触达效率。

🏢 集成企业微信(WeCom)通知

企业微信(WeCom)是腾讯推出的企业级通讯与办公工具,在中国市场同样拥有庞大的用户基础。它也提供了“群机器人”功能来接收外部告警。

在企业微信中创建群机器人

  1. 打开企业微信客户端。
  2. 进入一个你希望接收告警的内部群聊。
  3. 点击群右上角的 “…” (更多) 按钮。
  4. 选择 “群机器人”。
  5. 点击 “新建机器人”。
  6. 为机器人命名(例如 “SkyWalking 监控”),并上传头像。
  7. 复制生成的 Webhook URL。它看起来像这样:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_webhook_key

配置 SkyWalking

config/alarm-settings.yml 中,找到 wechatHooks 配置项。

wechatHooks:# 企业微信 Webhook URLwebhook: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_webhook_key 

企业微信的群机器人目前主要通过 Webhook URL 进行身份验证,无需额外的密钥(除非你对企业微信后台有更复杂的权限控制)。

企业微信消息格式

SkyWalking 会将告警信息以文本消息的形式发送到企业微信群。虽然不如钉钉的 Markdown 格式丰富,但关键信息(如服务名、告警内容、时间)都会清晰呈现。

流程图:企业微信集成

POST

SkyWalking OAP Server

WeCom Group Robot

WeCom Server

WeCom Internal Group

Team Members

至此,我们已经完成了四种主流通知渠道的集成。无论你的团队使用哪种沟通工具,SkyWalking 都能确保告警信息及时送达。

🧠 高级主题:自定义告警内容与动态路由

虽然 SkyWalking 的内置集成非常方便,但在实际生产环境中,你可能需要更精细的控制。例如,你可能希望:

  • 根据告警的严重级别(severity)将告警发送到不同的渠道(如 CRITICAL 发送到 Slack,WARNING 发送到钉钉)。
  • 在告警消息中包含更多上下文信息,比如相关的 Trace ID 或日志片段。
  • 实现告警的去重、抑制或升级策略。

这些需求超出了 SkyWalking 内置通知器的能力范围,此时就需要回到我们最强大的武器——自定义 Webhook 服务

动态路由 Webhook 服务(Java 示例)

我们可以扩展之前的 Spring Boot Webhook 服务,实现一个智能的告警路由器。

// ... 其他 import@RestController@RequestMapping("/skywalking")publicclassSmartAlarmRouter{privatestaticfinalLogger logger =LoggerFactory.getLogger(SmartAlarmRouter.class);// 假设这些是你的配置,可以从配置中心读取privatefinalString slackWebhookUrl ="https://hooks.slack.com/services/...";privatefinalString dingtalkWebhookUrl ="https://oapi.dingtalk.com/robot/send?access_token=...";@PostMapping("/smart-alarm")publicvoidrouteAlarm(@RequestBodyList<AlarmMessage> alarmMessages){for(AlarmMessage alarm : alarmMessages){try{if("CRITICAL".equals(alarm.getSeverity())||"ERROR".equals(alarm.getSeverity())){// 严重告警发送到 SlacksendToSlack(alarm);}elseif("WARNING".equals(alarm.getSeverity())){// 警告发送到钉钉sendToDingTalk(alarm);}else{// 其他级别记录日志 logger.info("Low severity alarm, logged only: {}", alarm.getMessage());}}catch(Exception e){ logger.error("Failed to route alarm: {}", alarm.getMessage(), e);}}}privatevoidsendToSlack(AlarmMessage alarm)throwsException{// 构造 Slack 的消息体Map<String,Object> payload =newHashMap<>(); payload.put("text",String.format("[%s] %s\n%s", alarm.getSeverity(), alarm.getRuleName(), alarm.getMessage()));// 使用 RestTemplate 发送 POST 请求RestTemplate restTemplate =newRestTemplate(); restTemplate.postForEntity(slackWebhookUrl, payload,String.class); logger.info("Sent CRITICAL alarm to Slack");}privatevoidsendToDingTalk(AlarmMessage alarm)throwsException{// 构造钉钉的 Markdown 消息体Map<String,Object> content =newHashMap<>(); content.put("title","SkyWalking 告警"); content.put("text",String.format("### [%s] %s\n\n- **规则**: %s\n- **详情**: %s\n- **时间**: %s", alarm.getSeverity(), alarm.getMessage(), alarm.getRuleName(), alarm.getMessage(),newjava.util.Date(alarm.getAlarmTime())));Map<String,Object> markdown =newHashMap<>(); markdown.put("msgtype","markdown"); markdown.put("markdown", content);// 如果你的钉钉机器人有加签,这里需要计算签名// 为了简洁,此处省略签名计算逻辑RestTemplate restTemplate =newRestTemplate(); restTemplate.postForEntity(dingtalkWebhookUrl, markdown,String.class); logger.info("Sent WARNING alarm to DingTalk");}}

在这个示例中,我们的 Webhook 服务不再只是一个被动的接收者,而是一个主动的决策中心。它根据告警的严重程度,动态地选择最合适的通知渠道。这种模式极大地增强了告警系统的灵活性和适应性。

告警内容增强

另一个常见的需求是丰富告警内容。SkyWalking 的告警消息模板(message)是静态的。为了包含动态信息,比如一个慢请求的 Trace ID,你需要在规则中使用 SkyWalking 的 Dynamic Configuration 功能,或者在自定义 Webhook 服务中,根据告警中的服务名和时间范围,反向查询 SkyWalking 的 GraphQL API 来获取更多上下文。

例如,在 Webhook 服务中,你可以构造一个 GraphQL 查询,查找在告警时间点附近、响应时间最长的 Trace,并将其 ID 附加到最终的告警消息中。这需要你对 SkyWalking 的 GraphQL API 有一定了解,但这无疑是提升告警价值的关键一步。

🛡 最佳实践与避坑指南

成功集成告警渠道只是第一步,要构建一个真正可靠、高效的告警系统,还需要遵循一些最佳实践。

1. 避免告警风暴(Alert Storm)

这是告警系统中最常见的问题。当一个底层服务故障时,可能会引发上游数十甚至上百个服务的连锁告警,导致通知渠道被刷屏,真正的根因被淹没。

  • 解决方案
    • 合理设置告警规则:不要对所有指标都设置告警。聚焦于 SLO(Service Level Objective)相关的黄金指标(延迟、流量、错误、饱和度)。
    • 使用告警抑制:在自定义 Webhook 服务中实现逻辑,如果检测到某个核心服务已宕机,则暂时抑制对其依赖服务的告警。
    • 聚合告警:SkyWalking 本身会对相同规则、相同实体的告警进行一定程度的聚合。确保你的规则粒度合适。

2. 确保告警的可操作性

每一条告警都应该包含足够的信息,让值班人员能够立即采取行动。一个模糊的“服务响应慢”远不如“订单服务在 14:30-14:35 期间 P99 响应时间 > 2s,主要慢在调用库存服务”有用。

  • 解决方案
    • 精心设计告警消息模板:在 alarm-settings.yml 中,充分利用可用的变量(如 {name}, {value}, {period})。
    • 链接到详细视图:在自定义 Webhook 中,可以生成指向 SkyWalking UI 中对应服务或拓扑图的链接,并将其包含在告警消息中。

3. 告警渠道的可靠性

你的告警渠道本身也可能出问题。如果 Slack 服务不可用,你的告警就失效了。

  • 解决方案
    • 多渠道冗余:对于最高级别的告警(如 P0 故障),同时配置多个渠道(如 Slack + 邮件 + 电话呼叫)。
    • 监控告警渠道:让你的 Webhook 服务在发送失败时记录错误,并设置一个独立的监控项来检查 Webhook 服务的健康状态。

4. 安全性

Webhook URL 本质上是公开的入口点,必须加以保护。

  • 解决方案
    • 使用 Secret/Token:无论是 Slack、钉钉还是自定义 Webhook,都应启用并正确配置认证密钥。
    • 网络隔离:将 SkyWalking OAP Server 和你的 Webhook 服务部署在同一个受信任的网络内,或通过防火墙严格限制访问来源。

5. 测试!测试!再测试!

不要等到生产环境出问题才发现告警没发出来。

  • 解决方案
    • 模拟告警:SkyWalking 提供了 test-mode,可以在不触发真实规则的情况下,向配置的渠道发送测试消息。
    • 定期演练:建立定期的告警演练机制,确保整个链路畅通。

🎯 总结

通过本文的详细讲解,我们全面探索了 Apache SkyWalking 告警通知渠道的集成方法。从最通用的 Webhook,到针对 Slack、钉钉、企业微信的内置支持,再到高级的自定义路由和内容增强,我们一步步构建了一个强大而灵活的告警通知体系。

记住,告警不是目的,快速恢复业务才是。一个优秀的告警系统应该像一位经验丰富的哨兵,只在真正需要你关注的时候才发出清晰、准确、可操作的信号,而不是在深夜用无意义的噪音将你惊醒。通过合理配置 SkyWalking 的告警规则,并结合本文介绍的渠道集成技巧,你完全有能力打造出这样一个值得信赖的哨兵。

现在,就去检查你的 alarm-settings.yml 文件,优化你的告警规则,并为你的团队选择最合适的告警渠道吧!🚀


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Read more

Spring Boot 数据缓存与性能优化

Spring Boot 数据缓存与性能优化

Spring Boot 数据缓存与性能优化 23.1 学习目标与重点提示 学习目标:掌握Spring Boot数据缓存与性能优化的核心概念与使用方法,包括数据缓存的定义与特点、Spring Boot与数据缓存的集成、Spring Boot与数据缓存的配置、Spring Boot与数据缓存的基本方法、Spring Boot的实际应用场景,学会在实际开发中处理数据缓存与性能优化问题。 重点:数据缓存的定义与特点、Spring Boot与数据缓存的集成、Spring Boot与数据缓存的配置、Spring Boot与数据缓存的基本方法、Spring Boot的实际应用场景。 23.2 数据缓存概述 数据缓存是Java开发中的重要组件。 23.2.1 数据缓存的定义 定义:数据缓存是一种存储机制,用于将常用数据存储在高速存储设备中,以便快速访问。 作用: * 提高应用程序的性能。 * 减少数据库的访问次数。 * 提高用户体验。 常见的数据缓存: * EhCache:Apache EhCache是一款开源的缓存库。 * Caffeine:

By Ne0inhk
前端小练习——星辰宇宙(JS没有上限!!!)

前端小练习——星辰宇宙(JS没有上限!!!)

前言:在刚开始学习前端的时候,我们会学习到前端三件套中的JavaScript,可能那时候读者没有觉得JavaScript这个语言有多么的牛逼,本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-ZEEKLOG博客 先让我们看一下最终的结果: 在开始讲解这个炫酷的案例之前,先让我们了解一下本案例所需的前置知识: Three.js:一个用于创建和显示3D图形的JavaScript库。代码中导入了Three.js的核心库和轨道控制库(OrbitControls),用于处理3D场景的创建和相机控制。WebGL:用于在网页中绘制3D图形的底层API。Three.js封装了WebGL,使得3D渲染变得更简单。模块化 JavaScript:使用 ES6 的模块导入语法 (import) 引入外部库,使代码结构更加清晰。着色器编程:自定义顶点和片段着色器,通过 onBeforeCompile 方法替换默认着色器,控制点的大小、颜色和运动效果。缓冲几何体:

By Ne0inhk

PyWebIO动态表格实战(数据刷新黑科技)

第一章:PyWebIO动态表格入门 PyWebIO 是一个轻量级的 Python 库,允许开发者无需前端知识即可快速构建交互式 Web 界面。在数据展示场景中,动态表格是核心组件之一,能够以结构化方式呈现实时数据,并支持用户交互操作。 基础表格渲染 使用 PyWebIO 的 put_table() 函数可以轻松创建表格。每一行由列表构成,单元格内容可包含文本、按钮或其他组件。 from pywebio.output import put_table from pywebio.session import hold # 渲染一个简单的用户信息表 put_table([ ['姓名', '年龄', '城市'], ['Alice', '

By Ne0inhk

前端 + agent 开发学习路线

背景:团队启动Agent项目,从零开始学习工程化AI开发 感谢ai老师写的学习指南。存档! 引言:从困惑到清晰 最近团队要启动Agent项目,我第一次接触这个概念时,只停留在“接入大模型API+优化Prompt”的浅层理解。经过大量学习和实践探索,我才发现工程化Agent开发是系统化的架构设计,而不仅仅是API调用。 这篇文章记录我从前端视角出发,探索Agent工程化开发的学习路径和实践经验。如果你也是前端/全栈开发者,想要在AI时代找到自己的定位,这篇指南应该能帮到你。 一、认知重塑:什么是工程化Agent? 1.1 我的错误认知 vs 现实 我原来的理解: Agent = 大模型API + Prompt优化 实际上的工程化Agent: Agent = 系统架构 + 可控执行 + 安全审查 + 领域适配 + 可观测性 1.2 Agent的分层架构(医疗场景示例) 你的主战场 任务分解器 工具路由器 记忆管理器 状态监控器

By Ne0inhk