1.1 springboot简介
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
1.1.1有了springboot 我们就可以…
1 不再需要那些千篇一律,繁琐的xml文件。
2 内嵌Tomcat,不再需要外部的Tomcat
3 更方便的和各个第三方工具(mysql,redis,elasticsearch,dubbo,kafka等等整合),而只要维护一个配置文件即可。
1.1.2 springboot和ssm的关系
springboot整合了springmvc ,spring等核心功能。
也就是说本质上实现功能的还是原有的spring ,springmvc的包,但是springboot单独包装了一层,这样用户就不必直接对springmvc, spring等,在xml中配置。
1.1.3 没有xml,我们要去哪配置
1) springboot实际上就是把以前需要用户手工配置的部分,全部作为默认项。除非用户需要额外更改不然不用配置。这就是所谓的:“约定大于配置”
2) 如果需要特别配置的时候,去修改application.properties (application.yml)
1.2 快速搭建
1.2.1 新建module
在project下增加一个Module,选择Spring Initializr
目前企业中普遍选择2.1.16,不推荐选择2.2.x
1.2.2 pom.xml
1.2.3 controller
@Controller public class Demo1Controller { @ResponseBody @RequestMapping("testDemo") public String testDemo(){ return "hello demo"; } }
1.2.4 用main方法启动tomcat
在程序中直接找到XXXXXApplication这个类
1.2.6 修改端口号
在 resources目录下的application.properties 加入
server.port=8082
1.3 springboot整合kafka
<?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.1.13.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.atguigu.gmall0105</groupId> <artifactId>gmall0105-logger</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gmall0105-logger</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <skipTests>true</skipTests> </properties> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68</version> </dependency> <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> </plugin> </plugins> </build> </project>
1.3.1 application.propeties
server.port=8082 #============== kafka =================== # 指定kafka 代理地址,可以多个 spring.kafka.bootstrap-servers=hadoop102:9092,hadoop103:9092,hadoop104:9092 # 指定消息key和消息体的编解码方式 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
更改为如下结构
1.3.2 Gmall0105LoggerApplication
package com.atguigu.gmall0105.logger.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @ComponentScan(basePackages = "com.atguigu.gmall0105.logger.controller") public class Gmall0105LoggerApplication { public static void main(String[] args) { SpringApplication.run(Gmall0105LoggerApplication.class, args); } }
1.3.3 LoggerController
package com.atguigu.gmall0105.logger.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; //@RestController //@RestController = @Controller + @ResponseBody @RestController @Slf4j public class LoggerController { // @ResponseBody 决定方法的返回值是 网页 还是 文本 //@Slf4j 会帮你补充log的声明 和 实现 的 代码 @Autowired KafkaTemplate kafkaTemplate; @RequestMapping("/applog") public String applog(@RequestBody String logString ){ //1 输出日志 System.out.println(logString); log.info(logString); // 分流 JSONObject jsonObject = JSON.parseObject(logString); if(jsonObject.getString("start")!=null&&jsonObject.getString("start").length()>0){ //启动日志 kafkaTemplate.send("GMALL_STARTUP_0105",logString); }else{ //事件日志 kafkaTemplate.send("GMALL_EVENT_0105",logString); } return logString; } }
1.3.4 logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_HOME" value="/opt/applog/gmall0105" /> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <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="com.atguigu.gmall0105.logger.controller.LoggerController" level="INFO" additivity="false"> <appender-ref ref="rollingFile" /> <appender-ref ref="console" /> </logger> <root level="error" additivity="false"> <appender-ref ref="console" /> </root> </configuration>
1.3.4创建对应的topic
kafka-topics.sh --create --topic GMALL_START --zookeeper hadoop1:2181,hadoop2:2181,hadoop3:2181 --partitions 4 --replication-factor 1
1.3.5 启动Gmall0105LoggerApplication , 启动日志Mock的生成类
用kafka进行测试
/bigdata/kafka_2.11-0.11.0.2/bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092,hadoop2:9092,hadoop3:9092 --topic GMALL_START