SpringCloud使用SkyWalking实现分布式链路追踪2以及Prometheus全方位监控告警系统

一、SkyWalking链路追踪使用Elasticsearch数据库

1、SkyWalking连接Elasticsearch数据库

在前面搭建完linux的elasticsearch环境,以及一部分的skywalking的环境;现在继续处理skywalking的环境。

  1. skywalking9.4.0在启动一次之后,将storage的数据库进行修改后,发现只能打开界面,不能显示数据。
    所以我直接把skywalking安装目录删除了:rm -rf /usr/local/apache-skywalking-apm-bin/
  2. 重新解压缩:tar -zxvf /opt/apache-skywalking-apm-9.4.0.tar.gz -C /usr/local/
  3. 然后修改webapp下的application.yml文件:vim /usr/local/apache-skywalking-apm-bin/webapp/application.yml
    在这里插入图片描述
  4. 编辑skywalking的application.yml配置:vim /usr/local/apache-skywalking-apm-bin/config/application.yml
    在这里插入图片描述
  5. 启动SkyWalking
    1)进入到SkyWalking的bin目录下:cd /usr/local/apache-skywalking-apm-bin/bin
    2)启动SkyWalking:./startup.sh
    在这里插入图片描述

2、SkyWalking自定义链路追踪

  1. 在cloud-provider-skywalking-payment8001项目的POM文件中,添加如下数据库依赖

    <!--    数据库驱动    -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.32</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>8.15.0</version>
    </dependency>
    
    <!--数据库连接池 HikariCP-->
    <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>5.0.1</version>
    </dependency>
    
  2. 在cloud-provider-skywalking-payment8001项目的application.yml文件中,添加如下数据库配置

    spring:
      # 数据库配置
      datasource:
        name: sonice1024
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        hikari:
          minimum-idle: 3
          auto-commit: true
          idle-timeout: 10000
          max-lifetime: 1800000
          connection-timeout: 30000
          connection-test-query: SELECT 1
    

    此时的mysql使用本地,即localhost,而不是linux虚拟机上的。

  3. 打开Navicat,创建连接后,对连接名右键新建数据库test。
    在这里插入图片描述

  4. 在test数据库中创建表和添加数据
    在这里插入图片描述
    1)创建表

    CREATE TABLE user
    (
        id BIGINT(20) NOT NULL COMMENT '主键ID',
        name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
        age INT(11) NULL DEFAULT NULL COMMENT '年龄',
        email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
        PRIMARY KEY (id)
    );
    

    2)添加数据

    INSERT INTO user (id, name, age, email) VALUES
    (1, 'Jone', 18, 'test1@baomidou.com'),
    (2, 'Jack', 20, 'test2@baomidou.com'),
    (3, 'Tom', 28, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 'test4@baomidou.com'),
    (5, 'Billie', 24, 'test5@baomidou.com');
    
  5. 在cloud-provider-skywalking-payment8001项目的com.zzx.entity包下,创建实体类User

    package com.zzx.entity;
    
    import lombok.Data;
    import lombok.ToString;
    
    @Data
    @ToString
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
  6. 在cloud-provider-skywalking-payment8001项目的com.zzx.mapper包下,创建User的dao层接口UserMapper

    package com.zzx.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.zzx.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
    
    

    即继承BaseMapper类,传入一个实体类,对应数据库的表,还有加上@Mapper注解。

  7. 在cloud-provider-skywalking-payment8001项目的com.zzx.service包下,创建User的service层接口IUserService

    package com.zzx.service;
    
    import com.zzx.entity.User;
    
    import java.util.List;
    
    public interface IUserService {
        /**
         * 查询全部用户
         * @return
         */
        List<User> getUser();
    
        /**
         * 根据id查询用户
         * @param id
         * @return
         */
        User findById(Long id);
    }
    
    
  8. 在cloud-provider-skywalking-payment8001项目的com.zzx.service.impl包下,创建User的service层实现类UserServiceImpl

    package com.zzx.service.impl;
    
    import com.zzx.entity.User;
    import com.zzx.mapper.UserMapper;
    import com.zzx.service.IUserService;
    import org.apache.skywalking.apm.toolkit.trace.Trace;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    @Service
    public class UserServiceImpl implements IUserService {
        @Autowired
        private UserMapper userMapper;
    
        /**
         * 查询全部用户
         * @return
         */
        @Trace
        @Override
        public List<User> getUser() {
            return userMapper.selectList(null);
        }
        /**
         * 根据用户id查询用户
         * @param id 用户id
         * @return
         */
        @Trace
        @Override
        public User findById(Long id) {
            return userMapper.selectById(id);
        }
    }
    
    
  9. 在cloud-provider-skywalking-payment8001项目的com.zzx.controller包下,创建User的controller层类UserController

    package com.zzx.controller;
    
    import com.zzx.entity.User;
    import com.zzx.service.IUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RequestMapping("user")
    @RestController
    public class UserController {
        @Autowired
        private IUserService iUserService;
    
        /**
         * 查询全部用户
         * @return
         */
        @GetMapping("findByAll")
        public List<User> getUser(){
            return iUserService.getUser();
        }
    
        /**
         * 根据用户id查询用户
         * @param id
         * @return
         */
        @GetMapping("findById")
        public User findById(Long id){
            return iUserService.findById(id);
        }
    
    }
    
    
  10. 测试
    1)启动Eureka7001和Eureka7002以及cloud-provider-skywalking-payment8001项目
    2)启动虚拟机的SkyWalking服务和Elasticsearch服务
    3)浏览器访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    4)浏览器访问:http://192.168.126.11:8068,然后点击导航栏的Trace即可看到刚刚请求的链路信息。
    在这里插入图片描述

3、SkyWalking的调用日志

  1. Skywalking8.4.0版本开始才支持收集日志功能,在cloud-provider-skywalking-payment8001项目的POM添加如下收集日志的依赖。

    <!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-logback-1.x -->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-logback-1.x</artifactId>
        <version>8.11.0</version>
    </dependency>
    
  2. 在cloud-provider-skywalking-payment8001项目的resources目录下,创建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>
        <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>
    
    
    </configuration>
    
    
  3. 在skywalking-agent/config/agent.config配置文件中,添加如下配置:
    在这里插入图片描述

    # 指定要向其报告日志数据的grpc服务器的主机
    plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.126.11}
    
    # 指定要向其报告日志数据的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}
    
  4. 测试
    1)启动Eureka7001和Eureka7002以及cloud-provider-skywalking-payment8001服务
    2)在浏览器上访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    3)此时浏览器访问:http://192.168.126.11:8068,点击导航条的Log,即可出现这个调用的日志。
    在这里插入图片描述

二、SkyWalking链路追踪的告警功能

1、SkyWalking的告警规则

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

  2. 默认规则
    Skywalking默认提供的 alarm-settings.yml ,定义的告警规则如下:
    1)过去3分钟内服务平均响应时间超过1秒
    2)服务成功率在过去2分钟内低于80%
    3)服务90%响应时间在过去3分钟内高于1000毫秒
    4)服务实例在过去2分钟内的平均响应时间超过1秒
    5)端点平均响应时间过去2分钟超过1秒

  3. 告警规则
    1)endpoint_percent_rule:规则名称,将会在告警消息体中展示,必须唯一,且以 _rule 结尾
    2)metrics-name:度量名称
    3)include-names:将此规则作用于匹配的实体名称上,实体名称可以是服务名称或端点名称等
    4)exclude-names:将此规则作用于不匹配的实体名称上,实体名称可以是服务名称或端点名称等
    5)threshold:阈值
    6)op:操作符,目前支持 >、<、=
    7)period:多久检测一次告警规则,即检测规则是否满足的时间窗口,与后端开发环境匹配
    8)count:在一个period窗口中,如果实际值超过该数值将触发告警
    9)silence-period:触发告警后,在silence-period这个时间窗口中不告警,该值默认和- – — period相同。例如,在时间T这个瞬间触发了某告警,那么在(T+10)这个时间段,不会再次触发相同告警。
    10)message:告警消息体,{name} 会解析成规则名称

  4. Webhook
    Webhook表达的意思是,当告警发生时,将会请求的地址URL(用POST方法)。警报消息将会以 application/json 格式发送出去。

    [{
     "scopeId": 1, 
     "scope": "SERVICE",
     "name": "serviceA", 
     "id0": 12, 
     "id1": 0, 
     "ruleName": "service_resp_time_rule",
     "alarmMessage": "alarmMessage xxxx",
     "startTime": 1560524171000
    }]
    

    参数:

    scopeId、scope:作用域
    name:目标作用域下的实体名称;
    id0:作用域下实体的ID,与名称匹配;
    id1:暂不使用;
    ruleName: alarm-settings.yml 中配置的规则名称;
    alarmMessage:告警消息体;
    startTime:告警时间(毫秒),时间戳形式。

2、SkyWalking自定义告警规则

  1. 编辑alarm-settings.yml告警规则文件:vim /usr/local/apache-skywalking-apm-bin/config/alarm-settings.yml,添加如下配置

    service_response_time_rule:
      #指定的规则
      metrics-name: service_resp_time
      op: ">"
      # 阈值
      threshold: 1  # 单位毫秒
      # 多久检查一次当前的指标数据是否符合告警规则
      period: 5
      # 达到多少次告警后,发送告警消息
      count: 1
      # 告警消息内容
      message: 服务{name}最近5分钟以内响应时间超过了1ms
    
    
  2. 重启SkyWalking
    1)将SkyWalking服务杀死
    在这里插入图片描述
    2)进入到bin目录下:cd /usr/local/apache-skywalking-apm-bin/bin
    3)启动SkyWalking服务:./startup.sh

  3. 修改cloud-provider-skywalking-payment8001项目的com.zzx.service.impl包下的UserServiceImpl类的getUser方法

    @Trace
    @Override
    public List<User> getUser() throws InterruptedException {
        TimeUnit.SECONDS.sleep(3);
        return userMapper.selectList(null);
    }
    

    即添加一个休眠1S的代码;从而触发刚刚定义的SkyWalking的告警规则。

  4. 此时UserController也需要进行异常的抛出。

  5. 测试
    1)启动Eureka7001和Eureka7002以及重启cloud-provider-skywalking-payment8001服务
    2)在浏览器上访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    3)此时浏览器访问:http://192.168.126.11:8068,点击左边导航条的告警标志,即可出现这个告警信息。如果没有告警信息,可以多请求几次或者延长休眠时间。在这里插入图片描述

3、SkyWalking实现网络钩子Webhooks

  1. 在父工程cloud下,右键new Module,创建子模块项目cloud-alarm9090
    在这里插入图片描述

  2. 在cloud-alarm9090项目的POM文件中添加如下依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>com.zzx</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-alarm9090</artifactId>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
        </properties>
        <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.26</version>
            </dependency>
        </dependencies>
    
    
    </project>
    
  3. 将cloud-alarm9090项目的com.zzx包下的主启动类Main修改为AlarmMain9090 ,代码如下

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @Slf4j
    public class AlarmMain9090 {
        public static void main(String[] args) {
            SpringApplication.run(AlarmMain9090.class,args);
            log.info("******  AlarmMain9090 启动 *****");
        }
    }
    
  4. 在cloud-alarm9090项目的resources目录下创建application.yml文件,配置如下

    server:
      port: 9090
    
  5. 在cloud-alarm9090项目的com.zzx.domain包下,创建接收实体类AlarmMessage,代码如下

    package com.zzx.domain;
    
    
    import lombok.Data;
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.List;
    
    
    /**
     * Alarm message represents the details of each alarm.
     */
    @Data
    public class AlarmMessage {
        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;
        @Data
        public static class Tag{
            private String key;
            private String value;
        }
    }
    
    
  6. 在cloud-alarm9090项目的com.zzx.controller包下,创建告警控制层类AlarmController ,代码如下

    package com.zzx.controller;
    
    import com.zzx.domain.AlarmMessage;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /**
     * 告警控制层
     */
    @RestController
    @RequestMapping("alarm")
    public class AlarmController {
    
        /**
         * 钩子服务
         */
        @PostMapping("dingding")
        public void message(@RequestBody List<AlarmMessage> alarmMessages){
            StringBuilder builder = new StringBuilder();
            alarmMessages.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------------------------\n\n");
            });
            System.out.println(builder);
        }
    
    }
    
    
  7. 先从网络适配器的VMnet8中获取到虚拟机在同一个网关下的ip地址,用来配置到下面的告警规则文件alarm-settings.yml中
    在这里插入图片描述

  8. 编辑alarm-settings.yml告警规则文件:vim /usr/local/apache-skywalking-apm-bin/config/alarm-settings.yml,添加如下配置

    webhooks:
    	# 钉钉告警
        - http://192.168.126.1:9090/alarm/dingding
    

    即将告警消息使用Post请求推送到这个地址中。

  9. 重启SkyWalking
    1)将SkyWalking服务杀死
    在这里插入图片描述
    2)进入到bin目录下:cd /usr/local/apache-skywalking-apm-bin/bin
    3)启动SkyWalking服务:./startup.sh

  10. 关闭防火墙
    在这里插入图片描述

  11. 测试
    1)启动Eureka7001和Eureka7002和cloud-provider-skywalking-payment8001以及AlarmMain9090服务
    2)在浏览器上访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    3)AlarmMain9090服务的控制台会打印如下信息
    在这里插入图片描述
    如果没有出现,则多访问几次http://localhost:8001/user/findByAll

4、SkyWalking使用网络钩子Webhooks实现钉钉告警

  1. 创建钉钉群聊,然后在群里的右上角点击设置,选择机器人,再选择添加机器人,再次选择添加机器人,选择自定义(通过Webhook接入自定义服务),再点击添加,按下图进行配置,然后把秘钥复制起来,点击完成即可。最后将网络钩子Webhook的链接和秘钥复制下来放在cloud-alarm9090项目的yml文件中进行配置即可。
    在这里插入图片描述

在这里插入图片描述

  1. 在cloud-alarm9090项目的POM文件中添加如下依赖

    <!--钉钉工具包-->
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>alibaba-dingtalk-service-sdk</artifactId>
       <version>2.0.0</version>
    </dependency>
    
    
  2. 修改cloud-alarm9090项目的com.zzx.controller包下的AlarmController类,代码如下

    package com.zzx.controller;
    
    import com.dingtalk.api.DefaultDingTalkClient;
    import com.dingtalk.api.DingTalkClient;
    import com.dingtalk.api.request.OapiRobotSendRequest;
    import com.dingtalk.api.response.OapiRobotSendResponse;
    import com.zzx.domain.AlarmMessage;
    import org.apache.tomcat.util.codec.binary.Base64;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.*;
    
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.net.URLEncoder;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * 告警控制层
     */
    @RestController
    @RequestMapping("alarm")
    public class AlarmController {
        @Value("${dingding.webhook}")
        private String webhook;
        @Value("${dingding.secret}")
        private String secret;
        /**
         * 钩子服务
         */
        @PostMapping("dingding")
        public void message(@RequestBody List<AlarmMessage> alarmMessages){
            alarmMessages.forEach(info -> {
                try {
                    // 当前时间戳
                    Long timestamp = System.currentTimeMillis();
                    String stringToSign = timestamp + "\n" + secret;
                    /**
                     * Mac算法是带有密钥的消息摘要算法
                     * 初始化HmacMD5摘要算法的密钥产生器
                     */
                    Mac mac = Mac.getInstance("HmacSHA256");
                    // 初始化mac
                    mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
                    // 执行消息摘要
                    byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
                    // 拼接签名
                    String sign = "&timestamp=" + timestamp + "&sign=" + URLEncoder.encode(new String(Base64.encodeBase64(signData,false)), "UTF-8");
                    // 构建钉钉发送客户端工具
                    DingTalkClient client = new DefaultDingTalkClient(webhook + sign);
                    // 设置消息类型
                    OapiRobotSendRequest request = new OapiRobotSendRequest();
                    request.setMsgtype("text");
                    // 设置告警信息
                    OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
                    text.setContent("业务告警:\n" + info.getAlarmMessage());
                    request.setText(text);
                    // 接受人
                    OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
                    at.setAtMobiles(Arrays.asList("所有人"));
                    request.setAt(at);
                    OapiRobotSendResponse response = client.execute(request);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    
    }
    
    

    即修改了message方法,将原本从控制台打印,变成推送消息到第三方钉钉的群聊中。

  3. 修改cloud-alarm9090项目的application.yml,配置如下

    server:
      port: 9090
    dingding:
      # 钉钉网络钩子的地址
      webhook: https://oapi.dingtalk.com/robot/send?access_token=2d5c8bdec15d56f9548bee2713562b57c4d5f1ca35eb45eb45fdcb8ffaae7719
      # 秘钥
      secret: SEC6b75579d66b1fe5e5a73cc2186db61e6499e13e493fe755f6c78219e4ed1eade
    
  4. 关闭防火墙
    在这里插入图片描述

  5. 测试
    1)启动Eureka7001和Eureka7002和cloud-provider-skywalking-payment8001以及重启AlarmMain9090服务
    2)在浏览器上访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    3)钉钉中的群聊机器人就会发送告警信息。
    在这里插入图片描述

5、SkyWalking使用网络钩子Webhooks实现邮件告警

  1. 登录到qq邮箱后,点击设置,再点击账户,往下拉到第二个图的管理服务那里,一点击到第三个图那里,点击生成授权码,手机验证后就会出现授权码。复制该授权码,待会需要配置。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 在cloud-alarm9090项目的POM文件中添加如下支持邮箱的依赖

    <!--   邮箱依赖    -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
       <groupId>javax.mail</groupId>
       <artifactId>mail</artifactId>
       <version>1.4.7</version>
    </dependency>
    
    
  3. 在cloud-alarm9090项目的yml配置文件中,添加如下邮箱配置

    spring:
      mail:
        # 配置 SMTP 服务器地址
        host: smtp.qq.com
        # 指定发送者邮箱
        username: xxx@qq.com
        # 配置密码,刚刚申请到的授权码
        password: gfhxpfnivobmigbj
        # 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,端口号465587
        # 默认的邮件编码为UTF-8
        default-encoding: UTF-8
        properties:
          mail:
            smtp:
              #需要验证用户名密码
              auth: true
            starttls:
              # 设置为配置SMTP连接的属性。要使用STARTTLS,必须设置以下属性
              enable: true
              required: true
    
  4. 在cloud-alarm9090项目的com.zzx.controller包下的AlarmController类中,添加如下代码

    @Autowired
    private JavaMailSender javaMailSender;
    /**
     * 钩子服务 邮件告警
     */
    @PostMapping("sendMail")
    public void sendMail(@RequestBody List<AlarmMessage> alarmMessages){
        alarmMessages.forEach(info -> {
            //邮件客户端 MimeMailMessage可以携带附件,SimpleMailMessage不能携带附件
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            // 指定发件人的qq邮箱
            mailMessage.setFrom("xxx@qq.com");
            // 指定收件人的邮箱
            mailMessage.setTo("xxx@qq.com");
            // 邮件主题
            mailMessage.setSubject(info.getName());
            // 邮件内容
            mailMessage.setText(info.getAlarmMessage());
            // 发送邮件
            javaMailSender.send(mailMessage);
        });
    }
    
  5. 编辑alarm-settings.yml告警规则文件:vim /usr/local/apache-skywalking-apm-bin/config/alarm-settings.yml,添加如下配置

    webhooks:
    	# 邮件告警
        - http://192.168.126.1:9090/alarm/sendMail
    
  6. 重启SkyWalking
    1)将SkyWalking服务杀死
    在这里插入图片描述
    2)进入到bin目录下:cd /usr/local/apache-skywalking-apm-bin/bin
    3)启动SkyWalking服务:./startup.sh

  7. 测试
    1)启动Eureka7001和Eureka7002和cloud-provider-skywalking-payment8001以及重启AlarmMain9090服务
    2)在浏览器上访问:http://localhost:8001/user/findByAll
    在这里插入图片描述
    3)qq邮箱就会发送消息到指定邮箱
    在这里插入图片描述

三、全方位监控告警系统

1、系统监控报警框架Prometheus以及UI可视化Grafana的概论

  1. Prometheus的具体流程:
    1)Prometheus Server: 用于定时抓取数据指标(metrics)、存储时间序列数据(TSDB)
    2)Jobs/exporte: 收集被监控端数据并暴露指标给Prometheus
    3)Pushgateway :监控端的数据会用push的方式主动传给此组件,随后被Prometheus 服务定时pull此组件数据即可
    4)Alertmanager :报警组件,可以通过邮箱、微信等方式
    5)Web UI :用于多样的UI展示,一般为Grafana
    6)还有一些例如配置自动发现目标的小组件和后端存储组件

  2. Prometheus的特点

    • 多维度数据模型。
    • 灵活的查询语言。
    • 不依赖分布式存储,单个服务器节点是自主的。
    • 通过基于HTTP的pull方式采集时序数据。
    • 可以通过中间网关进行时序数据推送。
    • 通过服务发现或者静态配置来发现目标服务对象。
    • 支持多种多样的图表和界面展示,比如Grafana等。
  3. Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示。Grafana提供了对prometheus的友好支持,各种工具帮助你构建更加炫酷的数据可视化。

  4. Grafana特点

    • 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
    • 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
    • 通知:警报更改状态时,它会发出通知。接收电子邮件通知。
    • 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
    • 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
    • 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
    • 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。

2、Prometheus服务的环境搭建

  1. Prometheus的linux2.44版本下载地址:https://github.com/prometheus/prometheus/releases/download/v2.44.0-rc.2/prometheus-2.44.0-rc.2.linux-amd64.tar.gz
  2. 将prometheus上传到虚拟机的/opt目录下,在opt目录中进行解压缩到到/usr/local目录中:tar -zxvf prometheus-2.44.0-rc.2.linux-amd64.tar.gz -C /usr/local
  3. 进入到prometheus的安装目录:cd /usr/local/prometheus-2.44.0-rc.2.linux-amd64/
  4. 启动prometheus服务并指定它的配置文件:./prometheus --config.file=prometheus.yml
    默认指定的配置文件就是prometheus.yml;所以此时可以不用指定。
    • 如果此时端口号被占用,先检查9090是哪个进程在占用:lsof -i :9090
      因为prometheus默认端口就是9090
    • 杀死该进程:kill -9 PID号,再启动就可以了
      在这里插入图片描述
  5. 在浏览器上访问:http://192.168.126.11:9090
    在这里插入图片描述
  6. 如果后面需要关闭prometheus服务
    • 先找到prometheus服务的PID号:pgrep -f prometheus
    • 杀死该进程:kill -9 PID号

3、Grafana服务的环境搭建

  1. 因为前面打开了Prometheus服务,直接再打开一个窗口,双击该虚拟机的Session的名字即可打开新窗口。
    在这里插入图片描述
  2. 拉取Grafana的最新镜像:docker pull grafana/grafana-enterprise
  3. 创建并运行容器:docker run -d --name=grafana -p 3000:3000 grafana/grafana-enterprise
  4. 在浏览器中访问:http://192.168.126.11:3000
    Grafana的帐号和密码都是admin
  5. 登陆进去后,按下图步骤点击Data sources,然后点击Add data source,即配置数据源。
    在这里插入图片描述
  6. 再点击Prometheus,即配置Prometheus的数据源,配置如下,然后拉到下面,点击save保存即可
    在这里插入图片描述
    即配置prometheus的服务地址,以及自定义该配置的名字。
  7. 按下图配置Grafana模板,12856是Grafana模板ID。更多模板请参考:https://grafana.com/grafana/dashboards
    在这里插入图片描述
  8. 按下图选择刚刚的配置名,然后点击import即可
    在这里插入图片描述
  9. 然后就会出现下图的DashBoard,即仪表盘
    在这里插入图片描述

4、将微服务应用接入Prometheus服务

  1. 在cloud父工程下,创建一个子模块项目cloud-provider-prometheus-payment8001
    在这里插入图片描述

  2. 在cloud-provider-prometheus-payment8001项目的POM文件中引入依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>com.zzx</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-provider-prometheus-payment8001</artifactId>
    
        <properties>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
        </properties>
        <dependencies>
            <!--  引入Eureka client依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- actuator监控信息完善 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--    prometheus依赖    -->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-registry-prometheus</artifactId>
                <version>1.10.5</version>
            </dependency>
    
        </dependencies>
    
    </project>
    
  3. 在cloud-provider-prometheus-payment8001项目的resources目录下,创建application.yml文件,配置如下

    server:
      port: 8001
    eureka:
      instance:
        # 注册名
        instance-id: cloud-provider-payment8001
      client:
        service-url:
          # Eureka server的地址
          #集群
          defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
          #单机
          #defaultZone: http://localhost:7001/eureka/
    spring:
      application:
        #设置应用名
        name: cloud-payment-provider
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
      endpoint:
        health:
          show-details: ALWAYS
      metrics:
        tags:
          application: ${spring.application.name}
    
    

    management.endpoints.web.exposure.include=* 配置为开启 Actuator 服务。

  4. 将cloud-provider-payment8001项目的com.zzx.controller包以及它的主启动类PaymentMain8001复制到cloud-provider-prometheus-payment8001项目中
    在这里插入图片描述

  5. cloud-provider-prometheus-payment8001项目中的com.zzx包下的PaymentMain8001主启动类修改为PaymentPrometheusMain8001,代码如下

    package com.zzx;
    
    import io.micrometer.core.instrument.MeterRegistry;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    /**
     * 主启动类
     */
    @SpringBootApplication
    @Slf4j
    public class PaymentPrometheusMain8001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentPrometheusMain8001.class,args);
            log.info("****** PaymentPrometheusMain8001 服务启动成功 *****");
        }
        @Bean
        MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
            return registry -> registry.config().commonTags("application", applicationName);
        }
    }
    
    
  6. 修改prometheus服务的prometheus.yml配置文件
    1)关闭prometheus服务,直接在prometheus服务的窗口按crtrl + c,中断该服务
    2)修改prometheus.yml配置文件:vim /usr/local/prometheus-2.44.0-rc.2.linux-amd64/prometheus.yml,添加如下配置

    - job_name: "cloud-provider-prometheus-payment8001"
      scrape_interval: 5s
      metrics_path: "/actuator/prometheus"
      static_configs:
        - targets: ["192.168.126.1:8001"]
    
    

    此时的192.168.126.1是从网络适配器的VMnet8的ipv4中的。
    在这里插入图片描述
    3)启动Prometheus服务:./prometheus

  7. 浏览器访问:http://192.168.126.11:9090,然后点击Status,选择到targets。
    在这里插入图片描述
    如果cloud-provider-prometheus-payment8001的状态显示up,证明暴露指标成功

  8. 浏览器访问:http://192.168.126.11:3000/dashboards,然后选择刚刚的界面,能出现下图即可。
    在这里插入图片描述

总结

  1. SkyWalking官方推荐使用Elasticsearch数据库。
    1)SkyWalking连接Elasticsearch数据库,需要在SkyWalking安装目录的config/application.yml文件中的storage属性中进行配置。skywalking9.4.0有个坑,就是你在启动SkyWalking后,再去切换数据库,再次启动时,会出现不显示数据的问题。需要重新安装,然后在配置完成后,再去启动SkyWalking服务即可。
    2)SkyWalking自定义链路追踪,需要在追踪的方法上加上@Trace注解。然后SkyWalking服务就会对该方法从开始到结束的所有操作进行追踪。
  2. 1)SkyWalking的调用日志,需要在POM文件中,引入收集日志的依赖;然后需要在resources下创建一个logback.xml配置文件;最后在JavaAgent中配置SkyWalking服务主机的ip和端口号等信息;这样就可以将SkyWalking收集到的日志信息上传到SkyWalking中。
    2)Skywalking发送告警的基本原理是每隔一段时间轮询Skywalking-collector收集到的链路追踪的数据。Skywalking告警可以支持第三方应用,即将告警信息推送到第三方应用。
    3)SkyWalking自定义告警信息,需要在SkyWalking的安装目录下的config目录的alarm-settings.yml告警规则文件中进行添加自定义告警规则。然后重启SkyWalking服务即可。
  3. 1)Webhook可以简单理解为是一种Web层面的回调机制。
    SkyWalking实现网络钩子Webhooks,需要先在alarm-settings.yml告警规则文件中指定回调的地址,该地址ip为VMnet8中IPV4中的ip,也就是虚拟机在同一个网关下的ip地址。定义AlarmMessage实体类用来接收SkyWalking使用POST请求传递过来的消息;最后在AlarmController控制层类中定义这个回调的方法,获取到告警消息,然后对该消息进行一个处理即可。
    2)SkyWalking使用网络钩子Webhooks实现钉钉告警,需要创建钉钉中的群聊,添加一个群里的自定义机器人,获取到加密的秘钥(也可以选择不加密)以及获取到webhooks的地址链接配置到application.yml文件中。然后需要引入钉钉告警的依赖;该Controller类中定义这两个变量,这两个变量从刚刚在yml文件中配置两个属性中获取值。最后需要在alarm-settings.yml告警规则文件中进行添加回调方法的请求路径,在对应方法中实现这个钉钉告警。
    3)SkyWalking使用网络钩子Webhooks实现qq邮箱告警,需要先从qq邮箱获取到授权码,然后配置到application.yml文件中,以及在application.yml文件中配置一些支持qq邮箱的配置等。
    然后引入支持邮箱的依赖,最后需要在alarm-settings.yml告警规则文件中进行添加回调方法的请求路径,在对应方法中实现这个邮箱告警即可。
  4. 1)Prometheus 是一套开源的系统监控报警框架。全方位的监控告警系统主要作用是监控微服务运行状况。Grafana提供了对prometheus的友好支持,各种工具帮助你构建更加炫酷的数据可视化。
    2)微服务应用接入Prometheus服务,再由Grafana服务进行页面展示。先手需要Grafana服务中配置Prometheus服务;然后引入micrometer-registry-prometheus等依赖;然后在application.yml配置文件中开启Actuator服务以及指定它的应用名给Grafana等;在主启动类中实现暴露指标到prometheus服务的方法;在虚拟机中修改prometheus安装目录的prometheus.yml配置文件,设置获取应用指标的配置即可。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微服务是什么?微服务是用于构建应用程序的架构风格,一个大的系统可由一个或者多个微服务组成,微服务架构可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作和出现故障的时候不会相互影响。为什么要用微服务?单体架构下的所有代码模块都耦合在一起,代码量大,维护困难,想要更新一个模块的代码,也可能会影响其他模块,不能很好的定制化代码。微服务中可以有java编写、有Python编写的,他们都是靠restful架构风格统一成一个系统的,所以微服务本身与具体技术无关、扩展性强。大型电商平台微服务功能图为什么要将SpringCloud项目部署到k8s平台?SpringCloud只能用在SpringBoot的java环境中,而kubernetes可以适用于任何开发语言,只要能被放进docker的应用,都可以在kubernetes上运行,而且更轻量,更简单。SpringCloud很多功能都跟kubernetes重合,比如服务发现,负载均衡,配置管理,所以如果把SpringCloud部署到k8s,那么很多功能可以直接使用k8s原生的,减少复杂度。Kubernetes作为成熟的容器编排工具,在国内外很多公司、世界500强等企业已经落地使用,很多中小型公司也开始把业务迁移到kubernetes中。kubernetes已经成为互联网行业急需的人才,很多企业都开始引进kubernetes技术人员,实现其内部的自动化容器云平台的建设。对于开发、测试、运维、架构师等技术人员来说k8s已经成为的一项重要的技能,下面列举了国内外在生产环境使用kubernetes的公司: 国内在用k8s的公司:阿里巴巴、百度、腾讯、京东、360、新浪、头条、知乎、华为、小米、富士康、移动、银行、电网、阿里云、青云、时速云、腾讯、优酷、抖音、快手、美团等国外在用k8s的公司:谷歌、IBM、丰田、iphone、微软、redhat等整个K8S体系涉及到的技术众多,包括存储、网络、安全、监控、日志、DevOps、微服务等,很多刚接触K8S的初学者,都会感到无从下手,为了能让大家系统地学习,克服这些技术难点,推出了这套K8S架构师课程。Kubernetes的发展前景 kubernetes作为炙手可热的技术,已经成为云计算领域获取高薪要掌握的重要技能,在招聘网站搜索k8s,薪资水平也非常可观,为了让大家能够了解k8s目前的薪资分布情况,下面列举一些K8S的招聘截图: 讲师介绍:  先超容器云架构师、IT技术架构师、DevOps工程师,曾就职于世界500强上市公司,拥有多年一线运维经验,主导过上亿流量的pv项目的架构设计和运维工作;具有丰富的在线教育经验,对课程一直在改进和提高、不断的更新和完善、开发更多的企业实战项目。所教学员遍布京东、阿里、百度、电网等大型企业和上市公司。课程学习计划 学习方式:视频录播+视频回放+全套源码笔记 教学服务:模拟面试、就业指导、岗位内推、一对一答疑、远程指导 VIP终身服务:一次购买,终身学习课程亮点:1. 学习方式灵活,不占用工作时间:可在电脑、手机观看,随时可以学习,不占用上班时间2.老师答疑及时:老师24小时在线答疑3. 知识点覆盖全、课程质量高4. 精益求精、不断改进根据学员要求、随时更新课程内容5. 适合范围广,不管你是0基础,还是拥有工作经验均可学习:0基础1-3年工作经验3-5年工作经验5年以上工作经验运维、开发、测试、产品、前端、架构师其他行业转行做技术人员均可学习课程部分项目截图   课程大纲 k8s+SpringCloud全栈技术:基于世界500强的企业实战课程-大纲第一章 开班仪式老师自我介绍、课程大纲介绍、行业背景、发展趋势、市场行情、课程优势、薪资水平、给大家的职业规划、课程学习计划、岗位内推第二章 kubernetes介绍Kubernetes简介kubernetes起源和发展kubernetes优点kubernetes功能kubernetes应用领域:在大数据、5G、区块链、DevOps、AI等领域的应用第三章  kubernetes中的资源对象最小调度单元Pod标签Label和标签选择器控制器Replicaset、Deployment、Statefulset、Daemonset等四层负载均衡器Service第四章 kubernetes架构和组件熟悉谷歌的Borg架构kubernetes单master节点架构kubernetes多master节点高可用架构kubernetes多层架构设计原理kubernetes API介绍master(控制)节点组件:apiserver、scheduler、controller-manager、etcdnode(工作)节点组件:kube-proxy、coredns、calico附加组件:prometheus、dashboard、metrics-server、efk、HPA、VPA、Descheduler、Flannel、cAdvisor、Ingress     Controller。第五章 部署多master节点的K8S高可用集群(kubeadm)第六章 带你体验kubernetes可视化界面dashboard在kubernetes中部署dashboard通过token令牌登陆dashboard通过kubeconfig登陆dashboard限制dashboard的用户权限在dashboard界面部署Web服务在dashboard界面部署redis服务第七章 资源清单YAML文件编写技巧编写YAML文件常用字段,YAML文件编写技巧,kubectl explain查看帮助命令,手把手教你创建一个Pod的YAML文件第八章 通过资源清单YAML文件部署tomcat站点编写tomcat的资源清单YAML文件、创建service发布应用、通过HTTP、HTTPS访问tomcat第九章  kubernetes Ingress发布服务Ingress和Ingress Controller概述Ingress和Servcie关系安装Nginx Ingress Controller安装Traefik Ingress Controller使用Ingress发布k8s服务Ingress代理HTTP/HTTPS服务Ingress实现应用的灰度发布-可按百分比、按流量分发第十章 私有镜像仓库Harbor安装和配置Harbor简介安装HarborHarbor UI界面使用上传镜像到Harbor仓库从Harbor仓库下载镜像第十一章 微服务概述什么是微服务?为什么要用微服务?微服务的特性什么样的项目适合微服务?使用微服务需要考虑的问题常见的微服务框架常见的微服务框架对比分析第十二章 SpringCloud概述SpringCloud是什么?SpringCloud和SpringBoot什么关系?SpringCloud微服务框架的优缺点SpringCloud项目部署到k8s的流程第十三章 SpringCloud组件介绍服务注册与发现组件Eureka客户端负载均衡组件Ribbon服务网关Zuul熔断器HystrixAPI网关SpringCloud Gateway配置中心SpringCloud Config第十四章 将SpringCloud项目部署到k8s平台的注意事项如何进行服务发现?如何进行配置管理?如何进行负载均衡?如何对外发布服务?k8s部署SpringCloud项目的整体流程第十五章 部署MySQL数据库MySQL简介MySQL特点安装部署MySQL在MySQL数据库导入数据对MySQL数据库授权第十六章 将SpringCLoud项目部署到k8s平台SpringCloud的微服务电商框架安装openjdk和maven修改源代码、更改数据库连接地址通过Maven编译、构建、打包源代码在k8s中部署Eureka组件在k8s中部署Gateway组件在k8s中部署前端服务在k8s中部署订单服务在k8s中部署产品服务在k8s中部署库存服务第十七章 微服务的扩容和缩容第十八章 微服务的全链监控什么是全链监控?为什么要进行全链监控?全链监控能解决哪些问题?常见的全链监控工具:zipkin、skywalking、pinpoint全链监控工具对比分析第十九章 部署pinpoint服务部署pinpoint部署pinpoint agent在k8s中重新部署带pinpoint agent的产品服务在k8s中重新部署带pinpoint agent的订单服务在k8s中重新部署带pinpoint agent的库存服务在k8s中重新部署带pinpoint agent的前端服务在k8s中重新部署带pinpoint agent的网关和eureka服务Pinpoint UI界面使用第二十章 基于Jenkins+k8s+harbor等构建企业级DevOps平台第二十一章 基于Promethues+Alert+Grafana搭建企业级监控系统第二十二章 部署智能化日志收集系统EFK 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值