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