监控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 数据源、全局异常捕获处理、项目打包