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

2003访问网站提示输入用户名密码/seo是什么职业

2003访问网站提示输入用户名密码,seo是什么职业,做视频特技的网站,专门做孕婴用品的网站目录: 分布式链路追踪-SkyWalking为什么需要链路追踪什么是SkyWalkingSkyWalking核心概念什么是探针Java AgentJava探针日志监控实现之环境搭建Java探针日志监控实现之探针实现编写探针类TestAgent搭建 ElasticsearchSkyWalking服务环境搭建搭建微服务微服务接入Sky…

目录:

  • 分布式链路追踪-SkyWalking
    • 为什么需要链路追踪
    • 什么是SkyWalking
    • SkyWalking核心概念
    • 什么是探针Java Agent
    • Java探针日志监控实现之环境搭建
    • Java探针日志监控实现之探针实现
    • 编写探针类TestAgent
    • 搭建 Elasticsearch
    • SkyWalking服务环境搭建
    • 搭建微服务
    • 微服务接入SkyWalking探针
    • SkyWalking日志
    • SkyWalioking告警
    • Skywalking自定义告警规则
    • SkyWalking网络钩子Webhooks
    • SkyWalking短信通知
    • SkyWalking邮件告警

在这里插入图片描述

分布式链路追踪-SkyWalking

在这里插入图片描述

为什么需要链路追踪

在这里插入图片描述
在这个微服务系统中,用户通过浏览器的 H5页面访问系统,这个用户请求会先抵达微服务网关组件,然后网关再把请求分发给各个微服务。所以你会发现,用户请求从发起到结束要经历 很多个微服务的处理,这里面还涉及到消息组件的集成。

在这里插入图片描述
存在的问题:

  • 服务之间的依赖与被依赖的关系如何能够清晰的看到?
  • 出现异常时如何能够快速定位到异常服务?
  • 出现性能瓶颈时如何能够迅速定位哪个服务影响的?

链路
可以将链路理解为物理电路图

  • 链路和电路图都有起点和终点。
  • 链路和电路图都通过可视化得技术手段,来模拟真实组件得运行轨迹。
  • 链路和电路图都非常复杂,并且随着系统复杂程度得增加,其可视化复杂度也会成几何倍数增加。
    在这里插入图片描述

解决:

为了能够在分布式架构中快速定位问题,分布式链路追踪应运而生。将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

常见链路追踪技术有那些
市面上有很多链路追踪的项目,其中也不乏一些优秀的,如下:

  • Sleuth:SpringCloud 提供的分布式系统中链路追踪解决方案。很可惜的是阿里系并没有链路追踪相关的开源项目,我们可以采用Spring Cloud Sleuth+Zipkin来做链路追踪的解决方案。

  • zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth使用较为简单, 集成很方便, 但是功能较简单。

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

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

什么是SkyWalking

SkyWalking是开源的可观测平台,主要用于收集,分析,聚合和可视化服务和云原生基础设施的数据。Skywalking提供了一种简单得方式来维护分布式系统得视图关系。
在这里插入图片描述
SkyWalking
SkyWalking是开源的一款分布式追踪,分析,告警的工具,现已属于Apache旗下开源项目, SkyWalking为服务提供了自动探针代理,将数据通过gRPC或者HTTP传输给后端平台,后端平台将数据存储在Storage中,并且分析数据将结果展示在UI中。
在这里插入图片描述
优点:

  • 多种监控手段多语言自动探针,Java,.NET Core 和 Node.JS
  • 轻量高效,不需要大数据
  • 模块化,UI、存储、集群管理多种机制可选,
  • 支持告警
  • 社区活跃

缺点:

较为新兴,成熟度不够高

SkyWalking核心概念

在这里插入图片描述

注意:

  • 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持
    SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent
    收集 SkyWalking Tracing 数据,传递给服务器。
  • 下部分 SkyWalking OAP :负责接收 Agent 发送的
    Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query
    )功能。
  • 左部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2
    多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
  • 右部分SkyWalking UI :负责提供控台,查看链路等等。

什么是探针Java Agent

探针产生的背景

在开发过程中,开发人员经常会使用IDEA的Debug功能(包含本地和远程)调试应用,在JVM进程期间获取应用运行的JVM信息,变量信息等。这些个技术通过Java Agent来实现的,那么Java Agent到底是啥,为啥这么吊?

哪里有Java Agent:

  • idea得Debug功能
  • 热部署 JRebel
  • 各种线上诊断工具
  • 代码覆盖率工具
  • 性能分析

什么是探针

Java Agent 又叫做 Java 探针,是在 JDK1.5 引入的一种可以动态修改 Java 字节码的技术。Java 类编译之后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码信息,并且通过字节码转换器对这些字节码进行修改,来完成一些额外的功能。

Java探针工具技术原理
在这里插入图片描述

流程

  • 在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时;
  • 将监控的相关方法 和 耗时及内部调用情况,按照顺序放入处理器;
  • 处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中;
  • 然后区分出耗时的业务,转化为xml格式进行解析和分析。

Java探针日志监控实现之环境搭建

引入依赖

  <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

编写HelloController

@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "hello agent";}
}

打包SpringBoot项目
在这里插入图片描述

Java探针日志监控实现之探针实现

如何使用Java Agent
JDK1.5引入了java.lang.instrument包,开发者可以很方便的实现字节码增强。其核心功能由java.lang.instrument.Instrumentation接口提供。

Instrumentation 有两种使用方式:

  • 在应用运行之前,通过premain()方法来实现,在应用启动时侵入并代理应用。
  • 在应用运行之后,通过调用Attach AP和agentmain()方法来实现

注意

javassist是一个库,实现ClassFileTransformer接口中的transform()方法。ClassFileTransformer
这个接口的目的就是在class被装载到JVM之前将class字节码转换掉,从而达到动态注入代码的目的。

新建Maven项目javaagentdemo
Pom引入依赖

  <dependencies><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.22.0-GA</version></dependency></dependencies><build><finalName>javaagent</finalName><plugins><!--META-INF 下 MANIFEST.MF 文件 内容Manifest-Version: 1.0Premain-Class: com.jenson.TestAgent下面Maven插件可以自动实现--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.0.0</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><manifestEntries><Premain-Class>com.itbaizhan.PreMainTraceAgent</Premain-Class></manifestEntries></transformer></transformers></configuration></execution></executions></plugin></plugins></build>

编写探针类TestAgent

package com.jenson;import java.lang.instrument.Instrumentation;/*** @author Jenson*/
public class TestAgent {/*** 在main方法运行前,与main方法运行于同一JVM中** @param agentArgs agentArgs是premain函数得到的程序参数,随同"-javaagent"一同传入,*          与main函数不同的是,该参数是一个字符串而不是一个字符串数组,*          如果程序参数有多个,程序将自行解析这个字符串* @param inst    一个java.lang.instrument.Instrumentation实例,由JVM自动传入,*          java.lang.instrument.Instrumentation是instrument包中的一个接口,*          也是核心部分,集中了其中几乎所有的功能方法,例如类定义的转换和操作*/public static void premain(String agentArgs, Instrumentation inst) {System.out.println("==============premain1 执行===================");System.out.println("agentArgs : " + agentArgs);// 添加Transformerinst.addTransformer(new TestTransformer());}
}

编写TestTransformer

/*** @author Jenson*/
public class TestTransformer implements ClassFileTransformer {public final String TEST_CLASS_NAME = "com.jjy.controller.HelloController";public final String METHOD_NAME = "hello";public byte[] transform(ClassLoader loader,String className,Class<?> classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer) throws IllegalClassFormatException {//    System.out.println("className : " + className);String finalClassName = className.replace("/", ".");if (TEST_CLASS_NAME.equals(finalClassName)) {System.out.println("class name 匹配上了 !");CtClass ctClass;try {ctClass = ClassPool.getDefault().get(finalClassName);System.out.println("ctClass is OK !");CtMethod ctMethod = ctClass.getDeclaredMethod(METHOD_NAME);System.out.println("CtMethod is OK !");ctMethod.insertBefore("System.out.println(\"字节码添加成功,打印日志 !\");");return ctClass.toBytecode();} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}}return null;}
}

项目测试打包
在这里插入图片描述
添加javaagent启动参数

java -javaagent:agent路径 -jar 项目名.jar
在这里插入图片描述
启动,打印出日志
在这里插入图片描述
发送请求http://localhost:8080/hello
在这里插入图片描述

搭建 Elasticsearch

在这里插入图片描述

  1. 准备一台搭载有CentOS7系统的虚拟机,使用XShell连接虚拟机

  2. 关闭防火墙,方便访问ES

#关闭防火墙:
systemctl stop firewalld.service#禁止防火墙自启动:
systemctl disable firewalld.service
  1. 配置最大可创建文件数大小
#打开系统文件:
vim /etc/sysctl.conf#添加以下配置:
vm.max_map_count=655360#配置生效:
sysctl -p
  1. 由于ES不能以root用户运行,我们需要创建一个非root用户,此处创建一个名为es的用户:
#创建用户:
useradd es

安装服务

  1. 使用rz命令将linux版的ES上传至虚拟机

  2. 解压ES

#解压:
tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz#重命名:
mv elasticsearch-8.10.4 elasticsearch1#移动文件夹:
mv elasticsearch1 /usr/local/#es用户取得该文件夹权限:
chown -R es:es /usr/local/elasticsearch1
  1. 启动ES服务:
#切换为es用户:
su es#进入ES安装文件夹:
cd /usr/local/elasticsearch1/bin/#启动ES服务:
./elasticsearch 

SkyWalking服务环境搭建

在这里插入图片描述
前置条件

  • 安装jdk17
  • 安装Elasticsearch

下载SkyWalking包
在这里插入图片描述
解压SkyWalking包

tar -zxvf apache-skywalking-apm-9.7.0.tar.gz -C /usr/local/

SkyWalking包目录介绍
在这里插入图片描述

介绍:

  • webapp: Ul前端(web 监控页面)的jar包和配置文件
  • oap-libs:后台应用的jar包,以及它的依赖jar包
  • config:启动后台应用程序的配置文件,是使用的各种配置
  • bin:各种启动脚本,一般使用脚本startup.*来启动web页面和对应的后台应用
  • agent:代理服务jar包

修改配置文件
修改/usr/local/apache-skywalking-apm-bin/config/application.yml
在这里插入图片描述
启动 SkyWalking OAP 服务

bin/oapService.sh
SkyWalking OAP started successfully!

是否真正启动成功,打开 logs/skywalking-oap-server.log 日志文件,查看是否有错误日志。 首次启动时,因为 SkyWalking OAP 会创建 Elasticsearch 的索引,所以会“疯狂”的打印日志。

友情提示:

因为首次启动会创建 Elasticsearch 索引,所以可能会比较慢。

最终,我们看到如下日志,基本可以代表 SkyWalking OAP 服务启动成功:
在这里插入图片描述
启动 SkyWalking UI 服务

bin/webappService.shSkyWalking Web Application started successfully!

测试服务
请求http://192.168.66.100:8080
在这里插入图片描述

搭建微服务

引入依赖

 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
<!--       <scope>runtime</scope>--></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

编写核心配置
创建application.yml文件

spring:application:# 应用名字name: cloud-payment-providercloud:nacos:discovery:# Nacos注册中心的地址server-addr:  192.168.47.100:8848# 数据库配置datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8username: rootpassword: 123456
server:port: 8003

编写主启动类

@MapperScan("com.jjy.mapper")
@SpringBootApplication
@Slf4j
public class PaymentMain8003 {public static void main(String[] args) {SpringApplication.run(PaymentMain8003.class,args);log.info("********* 服务提供者启动成功 ******");}
}

现有一张 User 表,其表结构如下:

idnameage
1Jone18
2Jack20
3Tom28
4Sandy21

其对应的数据库 Schema 脚本如下:

DROP TABLE IF EXISTS `user`;CREATE TABLE `user`
(id BIGINT NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT NULL DEFAULT NULL COMMENT '年龄',PRIMARY KEY (id)
);

其对应的数据库 Data 脚本如下:

DELETE FROM `user`;INSERT INTO `user` (id, name, age) VALUES
(1, 'Jone', 18),
(2, 'Jack', 20),
(3, 'Tom', 28),
(4, 'Sandy', 21),
(5, 'Billie', 24);

编写实体类 User.java

@Data
@TableName("`user`")
public class User {private Long id;private String name;private Integer age;private String email;
}

编写 Mapper 包下的 UserMapper接口

public interface UserMapper extends BaseMapper<User> {}

微服务接入SkyWalking探针

探针,用来收集和发送数据到归集器。

下载官方提供探针
网址https://skywalking.apache.org/downloads/
在这里插入图片描述
拷贝探针文件到项目中

修改项目的VM运行参数
点击菜单栏中的 Run -> EditConfigurations…,此处我们以 cloud-gateway-gateway9527 项目为例,修改参数如下:
在这里插入图片描述

-javaagent:C:\Users\Administrator\IdeaProjects\jjy_cloud\jjy_cloud\skywalking-agent\skywalking-agent.jar
-DSW_AGENT_NAME=consumer-order
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.47.100:11800

参数:

-javaagent:用于指定探针路径。
-DSW_AGENT_NAME:服务名字
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES:连接地址

测试监控
在这里插入图片描述

SkyWalking日志

在这里插入图片描述
POM中引入相关依赖
Skywalking8.4.0版本开始才支持收集日志功能,同时pom需引用以下依赖。

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

Logback配置

在resource文件中创建logback.xml并且加入配置。

<?xml version="1.0" encoding="utf-8" ?>
<configuration><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>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern></layout></encoder></appender><root level="info"><appender-ref ref="console"/></root></configuration>

Skywalking通过gRPC上报日志
gRPC报告程序可以将收集到的日志发送给Skywalking OAP服务器上。

 <appender name="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.TraceIdPatternLogbackLayout"><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern></layout></encoder></appender><root level="info"><appender-ref ref="console"/><appender-ref ref="log"/></root>

打开你的agent/config/agent.config配置文件,添加如下配置信息,注意skywalking的log通信用的grpc:
在这里插入图片描述

# 指定要向其报告日志数据的GRPC服务器主机
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.47.100}
# 指定要向其报告日志数据的GRPC服务器端口
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
# 指定GRPC客户端要报告的日志数据的最大大小
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}

注意:

注:gRPC报告程序可以将收集到的日志转发到SkyWalking OAP服务器或SkyWalking Satellite卫星。

测试
在这里插入图片描述

SkyWalioking告警

什么是skyWalking告警功能
SkyWalking是一个开源的分布式系统追踪和性能监控工具。除了提供实时的系统性能监控和分析功能外,SkyWalking还提供了告警功能,用于监控系统的指标数据,并在数据超过预设阈值时触发告警。

Skywalking默认支持7中通知:
web、grpc、微信、钉钉、飞书、华为weLink、slack

为什么要使用skyWalking的告警功能

  • 及时发现异常情况
  • 提高故障处理效率
  • 避免数据丢失和损坏
  • 提升系统性能和稳定性

如何使用skyWalking的告警功能

  1. 告警规则
    告警规则定义了要监控的指标数据、阈值和触发条件。可以根据实际需求,定义多个告警规则。例如,可以设置当系统的平均响应时间超过100ms时,触发告警。
  2. 告警通知
    告警通知定义了当告警触发时,要发送通知的方式和接收人员。可以通过邮件、短信。钉钉等方式发送告警通知。
  3. 告警持续时间
    告警持续时间定义了告警状态的持续时间。当告警触发后,会持续发送通知,直到告警状态解除或达到设定的持续时间。
#告警配置文件: alarm-settings.yml
service_response_time rule:
#指定的规则
metrics-name : service _resp_time
op: ">"
# 阈值
threshold:1 #单位毫秒
#多久检查一次当前的指标数据是否符合告警规则
period:5
# 达到多少次告警后,发送告警消息
count:1
#告警消息内容
message:服务{name}最近5分钟以内响应时间超过了1ms

Skywalking自定义告警规则

默认告警规则

rules: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-name: service_slaop: "<"threshold: 8000period: 10count: 2silence-period: 3message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes.service_p90_sla_rule:metrics-name: service_p90op: ">"threshold: 1000period: 10count: 3silence-period: 5message: 90% response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.service_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 minutes.webhooks:- http://127.0.0.1/notify/- http://127.0.0.1/go-wechat/

以上文件定义了默认的4种规则

  • 最近3分钟内服务的平均响应时间超过1秒
  • 最近2分钟服务成功率低于80%
  • 最近3分钟90%服务响应时间超过1秒
  • 最近2分钟内服务实例的平均响应时间超过1秒 规则中的参数属性如下

自定义告警规则

修改Skywalking配置文件。vim alarm-settings.yml
在这里插入图片描述

# vim config/alarm-settings.yml
service_response_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1period: 1count: 1message: 服务{name}最近1分钟以内响应时间超过了1ms

温馨提示:注意预警属性对其

属性参照表

属性含义
metrics-nameoal脚本中的度量名称
threshold阈值,与metrics-name和下面的比较符号相匹配
op比较操作符,可以设定>,<,=
period多久检查一次当前的指标数据是否符合告警规则,单位分钟
count达到多少次后,发送告警消息
silence-period在多久之内,忽略相同的告警消息
message告警消息内容
include-names本规则告警生效的服务列表

测试
在这里插入图片描述

SkyWalking网络钩子Webhooks

在这里插入图片描述
Webhooks网络钩子

Webhok可以简单理解为是一种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}]

创建项目

引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency>
</dependencies>

创建接收实体类AlarmMessageDto
https://github.com/apache/skywalking/blob/v8.5.0/docs/en/setup/backend/backend-alarm.md

import lombok.Data;@Datapublic class AlarmMessageDto {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;}

}

编写钩子接口

/*** 订单机器人通知的*/
@PostMapping("/alarm")
public void sendDinging(@RequestBody List<AlarmMessageDto> alarmMessageDtoList) {StringBuilder builder = new StringBuilder();alarmMessageDtoList.forEach(info -> {builder.append("\nscopeId:").append(info.getScopeId()).append("\nScope实体:").append(info.getScope()).append("\n告警消息:").append(info.getAlarmMessage()).append("\n告警规则:").append(info.getRuleName()).append("\n\n--------------").append("----------\n\n");});
}

配置网络钩子

alarm-settings.yml 增加alarm接口
在这里插入图片描述

SkyWalking短信通知

申请阿里短信服务

访问阿里云https://www.aliyun.com/,完成登录

在这里插入图片描述

进入短信服务
在这里插入图片描述
开通短信服务
在这里插入图片描述
购买短信条数
在这里插入图片描述
购买完成进入阿里云短信控制台https://dysms.console.aliyun.com/overview
在这里插入图片描述
绑定测试手机号
在这里插入图片描述
点击调用API发送短信,可以看到发送短信的JAVA代码。
在这里插入图片描述

申请阿里云秘钥,该秘钥在发送短信时会作为参数传入
在这里插入图片描述
添加相关依赖

<dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version>
</dependency>

在通用模块编写发送短信服务接口

/*** 短信服务*/
public interface MessageService {/*** 发送短信** @param phoneNumber 手机号* @param code        验证码* @return 返回结果*/BaseResult sendMessage(String phoneNumber, String code);
}

在短信服务模块编写发送短信实现类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.SneakyThrows;/*** 短信服务实现类*/
@Service
public class MessageServiceImpl implements MessageService {/*** 访问密钥ID*/@Value("${message.accessKeyId}")private String accessKeyId;/*** 访问密钥秘密*/@Value("${message.accessKeySecret}")private String accessKeySecret;/*** 使用AK&SK初始化账号Client** @param accessKeyId      访问密钥ID* @param accessKeySecret  访问密钥秘密* @return Client          Client实例* @throws Exception       可能抛出的异常*/@SneakyThrowsprivate Client createClient(String accessKeyId, String accessKeySecret) {Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);// 访问的域名config.endpoint = "dysmsapi.aliyuncs.com";return new Client(config);}/*** 发送短信** @param phoneNumber 手机号* @param code        验证码* @return BaseResult 返回结果*/@SneakyThrows@Overridepublic BaseResult sendMessage(String phoneNumber, String code) {Client client = createClient(accessKeyId, accessKeySecret);SendSmsRequest sendSmsRequest = new SendSmsRequest().setSignName("阿里云短信测试").setTemplateCode("SMS_154950909").setPhoneNumbers(phoneNumber).setTemplateParam("{\"code\":\"" + code + "\"}");RuntimeOptions runtime = new RuntimeOptions();// 复制代码运行请自行打印API的返回值SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);SendSmsResponseBody body = sendSmsResponse.getBody();if ("OK".equals(body.getCode())) {return new BaseResult(200, body.getCode(), body.getMessage());} else {return new BaseResult(500, body.getCode(), body.getMessage());}}
}

SkyWalking邮件告警

邮件发送原理

SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。

在这里插入图片描述
授权过程

所以在使用springboot发送邮件之前,要开启POP3和SMTP协议,需要获得邮件服务器的授权码,这里以qq邮箱为例,展示获取授权码的过程:pkzljvxjbzvgbeci

在这里插入图片描述
在账户的下面有一个开启SMTP协议的开关并进行密码验证:
在这里插入图片描述
成功后会出现
在这里插入图片描述
POM引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置邮箱基本信息

spring:mail:# 配置 SMTP 服务器地址host: smtp.qq.com# 发送者邮箱username: 877910962@qq.com# 配置密码,注意不是真正的密码,而是刚刚申请到的授权码password: pkzljvxjbzvgbeci# 默认的邮件编码为UTF-8default-encoding: UTF-8properties:mail:smtp:# 需要验证用户名密码auth: true# 设置为配置SMTP连接的属性。要使用STARTTLS,必须设置以下属性starttls:enable: truerequired: true

注意:

  • 126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
  • 163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
  • yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994
  • qq邮箱SMTP服务器地址:smtp.qq.com,端口号465或587

编写接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 使用REST API发送邮件*/
@RestController
public class EmailController {/*** 注入JavaMailSender对象*/@Autowiredprivate JavaMailSender javaMailSender;/*** 发送邮件** @param alarmMessages 告警消息列表*/@GetMapping("sendMail")public void sendEmail(@RequestBody List<AlarmMessage> alarmMessages) {alarmMessages.forEach(info -> {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();// 发件人simpleMailMessage.setFrom("877910962@qq.com");// 收件人simpleMailMessage.setTo("877910962@qq.com");// 邮件主题simpleMailMessage.setSubject(info.getScope());// 邮件内容simpleMailMessage.setText(info.getAlarmMessage());// 发送邮件javaMailSender.send(simpleMailMessage);});}
}

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

相关文章:

Spring Cloud Alibaba(六)

目录&#xff1a; 分布式链路追踪-SkyWalking为什么需要链路追踪什么是SkyWalkingSkyWalking核心概念什么是探针Java AgentJava探针日志监控实现之环境搭建Java探针日志监控实现之探针实现编写探针类TestAgent搭建 ElasticsearchSkyWalking服务环境搭建搭建微服务微服务接入Sky…...

【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度

一、效果演示 重写Sprite组件&#xff0c;做了以下优化&#xff1a; 1、新增自变换&#xff0c;在不影响子节点的前提下位移、旋转、缩放、改变透明度 新增可合批调色板&#xff0c;支持色相、明暗调节 新增圆角矩形、3D透视旋转、纹理循环 所有功能均支持合批、原生平台&…...

jupyter-lab 环境构建

我平时用来调试各种代码的。 创建环境&#xff0c;安装库 conda create --name jupyterlab python3.12 -y conda activate jupyterlab conda install -c conda-forge jupyterlab nodejs之前用的是3.10的&#xff0c;但是最近安装的时候&#xff0c;发现3.10的python里面的jup…...

【C++】LeetCode:LCR 026. 重排链表

题干 LCR 026. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实…...

【Linux】vim编辑器

vim是什么&#xff1f; vim就是命令行模式下的文本编辑器&#xff0c;相当于windows中的记事本&#xff0c;可以用来进行文本编辑。 vim有三种运行模式&#xff0c;分别可以执行不同的操作&#xff1a; 普通模式&#xff08;Normal Mode&#xff09;&#xff1a;用于浏览和编辑…...

delphi 12 idhttpsever(S)+idhttp(C) 实现简单的JSON API服务

这篇博客展示了如何使用Delphi创建一个简单的HTTP服务器&#xff0c;并处理GET和POST请求。服务器监听6600端口&#xff0c;响应JSON格式的数据。客户端通过IdHttp组件进行GET和POST请求&#xff0c;获取并显示服务器响应的内容。 http服务器测试代码 procedure TForm1.FormSh…...

JVM 主副内存 详解

在 JVM (Java Virtual Machine) 中&#xff0c;内存的设计主要分为主内存和工作内存&#xff08;又称为线程内存&#xff09;。这种设计是基于 Java 内存模型&#xff08;Java Memory Model, JMM&#xff09; 的规定&#xff0c;它确保了多线程环境下数据的一致性和线程间的通信…...

sscanf与sprintf函数

本期介绍&#x1f356; 主要介绍&#xff1a;sscanf()、sprintf()这对输入/输出函数&#xff0c;并详细讲解了这两个函数的应用场景。 概述&#x1f356; 在C语言的输出和输入库中&#xff0c;有三对及其相似的库函数&#xff1a;printf()、scanf()、fprintf()、fscanf()、spri…...

【k8s】创建基于sa的token的kubeconfig

需求 创建一个基于sa的token的kubeconfig文件&#xff0c;并用这个文件来访问集群。 具体创建sa 和sa的token请参考文章: 【k8s】给ServiceAccount 创建关联的 Secrets-CSDN博客 创建sa apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:namespace: jtkjdevnam…...

Gentoo Linux部署LNMP

一、安装nginx 1.gentoo-chxf ~ # emerge -av nginx 提示配置文件需更新 2.gentoo-chxf ~ # etc-update 3.gentoo-chxf ~ # emerge -av nginx 4.查看并启动nginx gentoo-chxf ~ # systemctl status nginx gentoo-chxf ~ # systemctl start nginx gentoo-chxf ~ # syst…...

2411C++,CXImage简单使用

介绍 CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类. 文件格式和链接的C库 Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib; //包含标题,调色板,像素BITMAPINFOHEADER head; //标准头文件CXIMAGEINFO…...

什么是 Kubernetes(K8s)?

什么是 Kubernetes&#xff08;K8s&#xff09;&#xff1f; Kubernetes&#xff08;简称 K8s&#xff09; 是一个用来管理容器的开源工具&#xff0c;它可以自动化部署、扩展和管理容器化应用。简单来说&#xff0c;K8s 就是一个“容器管家”&#xff0c;负责确保你的应用程序…...

深入解析:TypeScript 与 Vue 的完美结合

文章目录 前言一、准备工作二、基本用法三、进阶主题结语 前言 Vue.js 是一款流行的渐进式 JavaScript 框架&#xff0c;它以易于学习和灵活的特性而闻名。TypeScript 则是 JavaScript 的一个超集&#xff0c;它引入了静态类型检查等高级功能&#xff0c;有助于构建更大型且复…...

机器学习周志华学习笔记-第13章<半监督学习>

机器学习周志华学习笔记-第13章&#xff1c;半监督学习&#xff1e; 卷王&#xff0c;请看目录 13半监督学习13.1 生成式方法13.2 半监督SVM13.3 基于分歧的方法13.4 半监督聚类 13半监督学习 前面我们一直围绕的都是监督学习与无监督学习&#xff0c;监督学习指的是训练样本包…...

软件工程——期末复习(1)

名词解释&#xff1a; 名词解释--人月 答案&#xff1a;人月是软件开发工作量的单位&#xff0c;1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败&#xff0c;并简单举例说明。 答案&#xff1a;缺陷&#xff08;defect&#xff09;指系统代…...

【JavaEE初阶 — 网络编程】实现基于TCP协议的Echo服务

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…...

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用 CSS 直接通过 CSS 的 background 属性实现水印&#xff1a; 实现步骤 在需要添加水印的容器中设置背景。使用 rgba 设置透明度&#xff0c;并通过 background-repeat 和 background-size…...

Qt 5 中的 QTextStream 使用指南

文章目录 Qt 5 中的 QTextStream 使用指南介绍基本概念读取文件注意事项结论 Qt 5 中的 QTextStream 使用指南 介绍 QTextStream 是 Qt 框架中用于处理文本数据的类。它提供了方便的接口来读写文本文件或字符串&#xff0c;支持多种编码格式&#xff0c;并且可以与 QIODevice…...

中安证件OCR识别技术助力鸿蒙生态:智能化证件识别新体验

在数字化和智能化的浪潮中&#xff0c;伴随国产化战略的深入推进&#xff0c;国产操作系统和软件生态的建设逐渐走向成熟。鸿蒙操作系统&#xff08;HarmonyOS Next&#xff09;作为华为推出的重要操作系统&#xff0c;凭借其开放、灵活和高效的特点&#xff0c;正在加速在多个…...

SpringBoot 框架下基于 MVC 的高校办公室行政事务管理系统:设计开发全解析

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…...

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…...

Selenium3+Python如何操作键盘

selenium操作键盘&#xff0c;需要导入Keys类&#xff1a;“from selenium.webdriver.common.keys import Keys” 调用键盘操作的快捷键的方法 &#xff1a; 单键值&#xff1a;直接传入对应的键值“element.send_keys”(快捷键的键值) 组合键&#xff1a;键值之间由逗号分隔…...

PLC协议

PLC协议通常指的是可编程逻辑控制器&#xff08;Programmable Logic Controller, PLC&#xff09;与其他设备之间通信时所使用的协议。PLC广泛应用于工业自动化领域&#xff0c;用于控制和监控设备。不同厂商和应用场景可能使用不同的通信协议。 常见的PLC通信协议 1. Modbus …...

C_字符串的一些函数

1.字符串输入函数 scanf("%s",数组名)&#xff1b; gets(数组名)&#xff1b; 区别&#xff1a; scanf(“%s”,数组名); 把空格识别为输入结束 #include <stdio.h>int main() {char a[10];printf("输入&#xff1a;");scanf("%s",a)…...

使用Native AOT发布C# dll 提供给C++调用

Native AOT&#xff0c;即提前本地编译&#xff08;Ahead-Of-Time Compilation&#xff09;&#xff0c;是一种将托管代码&#xff08;如 C#&#xff09;编译为本机可执行文件的技术&#xff0c;无需在运行时进行任何代码生成。 &#xff08;Native AOT 优缺点截图摘自张善友博…...

Git 提交代码日志信息

前言 在项目中经常用到git提交代码&#xff0c;每次提交时需要添加日志信息&#xff0c;那么一套规范的日志信息会让整个git仓库看起来赏心悦目&#xff01; 以下是Git 提交代码日志信息的建议&#xff1a; 一、格式规范 标题&#xff08;Subject&#xff09; 标题是日志信息中…...

Request method ‘POST‘ not supported(500)

前端路径检查 查看前端的请求路径地址、请求类型、方法名是否正确&#xff0c;结果没问题 后端服务检查 查看后端的传参uri、传参类型、方法名&#xff0c;结果没问题 nacos服务名检查 检查注册的服务是否对应&#xff08;我这里是后端的服务名是‘ydlh-gatway’,服务列表走…...

终端环境下关闭显示器

终端环境下关闭显示器 使用vbetool vbetool 使用 lrmi 来运行视频 BIOS 中的代码。目前&#xff0c;它能够更改 DPMS 状态、保存/恢复视频卡状态并尝试从头开始初始化视频卡。 vbetool dpms off...

常见排序算法总结 (三) - 归并排序与归并分治

归并排序 算法思想 将数组元素不断地拆分&#xff0c;直到每一组中只包含一个元素&#xff0c;单个元素天然有序。之后用归并的方式收集跨组的元素&#xff0c;最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的&#xff0c;拆分数组时会自然地将元素分成有先后…...

【后端开发】Go语言编程实践,Goroutines和Channels,基于共享变量的并发,反射与底层编程

【后端开发】Go语言编程实践&#xff0c;Goroutines和Channels&#xff0c;基于共享变量的并发&#xff0c;反射与底层编程 【后端开发】Go语言高级编程&#xff0c;CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统 文章目录 1、并发基础, Goroutines和Channels2、基于共享…...