微架构 springcloud-06. springboot-监控druid 数据源、异常全局捕获、打包

监控druid 数据源、异常全局捕获、打包

监控druid 数据源

从第[4]节开始,开始使用到druid连接池,也称阿里数据源。Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。

01 针对springboot,阿里特地编写了与之更完美契合的druid,命名为:druid-spring-boot-starter,故替换之前的druid依赖:





    com.alibaba
    druid-spring-boot-starter
    1.1.6


#分析maven依赖关系可知druid-spring-boot 依赖 druid:
com.alibaba:druid-spring-boot-starter:1.1.6
    com.alibaba:druid:1.1.6
# 特别注意,从maven 仓库查询可知,最新版本已经更新到1.1.7,不过并不使用此版本(1.5.10)springboot,故选择1.1.6版本

02 application.properties 重写连接池相关配置:

######Druid数据源配置######
# JDBC配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=true
spring.datasource.username=root
spring.datasource.password=root

# 连接池配置
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=30

######Druid监控配置######
#是否启用StatFilter默认值true
spring.datasource.druid.web-stat-filter.enabled=true
#IP 白名单
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
#IP 黑名单
#spring.datasource.druid.stat-view-servlet.deny=192.168.0.101
#监控地址,默认 /druid/*
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#哪些资源配置监控:主要只静态资源和监控地址本身
spring.datasource.druid.WebStatFilter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid123123

# 其他配置参考:
https://github.com/alibaba/druid/blob/master/druid-spring-boot-starter/src/test/resources/config-template.properties

03 App.main() 方法重启服务,浏览器访问:http://localhost:8080/druid,重定向到登陆:http://localhost:8080/druid/login.html,输入 用户名/密码 登陆:

# spring.datasource.druid.stat-view-servlet.login-username=druid
# spring.datasource.druid.stat-view-servlet.login-password=druid123123

用户名:druid
密  码:druid123123

04 登陆成功后,即可点击相关链接查看监控,

点击【数据源】【SQL监控】查看相关信息,但是由于是项目刚启动的原因,数据源、SQL执行信息等有可能还没有。

05 新开标签页访问:http://localhost:8080/emp/empList

页面打印所有员工信息 ……
控制台打印 {dataSource-1} inited 即数据源初始化成功

06 再次切换到数据源监控页面:

点击【数据源】 => 查看当前数据源情况
点击【SQL监控】=> 查看监控到的执行的SQL 语句:
    SELECT EMPNO, ENAME, JOB, MGR, HIREDATE
        , SAL, COMM, DEPTNO
    FROM emp
以及其他结果及信息

07 IP 白名单,它的作用就是允许哪些IP地址访问druid 监控系统,查看本地IP信息:

C:\Users\wu-chao>ipconfig
以太网适配器 VirtualBox Host-Only Network #2:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::483b:c388:57c2:8bfb%19
   IPv4 地址 . . . . . . . . . . . . : 192.168.56.1
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :
   
无线局域网适配器 WLAN:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::2c84:6476:91c6:273%22
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.100
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.1
   
C:\Users\wu-chao>ping 192.168.56.1

正在 Ping 192.168.56.1 具有 32 字节的数据:
来自 192.168.56.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.56.1 的回复: 字节=32 时间<1ms TTL=64

192.168.56.1 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
Control-C

C:\Users\wu-chao>ping 192.168.0.100

正在 Ping 192.168.0.100 具有 32 字节的数据:
来自 192.168.0.100 的回复: 字节=32 时间<1ms TTL=64

192.168.0.100 的 Ping 统计信息:
    数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
Control-C
^C
C:\Users\wu-chao>

# 故:192.168.56.1,192.168.0.100 都是本机的ip地址而且本机都可以ping通。

08 浏览器访问:192.168.56.1:8080/emp/empList

#页面打印
员工信息……,正常访问!

09 浏览器新建标签页:访问:192.168.56.1:8080/druid

#页面打印
Sorry, you are not permitted to view this page.
# 即:不被允许访问这个页面!

数据源的信息涉及到后台很多内容,极为敏感,是不能任由人访问的。那么,localhost 为什么可以呢? 查看:C:\Windows\System32\drivers\etc\hosts,可知localhost 是本地ip 127.0.0.1 的本地域名,故localhost访问即127.0.0.1 访问!

10 当然,反过来,也可以对黑名单进行配置。完!

异常全局捕获

概述: 熟悉SpringMVC的程序员都知道springMVC 可以全局性的捕获异常,那么springboot 是如何实现的呢!

01 新建templates/Error.html 模板,用以显示错误信息:




    
    Title


    

程序异常

02 新建 person.jack.exception.GlobalExceptionHandler 异常处理类:

@ControllerAdvice
public class GlobalExceptionHandler{

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultExceptionHandler(Exception e){
        e.printStackTrace();
        ModelAndView mv = new ModelAndView();
        mv.setViewName("Error");
        mv.addObject("mesg", e.getMessage());
        return mv;
    }
}

# 所以,异常处理还是Spring AOP 通知!

03 在EmpController 添加RequestMapping 方法:

@Controller
@RequestMapping("/emp")
public class EmpController {
    ……
    
    @RequestMapping("/testError")
    public String testError(){
        String str = "12345";
        System.out.println(str.charAt(5));
        return "ok";
    }
}
# 很明显,str.charAt(5),5 这个索引是不存在的,故范文此请求会报索引越界错误!

04 浏览器访问:http://localhost:8080/emp/testError

#页面打印

程序异常
String index out of range: 5

#后台打印异常栈信息:
java.lang.StringIndexOutOfBoundsException: String index out of range: 5
    at java.lang.String.charAt(String.java:658)
    at person.jack.controller.EmpController.testError(EmpController.java:26)
…………

05 这就是Springboot 对全局异常信息的统一处理!完!

打包

概述:springboot 已经大大简化了我们的配置,以Java项目启动,由我们的开发过程可知,容器(如:tomcat)已经内嵌,那么在正式环境中如何部署呢?不可能打开IDE启动main 函数以启动服务吧?者,当然不会!springboot 通过maven工程将项目打包成jar包部署,具体操作如下(当然前提是maven 相关配置无误的情况下):

01 IDEA 打开maven 视图 > Lifecycle > clean,先将已部署的项目除。

02 Lifecycle > package 即开始打包

# 控制台打印
……
[INFO] Building jar: D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
……

# 打包成功!

03 根据上一步的打印信息,打开命令行(cmd)运行,启动服务:

C:\Users\wu-chao>java -jar D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar
D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar中没有主清单属性

C:\Users\wu-chao>

# 运行失败,报:没有主清单属性,这是打包时缺少相关依赖所致,pom.xml 添加补丁:



    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                
                    
                        repackage
                    
                
            
        
    

04 Lifecycle > clean,再package,重新清除、打包
05 java -jar 重新启动服务:

C:\Users\wu-chao>java -jar D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.10.RELEASE)
 ……
 ……
 Cannot determine embedded database driver class for database type NONE
 ……
 # 刚开始激动了一下,最终还是失败:Cannot determine embedded database driver class for database type NONE
 # 大意是去烧数据库配置,可我们的数据库是配置了的,而且在IDE中运行时没有问题

06 分析问题:进入target\classes 目录,检查打包后的资源:

C:\Users\wu-chao>D:
D:> cd D:\Workspaces\springboot_mybaties\target\classes
D:\Workspaces\springboot_mybaties\target\classes>tree /F
卷 Lenovo 的文件夹 PATH 列表
卷序列号为 305D-9D05
D:.
│  application.properties
│
├─person
│  └─jack
│      │  App.class
│      │
│      ├─bean
│      │      Dept.class
│      │      DeptMapper.xml
│      │      Emp.class
│      │      EmpMapper.xml
│      │
│      ├─controller
│      │      EmpController.class
│      │
│      ├─dao
│      │      DeptMapper.class
│      │      EmpMapper.class
│      │
│      └─exception
│              GlobalExceptionHandler.class
│
└─templates
        empList.html
        Error.html
        ok.html


D:\Workspaces\springboot_mybaties\target\classes>
# 分析可知,application.properties 配置文件并没有打包进来,如何解决呢?

07 pom.xml build 下声明打包资源:

# 声明打包资源

    
        src/main/java
        
            **/*.xml
        
    
    
        src/mian/resources
        
            **
        
    

08 关闭cmd,idea clean->package,重新清除、打包,完成后重新打开cmd 切入目录查看资源:

D:\Workspaces\springboot_mybaties\target>tree classes /F
卷 Lenovo 的文件夹 PATH 列表
卷序列号为 00000029 305D:9D05
D:\WORKSPACES\SPRINGBOOT_MYBATIES\TARGET\CLASSES
│  application.properties
│
├─person
│  └─jack
│      │  App.class
│      │
│      ├─bean
│      │      Dept.class
│      │      DeptMapper.xml
│      │      Emp.class
│      │      EmpMapper.xml
│      │
│      ├─controller
│      │      EmpController.class
│      │
│      ├─dao
│      │      DeptMapper.class
│      │      EmpMapper.class
│      │
│      └─exception
│              GlobalExceptionHandler.class
│
└─templates
        empList.html
        Error.html
        ok.html


D:\Workspaces\springboot_mybaties\target>

# 观察可知:resources下 application.properties、templates都成功打包

09 java -jar D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar 尝试重启服务:

D:\Workspaces\springboot_mybaties\target>java -jar D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.10.RELEASE)

2018-02-08 20:22:30.671  INFO 29980 --- [           main] person.jack.App                          : Starting App v1.0-SNAPSHOT on LAPTOP-TJDLNJHK with PID 29980 (D:\Workspaces\springboot_mybaties\target\springboot_mybaties-1.0-SNAPSHOT.jar started by wu-chao in D:\Workspaces\springboot_mybaties\target)
……
2018-02-08 20:22:38.221  INFO 29980 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-02-08 20:22:38.233  INFO 29980 --- [           main] person.jack.App                          : Started App in 8.212 seconds (JVM running for 9.158)

# 服务启动成功!

10 保持cmd打开,不要关闭,浏览器尝试访问:http://http://localhost:8080/emp/empList

页面打印员工信息……,通过测试!

11 打包完成!将此jar包复制到其他路劲下,测试可知服务也是可以启动的:

# 将 springboot_mybaties-1.0-SNAPSHOT.jar 复制到E盘根目录,并重命名为springboot_mybaties.jar
# cmd 切换到E盘,java -jar:

E:\>java -jar springboot_mybaties.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.10.RELEASE)

2018-02-08 20:41:03.576  INFO 28824 --- [           main] person.jack.App                          : Starting App v1.0-SNAPSHOT on LAPTOP-TJDLNJHK with PID 28824 (E:\springboot_mybaties.jar started by wu-chao in E:\)

2018-02-08 20:41:09.320  INFO 28824 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Located MBean 'statFilter': registering with JMX server as MBean [com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter]
2018-02-08 20:41:09.418  INFO 28824 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)

# 启动成功!

12 浏览器尝试访问:http://http://localhost:8080/emp/empList

# 页面打印员工信息……,通过测试!

以上就是:springboot 监控druid 数据源、全局异常捕获处理、项目打包

完!

你可能感兴趣的:(微架构 springcloud-06. springboot-监控druid 数据源、异常全局捕获、打包)