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

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

监控druid 数据源

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

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

<!--阿里数据源-->
<!--<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.6</version>
</dependency>-->

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.6</version>
</dependency>

#分析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 模板,用以显示错误信息:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <h1>程序异常</h1>
    <p th:text="${mesg}"/>
</body>
</html>

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 添加补丁:

<!--解决[没有主清单属性]问题-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
<build>

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 下声明打包资源:

# 声明打包资源
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/mian/resources</directory>
        <includes>
            <include>**</include>
        </includes>
    </resource>
</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 数据源、全局异常捕获处理、项目打包

完!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容