• 项目数据准备


    1、日志数据模拟生成

    这里模拟日志的思路和采集一样,但是并没有直接将日志生成到文件,而是将日志发送给某一个指定的端口,需要大数据程序员了解流程

    (1)    拷贝模拟器(用户行为)内容到hadoop201的/opt/module/rt_applog目录

    -rw-rw-r--. 1 hui hui      607 Apr 24 05:07 application.properties
    drwxrwxr-x. 2 hui hui       51 Apr 24 05:07 gmall2020
    -rw-rw-r--. 1 hui hui 11114596 Dec 17  2020 gmall2020-mock-log-2020-05-10.jar
    -rw-rw-r--. 1 hui hui     3220 Dec 17  2020 logback.xml
    drwxrwxr-x. 2 hui hui       62 Apr 24 00:39 logs
    -rw-rw-r--. 1 hui hui      493 Dec 17  2020 path.json

    (2)    根据实际需要修改application.properties

    [hui@hadoop201 rt_applog]$ less application.properties
    # 外部配置打开
    logging.config=./logback.xml
    
    #业务日期
    mock.date=2022-04-23
    
    #模拟数据发送模式
    mock.type=http
    #http模式下,发送的地址
    mock.url=http://localhost:80/applog

    (3)    使用模拟日志生成器的jar 运行

    [hui@hadoop201 rt_applog]$ java -jar gmall2020-mock-log-2020-05-10.jar 

    2、开发SparingBoot 采集模拟生成的日志

    2.1、SpringBoot 简介

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

    • 不再需要那些千篇一律,繁琐的xml文件。
    • 内嵌Tomcat,不再需要外部的Tomcat
    • 更方便的和各个第三方工具(mysql,redis,elasticsearch,dubbo,kafka等等整合),而只要维护一个配置文件即可。

    Springboot 和 ssm 的关系:springboot整合了springmvc ,spring等核心功能。也就是说本质上实现功能的还是原有的spring ,springmvc的包,但是springboot单独包装了一层,这样用户就不必直接对springmvc, spring等,在xml中配置。

    SpringBoot 配置文件:Springboot实际上就是把以前需要用户手工配置的部分,全部作为默认项。除非用户需要额外更改不然不用配置。这就是所谓的:“约定大于配置”如果需要特别配置的时候,去修改application.properties  (application.yml)

    2.2、创建空的父工程gmall2020-parent,用于管理后续所有的模块module

    我们这里就是为了将各个模块放在一起,但是模块彼此间还是独立的,所以创建一个Empty Project即可;如果要是由父module管理子module,需要将父module的pom.xml文件的<packaging>设置为pom

     

    创建SpringBoot 项目

     (1)    父project下创建创建SprintBoot项目

    (2)    配置项目名称gmall2020-logger

    (3)    选择版本以及通过勾选自动添加依赖

     

     (4)    完成之后开始下载依赖,完整的pom.xml文件如下

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.6.7</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>org.wdh01.logger</groupId>
        <artifactId>gmall0423-logger</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>gmall0423-logger</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.kafka</groupId>
                <artifactId>spring-kafka</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.kafka</groupId>
                <artifactId>spring-kafka-test</artifactId>
                <scope>test</scope>
            </dependency>
           </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                            </exclude>
                        </excludes>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <!--修改版本-->
                    <version>3.1.0</version>
                </plugin>
    
            </plugins>
        </build>
    
    </project>

    (5)    在Idea中安装Lombok插件

    (6)    创建LoggerController接收来自/applog的日志

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 接收模拟器生成的日志数据并进行处理
     */
    
    //@RestController = Controller + ResponseBody,方法返回 Object,底层转换为JSON字符串进行响应
    @RestController //将对象的创建交由 Spring 容器
    @Slf4j
    public class LoggerController {
    
        @Autowired //Autowired 将 kafkaTemplate 注入到 Controller 中
                KafkaTemplate kafkaTemplate;// Springboot 对 kafka 支持
    
        //http://localhost:8080/applog
    
        //声明方法处理生成的日志数据
    
        // @RequestMapping("/applog") //将 /applog 交由该方法处理
        //@RequestBody 从请求体中获取数据
        @RequestMapping("/applog")
        public String applog(@RequestBody String mockLog) {
            //System.out.println(mockLog);
            log.info(mockLog);
            //根据日志内容判断日志类型并发送到不同的主题中
            //将日志转换为 json对象
            JSONObject jsonObject = JSON.parseObject(mockLog);
            JSONObject startJson = jsonObject.getJSONObject("start");
            if (startJson != null) {
                //启动日志
                kafkaTemplate.send("gmall_start_0423", mockLog);
            } else {
                //事件日志
                kafkaTemplate.send("gmall_event_0423", mockLog);
            }
            return "success";
        }
    }

    2.3、logBack 的使用

    (1)    在LoggerController上加@Slf4j注解,并通过log.info记录日志

    @RestController //将对象的创建交由 Spring 容器
    @Slf4j //引入 logBack
    public class LoggerController {

    (2)    在gmall2020-logger的resources中添加logback.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <!--LOG_HOME 日志落盘路径,window 运行是 落到项目所在根目录下 /opt/module/rt_gmall -->
        <property name="LOG_HOME" value="/opt/module/rt_gmall" />
        <!--appender name="console"  控制台输出 -->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%msg%n</pattern>
            </encoder>
        </appender>
        <!--appender name="rollingFile"  文件滚动 -->
        <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_HOME}/app.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%msg%n</pattern>
            </encoder>
        </appender>
    
    
        <!-- 将某一个包下日志单独打印日志 -->
        <logger name="org.wdh01.logger.controller.LoggerController"
                level="INFO" additivity="false">
            <appender-ref ref="rollingFile" />
            <appender-ref ref="console" />
           <!-- org.wdh01.gmall.controller.LoggerControlle 这个类的日志即控制台输出,也进行滚动落盘-->
        </logger>
    
        <root level="error" additivity="false">
            <appender-ref ref="console" />
        </root>
    </configuration>

    (3)    logback配置文件说明

    appender

    追加器,描述如何写入到文件中(写在哪,格式,文件的切分)

    • ConsoleAppender--追加到控制台
    • RollingFileAppender--滚动追加到文件

    logger

    控制器,描述如何选择追加器

    注意:要是单独为某个类指定的时候,别忘了修改类的全限定名

    日志级别

    TRACE          [DEBUG INFO     WARN   ERROR]        FATAL

    2.4、SpringBoot 打包单部署集群

    (1)    在hadoop201 的/opt/module目录下创建rt_gmall目录

    [hui@hadoop201 module]$ pwd
    /opt/module
    [hui@hadoop201 module]$ mkdir rt_gmall

    (2)    Idea中修改application.properties端口号

    #============== kafka ===================
    # 指定kafka 代理地址,可以多个
    spring.kafka.bootstrap-servers=hadoop201:9092,hadoop202:9092,hadoop203:9092
    # 指定消息key和消息体的编解码方式
    spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
    spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
    #----------port---------
    server.port=8989

    因为在ZooKeeper从3.5开始,AdminServer的端口也是8080

    (3)    打包

     上传

    [hui@hadoop201 rt_gmall]$ pwd
    /opt/module/rt_gmall
    [hui@hadoop201 rt_gmall]$ ll
    total 33508
    -rw-rw-r--. 1 hui hui    63208 Apr 24 05:07 app.log
    -rw-rw-r--. 1 hui hui 34246128 Apr 23 21:30 gmall0423-logger-0.0.1-SNAPSHOT.jar

    3、Nginx  反向负载均衡日志服务

    3.1、Nginx 简介

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    Nginx 是由俄罗斯人 Igor Sysoev 采用C语言开发编写的,第一个公开版本0.1.0发布于2004年10月4日。

    Igor Sysoev出生于1970年的阿拉木图(哈萨克斯坦共和国城市),也就是前苏联。1991年苏联解体,哈萨克斯坦宣布独立,Nginx作者1994年毕业于莫斯科国立鲍曼技术大学;毕业后继续在莫斯科工作和生活,就职于NGINX,Inc,任CTO。https://www.nginx.com/

    正向代理&反向代理

    正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

    Nginx 安装

    1、安装环境准备

    sudo yum -y install openssl openssl-devel pcre pcre-devel zlib zlib-devel gcc gcc-c++

     2、解压 nginx

    [hui@hadoop201 software]$ tar -zxvf nginx-1.12.2.tar.gz 

    3、进入解压缩目录,执行安装

    [hui@hadoop201 nginx-1.12.2]$ 
    ./configure   --prefix=/opt/module/nginx
    make && make install

    安装成功后,/opt/module/nginx目录下结构

    drwxrwxr-x. 2 hui hui 4096 Apr 24 04:58 conf
    drwxr-xr-x. 2 hui hui   40 Apr 24 04:15 html
    drwxrwxr-x. 2 hui hui   58 Apr 24 04:59 logs
    drwxrwxr-x. 2 hui hui   19 Apr 24 04:15 sbin

    启动 

    在/opt/module/nginx/sbin目录下执行  ./nginx

    如果在hui用户下面启动会报错

    原因:nginx占用80端口,默认情况下非root用户不允许使用1024以下端口

    解决:让当前用户的某个应用也可以使用1024以下的端口

    sudo setcap cap_net_bind_service=+eip /opt/module/nginx/sbin/nginx

    注意:要根据自己的实际路径进行配置

    ps -ef |grep nginx

    ./nginx  -s reload

    ./nginx  -s  stop

    3.2、Nginx 配置

    在server内部配置
    location /applog{
    proxy_pass http://www.logserver.com;
    }
    在server外部配置反向代理
    upstream www.logserver.com{
            server hadoop201:8989 weight=1;
            server hadoop202:8989 weight=2;
            server hadoop203:8989 weight=3;
        }

    (1)    将日志采集的模块jar包同步到hadoop202和hadoop203

    [hui@hadoop201 module]$ sxync.sh rt_gmall/

    (2)    集群群起脚本 将采集日志服务(nginx和采集日志数据的jar启动服务)放到脚本

    #!/bin/bash
    JAVA_BIN=/opt/module/jdk1.8/bin/java
    APPNAME=gmall0423-logger-0.0.1-SNAPSHOT.jar
     
    case $1 in
     "start")
       {
     
        for i in hadoop202 hadoop203 hadoop201
        do
         echo "========: $i==============="
        ssh $i  "$JAVA_BIN -Xms32m -Xmx64m  -jar /opt/module/rt_gmall/$APPNAME >/dev/null 2>&1  &"
        done
         echo "========NGINX==============="
        /opt/module/nginx/sbin/nginx
      };;
      "stop")
      { 
         echo "======== NGINX==============="
        /opt/module/nginx/sbin/nginx  -s stop
        for i in  hadoop202 hadoop203 hadoop201
        do
         echo "========: $i==============="
         ssh $i "ps -ef|grep $APPNAME |grep -v grep|awk '{print \$2}'|xargs kill" >/dev/null 2>&1
        done
      };;
       esac 
  • 相关阅读:
    [Leetcode] Two Sum
    [Leetcode] 4Sum
    [Leetcode] Word Break
    [Leetcode] Evaluate Reverse Polish Notation
    [Leetcode] Distinct Subsequences
    [Leetcode] Triangle
    [Leetcode] Single Number II
    [Leetcode] Convert Sorted Array to Binary Search Tree
    一起手写吧!Promise!
    一起手写吧!sleep函数!
  • 原文地址:https://www.cnblogs.com/wdh01/p/16183709.html
Copyright © 2020-2023  润新知