博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
220.详细整理学习spring boot
阅读量:6922 次
发布时间:2019-06-27

本文共 14475 字,大约阅读时间需要 48 分钟。

hot3.png

1.springboot是什么? 有什么用?

1.1 是什么

   一个整合常用第三方框架,简化xml配置,完全采用注解形式,内置tomcat容器,帮助开发者快速实现项目搭建,spring boot 的web组件默认集成的是springMVC框架

注意:spring boot 是一个开发框架  并不是微服务

  1.2 作用

   (1)、简化项目搭建难度

  (2) 、简化jar配置

  (3)、大大减少xml 配置

  (4)、内容tomcat容器,开发者无需配置,且端口修改特别容易

2.开发环境要求

工具(建议):idea

jdk:    Java1.8及以上

spring版本:Spring Framework 4.1.5及以上

本文采用 Spring Boot 2.1.4 版本调试通过。

3. spring boot与springMVC  及  spring boot与spring cloud的区别

3.1 spring boot 与springMVC

SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。

SpringMVC只是控制层框架。

3.2 spring boot 与spring cloud

            SpringBoot 是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件 默认集成的是SpringMVC框架。

            SpringCloud依赖与SpringBoot组件,使用SpringMVC编写Http协议接口,同时SpringCloud是一套完整的微服务解决框架

4.spring boot入门案例

4.1 下载配置 idea 环境

4.2  springboot入门demo

db24b2d528ef133717ba17b2d47e2c11f00.jpg

 

c178d94e2c63af9f91f239060801c9b3ee4.jpg

 

722c097b3feed21d7383cfe96a9694f2e7f.jpg

 

60abc4265773cbffda6576979a218c79a28.jpg

 

11977f2b2785e3e456076b7be9598702e02.jpg

 

   创建的项目 初始化样式:

b3a3c6616573376955f0ca2d2c190b0dad2.jpg

编写功能类

这里只是controller层

2b875748705a177b76d53ad18e20609d49c.jpg

 

 

 

效果:

8cff82ff5d09dd53373eb219197b4863ff2.jpg

 

相关代码:

主函数:

        

package cn.ma.spring_demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;//发现@SpringBootApplication是一个复合注解,// 包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。//该注解扫面的是该类所在包下面的所有内容 就是 @ComponentScan("cn.ma.spring_demo")@SpringBootApplication//所以 如何要访问的类包路径高于启动类的包路径是无法被访问到的public class SpringDemoApplication {    public static void main(String[] args) {        SpringApplication.run(SpringDemoApplication.class, args);    }}

 

相关方法:

/** * 公司: * 文件名:SpringDemoController * 作者:  18392 * 时间: 2019/4/24 0:07 * 描述: */package cn.ma.spring_demo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController//只能返回字符串  @RestController = @RespnoseBody+ @Controllerpublic class SpringDemoController {    /*    *1.spring boot 入门案例    * http://localhost:8080/springDemoFunction     * @Author sunshine     * @Description //TODO     * @Date 0:11 2019/4/24     * @Param []     * @return java.lang.String     **/    @RequestMapping("/springDemoFunction")    public String springDemoFunction(){        return "我是spring boot 入门demo";    }}

pom中的相关配置

4.0.0
cn.ma
spring_demo
0.0.1-SNAPSHOT
spring_demo
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
1.8
org.springframework.boot
spring-boot-maven-plugin

 

5.springboot中常用注解

(1) @RestController

                在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写Restful接口

列如下图:

            f56b6ee941c19d4fd2075e296a054e06599.jpg

(2)@EnableAutoConfiguration

    作用在于让 Spring Boot   根据应用所声明的依赖来对 Spring 框架进行自动配置

这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。

(3) @SpringBootConfiguration

            继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

 

(4)  @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理。

(5) @SpringBootApplication

   @SpringBootApplication是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。

也就是说我们可以用后3个来代替  @SpringBootApplication

如下图:

7635a9978cff8732b195942a6173e388b43.jpg

 

6. web端开发

6.1 静态资源访问

7139a1a898672e224dcd20a42d05ebe1bf8.jpg

访问效果图:

276c00dc92bfa255011c687527a4aa8a040.jpg

6.2 整合web视图

89a4834ae2f7d8e1fdc9eb154ceca803f64.jpg

6.2.1 整合freemaker

第一步:

在src/main/resources/创建一个templates文件夹,后缀为*.ftl

148b7c2ebc1beb10c56e86952ffdcab0395.jpg

第二步:引入freeMarker的依赖包

org.springframework.boot
spring-boot-starter-freemarker

059cd6bfba5717bdc9ef6627125f3c87a74.jpg

    第三步:编写后台方法

387ec4f68497ee03f6beb5741bc0dd87fdc.jpg

ddeba5ee032851145e388531ff22e67e973.jpg

第四步:编写ftl页面

51cceb64fd986f14b3b72f8fff5c3da19b4.jpg

 

6.2.2   springboot整合jsp

3b38ae8582118137516059b38b32b584124.jpg

第1步:springboot的pom中引入jsp相关jar

org.springframework.boot
spring-boot-starter-tomcat
org.apache.tomcat.embed
tomcat-embed-jasper
javax.servlet
jstl

161d6a5b29e1adb722858a4b21ba536ee9f.jpg

第2步:配置前端位置

spring.mvc.view.prefix=/WEB-INF/jsp/spring.mvc.view.suffix=.jsp

84fa6cd9f6a5169861bd775612da99beaae.jpg

 

第三步:创建静态文件防止路径   看准路径

0699667cbfaf6fe969d19d8767798e6623a.jpg

第四步:后台编写及jsp页面

b7d8be3aace7a9cc2a022e217a179c6fb97.jpg

4d9e7959544f80fe12e6e45fba565895902.jpg

效果:

7289959a79f277e0bc5e27f1ac83d91ddbe.jpg

 

7.配置全局捕获异常

7.1 自定义异常类

/** * 公司:马氏集团 * 文件名:GlobalExceptionHandler * 作者:  18392 * 时间: 2019/4/26 10:29 * 描述: */package cn.ma.spring_demo.err;import com.alibaba.fastjson.JSONObject;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;@ControllerAdvicepublic class GlobalExceptionHandler {    @ExceptionHandler(RuntimeException.class)    @RequestMapping("/exceptionHandler")    public  void exceptionHandler(HttpServletResponse response) throws IOException {        //解决乱码 及跨域        response.setContentType("text/html; charset=utf-8");        response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域        HashMap
map = new HashMap<>(); map.put("msg","系统异常!"); String msg = JSONObject.toJSONString(map); PrintWriter out = response.getWriter(); out.println(msg); out.flush(); out.close(); }}

55513d632e282f735a0bb6e5a9eddf63906.jpg

 

效果:

fd56bc411cf842bd96eb6efb02e4c4baf21.jpg

 

7bb7ef0a61c3fcef31803626696a4becc5c.jpg

8.处理日志(思想很重要  AOP)

方式有:3种   

        方式一:log4j

        方式二:

        方式三:lombok插件 打印  放在一级标题 9了(原因很好用)

8.1  log4j打印日志

(1)引入相关jar

 

(2) 定义全局变量

//log4j打印日志private static final Logger logger = LoggerFactory.getLogger(SpringDemoController.class);

9b81add31a1a636d2ee24f109bffb2a2c50.jpg

      (3) 通过log4j打印

86b582092dac8221e03b2624cae94891594.jpg

8.2 

(1)导入aop相关jar

<dependency>

             <groupId>org.springframework.boot</groupId>

             <artifactId>spring-boot-starter-aop</artifactId>

    </dependency>

c37d3e6674a2cafdca192a5f3e4121619e1.jpg

(2)  日志工具类(记得该切点路径

/** * 公司: * 文件名:HttpAspect * 作者:  18392 * 时间: 2019/4/26 11:45 * 描述: */package cn.ma.spring_demo.utils;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.util.Date;import java.util.Enumeration;/**   作用:获取用户请求*       (1)访问地址URL*       (2) 请求方式*       (3) 请求者IP*       (4) 请求方法的响应时长 * @Author sunshine * @Description //TODO * @Date 13:11 2019/4/26 * @Param * @return **/@Aspect@Componentpublic class HttpAspect {    private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);    //切点    @Pointcut("execution(public * cn.ma.spring_demo.controller.*.*(..))")    public void webLog() { }    // System.out.println();// new Date()为获取当前系统时间    long beginTime=0;//开始时间    long endTime=0;//结束时间    //前置通知    @Before("webLog()")    public void doBefore(JoinPoint joinPoint) throws Exception {        //没抽取的原因是并发的时候会导致问题 这样安全性更高        Date d = new Date();        long time = d.getTime();         beginTime =time;        // 接收到请求,记录请求内容        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        HttpServletRequest request = attributes.getRequest();        // 记录下请求内容        logger.info("访问地址URL : " + request.getRequestURL().toString());        logger.info("请求方式HTTP_METHOD : " + request.getMethod());        logger.info("访问者IP : " + request.getRemoteAddr());        Enumeration
enu = request.getParameterNames(); while (enu.hasMoreElements()) { String name = (String) enu.nextElement(); logger.info("参数name:{},参数value:{}", name, request.getParameter(name)); } } //后置通知 @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容 logger.info("返回内容RESPONSE : " + ret); Date d = new Date(); long time = d.getTime(); // long endTime = TimeUtils.getTimeGap();//没抽取的原因是并发的时候会导致问题 这样安全性更高 long endTime = time; logger.info("响应时长(单位毫秒) : " +(endTime-beginTime)); }}

22e5edb459e650feb450eda8fab3efa6b1a.jpg

效果:

2dd11e52a03e7abd657d409958c68ea96fa.jpg

9.Spring Boot集成lombok让代码更简洁

这个插件特别好用  所以用一级标题 编写

    功能:简化getXxx/setXxx方法   可以打印日志

在idea上安装教程:

https://www.cnblogs.com/hackyo/p/7998485.html

c4038893c4971a1a977f62782a29352cee8.jpg

9.1 简化getXxx/setXxx方法

效果:

dc35f85c0732d32d5a54aa0f8b8f0893915.jpg

 

ab0c368a1a6e801c79ef23ada2f004ff589.jpg

使用教程:

       (1) 引入插件

12694f1c3beb2dc6a4fc9851e0d7d51a268.jpg

  (2) 实体类上添加注解

@Slf4j@Data

8e3f86dc4dfc819be2ec1aaf49e437998ae.jpg

测试:

        d260cd74026eb74bf23fd3c4d6ddeb30956.jpg

 

9.2 插件的其他注解

@Data 标签,生成getter/setter toString()等方法

@NonNull : 让你不在担忧并且爱上NullPointerException

@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法

@Setter/@Getter : 自动生成set和get方法

@ToString : 自动生成toString方法

@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现

@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor

自动生成构造方法

@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法

@Value : 用于注解final类

@Builder : 产生复杂的构建器api类

@SneakyThrows : 异常处理(谨慎使用)

@Synchronized : 同步方法安全的转化

@Getter(lazy=true) :

@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

 

10. springboot整合 mybaties

1. 搭建springboot项目

446287b9a4e272d997fa6f486730c405f22.jpg

4f3c87e605d7f0e616549cf250004e67198.jpg

3b3336af7c50bfa9ac8d8d940c8d26c7e6a.jpg

b984444b7fa42fa4ca63c891656e48f5107.jpg

 

c18aef9465daa29bce06cd5e27edf7a56d8.jpg

(2)pom中配置jar

9c7936c67d7d8a3c5323a1ed02b0b74793c.jpg

非常重要:

        44a39a5f9aaed55e3dd7157ae07d29f566e.jpg

(3) 配置数据源

spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springbootspring.datasource.username=rootspring.datasource.password=root

aeb63bc1e8a8439e1e6d53279b58fac85d4.jpg

(4) 创建3层包

49d2962047f5ca3c5987577b99d86ab6d17.jpg

(5) 三层代码

  5.1 controller层

917c612c7d624480f3066da19662dc484b7.jpg

5.2 业务层 

业务层接口:

            d2bb7986e414df635be964bd9591768569c.jpg

        业务层实现类:

fe3ef41f4c79e92097cd50ad8785525146d.jpg

持久岑:

    持久岑接口:

2b15a999b9a8d371bdaacec63f32783c94f.jpg

持久岑xml文件:

4129cbf12ca461f1e2de139aebef2b44ad7.jpg

注意 配置扫包:

0e9af8939adde6d922511b444f0f9106d2f.jpg

 

项目搭建好后的测试:

                9648bae135b36abcb8bdfff32838a5096b0.jpg

代码:

        码云:

        百度云:

                链接:https://pan.baidu.com/s/1oPJ2ms9t-6yY27HPxB11TA 

                提取码:2ovl 

11.springboot定时任务

只需要web的相关jar   不需要添加任何其他的jar

@EnableScheduling//开启spring定时任务
//  http://cron.qqe2.com///@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行public void reportCurrentTime() {    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");    System.out.println("现在时间:" + dateFormat.format(new Date()));}

299620decab2576ced56be25887e9fd1979.jpg

 

 

11.问题整理

11.1 端口被占用

af51753320988663b1f97512da1ba938278.jpg

 

11.2 乱码 及跨域 (重复代码 使用AOP解决

//解决乱码 及跨域response.setContentType("text/html; charset=utf-8");response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域

8b17fbb388507d4bded1270f82eccd3fb07.jpg

11.3 通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO

解决方案代码:

#2.统一配置实体类包路径mybatis.type-aliases-package=cn.guang.springboot_mybites.domain

错误效果:

b2b380e8c4ac0c75127d383d19ac618c73b.jpg

配置位置:

4ce0a53b42dbd5e763a2d649ebc31dd72d7.jpg

11.4 开始驼峰式命名

#3.开启驼峰命名mybatis.configuration.map-underscore-to-camel-case=true

问题效果:

0b3312970a2d2da15bacf13dc837dac9e30.jpg

开始后的效果:

2d5a799527ae54ab0cc01d83998c8c26330.jpg

11.5 xml静态资源 扫包 及放行

扫包:

@MapperScan("cn.guang.springboot_mybites.mapper")//扫描xml文件路径

bdfb293bea14058facdd86bc4248a0c26b4.jpg

xml 资源放行:(注意代码 编写的位置)

src/main/java
**/*.xml
true

d03d66d335ea595abbb148c8c2be83de497.jpg

e16021605d2a18922e993657fd3f38d7dbf.jpg

 

12. springboot定时任务

@EnableScheduling//开启spring定时任务
//  http://cron.qqe2.com///@Scheduled(cron="0 * * * * ?")// 间隔1分钟执行@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行public void reportCurrentTime() {    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");    System.out.println("现在时间:" + dateFormat.format(new Date()));}

4da3dd8b1f8a128701260f40b973c70faea.jpg

 

13.springboot拦截器配置

效果:

6055866379884eae686d6b6e983dca5de6a.jpg

13.1 自定义拦截器类

/** * 公司:马氏集团 * 文件名:LoginIntercept * 作者:  18392 * 时间: 2019/4/28 22:35 * 描述: */package cn.guang.boottime.utils;import org.springframework.stereotype.Component;import org.springframework.util.StringUtils;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;    /*    *  自定义拦截器类    *  放行注册  验证码   登录等方法     * @Author sunshine     * @Description //TODO     * @Date 22:49 2019/4/28     * @Param     * @return     **/@Componentpublic class LoginIntercept implements HandlerInterceptor {    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        //解决乱码 及跨域                response.setContentType("text/html; charset=utf-8");                response.setHeader("Access-Control-Allow-Origin", "*");//解决json跨域        //自己进行改造   到时候  判断session区域中是否存在用户  存在放行 否则到登录页面        System.out.println("开始拦截");        String token = request.getParameter("token");        if (StringUtils.isEmpty(token)) {            response.getWriter().println("请先登录");//实际上要跳转页面的            return false;        }        return true;    }}

e04cd7b3aa5c68e2577d9ebbe27d14930ac.jpg

 

13.2 配置启动 自定义拦截器类

/** * 公司:马氏集团 * 文件名:WebConfig * 作者:  18392 * 时间: 2019/4/27 22:27 * 描述: */package cn.guang.boottime.utils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** 用于配置启动 自定义拦截器类 * @Author sunshine * @Description //TODO * @Date 22:57 2019/4/28 * @Param * @return **/@Configurationpublic class WebConfig implements  WebMvcConfigurer  {    @Autowired    private LoginIntercept loginIntercept;//自己定义的    // 这个方法是用来配置静态资源的,比如html,js,css,等等    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) { }    // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效    @Override    public void addInterceptors(InterceptorRegistry registry) {        // addPathPatterns("/**") 表示拦截所有的请求,        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问        registry.addInterceptor(loginIntercept).addPathPatterns("/**").excludePathPatterns("/login", "/register");    }}

 

71b4d59dee5247f30f36c7030c010d54b2b.jpg

 

13.3  改造为登录 代码

效果:

未登录前:

efaab854f8bf1b0cce54846e5ee293d8a55.jpg

6cdf61b7919e8f508a6ec4190f8fead3447.jpg

 

登录成功 可以访问其他方法

589510d634e839584c63ab658d05105dd77.jpg

 

代码编写:

(1) 配置数据源

(2) 新建 实体类

(3) 三层代码编写   controller层简单处理一下业务

 

6fdb78468895310e193f5940ce55e38e274.jpg

 

附上代码

码云:

百度云:

        链接:https://pan.baidu.com/s/1aoZAlIlr9bBVwguJ_hVGPg 

        提取码:saex 

14. 配置静态资源变量

//注入配置变量@Value("${ip}")private  String ip;

 

效果:

6881d7a32783386cdb4e97191db9cd3b41c.jpg

 

f3af0d7d83c5f25c94511ebc8f23e13569e.jpg

 

开发步骤:

(1) 配置文件中定义变量

3d01bf111c7c7f10e95765f0e358b90ed85.jpg

(2) 子需要的类中注入变量对象

0d494bb17353988bc6ad7198b025379e225.jpg

(3) 需要的地方调用

   9664bf8ab6cff3d4b3ef83755247ab8e6f4.jpg

15.springboot 事务配置及应用

效果:

5b25a2ba34114005c1e6b8840c77ea7b8a9.jpg

很简单  只要在需要事务的方法上加上事务注解即可

@Transactional//开启事务注解

985a8eebd77183b2193253c41675c8cfa62.jpg

16. 使用热部署插件  devtools

 

参考:

    

 

效果:当后台代码改变的时候 该插件帮助我们自动重启服务

配置步骤:

(1) 添加相关jar

org.springframework.boot
spring-boot-devtools
true
true
true

539c5d2f65a47ff8e0dffc70497556c8ed2.jpg

(2) 设置里面加上自动编译

25d960d8ce14de36805d0fcde235d3dfe46.jpg

de80590fb754370d495919b1140d8dd299e.jpg

 

效果:

4d0b9c368fe10491729725db7851f162309.jpg

转载于:https://my.oschina.net/springMVCAndspring/blog/3041550

你可能感兴趣的文章
我的友情链接
查看>>
LAMP+LVS+KEEPALIVED(五)
查看>>
uboot的作用和启动方式
查看>>
1.2关系数据库
查看>>
SpringCloud
查看>>
RHEL主机安全检查机制: TCP Wrappers、Xinetd
查看>>
泛型编程之类模板
查看>>
salt安装
查看>>
linux运维基础1
查看>>
Hyper-V Server虚拟机移动性
查看>>
Visual Studio 2014 预览版 CTP3 发布了!可以下载
查看>>
protoc 在linux下的安装
查看>>
jq上百个input 做提交不能为空的验证
查看>>
网络篇
查看>>
全面详解Linux日志管理技巧
查看>>
翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
查看>>
去中心化访问HTTP服务集群
查看>>
C语言switch语句的用法详解
查看>>
Linux系统和用户界面 中英文语言修改
查看>>
ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
查看>>