zoukankan      html  css  js  c++  java
  • Springboot Actuator之一:执行器Actuator入门介绍

    介绍

    Spring Boot有四大神器,分别是auto-configuration、starters、cli、actuator,本文主要讲actuator。actuator是spring boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看、相关功能统计等。

    如何使用

    在pom文件中添加spring-boot-starter-actuator依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

    启动应用,日志里会打印actuator相关信息如下,

    没有spring-boot-starter-actuator依赖之前如下,

    Actuator功能点说明

    Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况。有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何组装在一 起的,掌握应用程序可以获取的环境属性信息,获取运行时度量信息的快照…… Actuator提供了13个端点,具体如表7-1所示。 

    /info端点显示应用程序的基本描述

    /info,这个endpoint显示应用程序的基本描述,在之前的实践例子中我们看过它的返回信息,属性值来自appliaction.properties,同时也可以使用占位符获取pom.xml文件中的信息。任何以info.开头的属性都会在访问http://localhost:8080/info时显示。

    例如/info:首先在application.properties文件中添加对应的属性值,符号@包围的属性值来自pom.xml文件中的元素节点。

    info.build.artifact=@project.artifactId@
    info.build.name=@project.name@
    info.build.description=@project.description@
    info.build.version=@project.version@

    要获取配置文件中的节点值,需要在pom文件中进行一定的配置,首先在<build>节点里面添加:

    <resources>
     <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
     </resource>
    </resources>

    然后在<plugins>节点里面增加对应的插件:

    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-resources-plugin</artifactId>
     <version>2.6</version>
     <configuration>
        <delimiters>
           <delimiter>@</delimiter>
        </delimiters>
        <useDefaultDelimiters>false</useDefaultDelimiters>
     </configuration>
    </plugin>

    然后运行应用程序,访问http://localhost:8080/info,可以看到下列信息

    • /env提供应用程序的环境变量,如果你在调试时想知道某个配置项在运行时的值,可以通过这个endpoint访问——访问http://localhost:8080/env,可以看到很多方面的配置,例如,class path resources—[tomcat.https.properties]、applicationConfig—[classpath:/application.properties]、commonsConfig、systemEnvironment、systemProperties等。
      这些变量的值由Environment实例中的PropertySource实例保存,根据这些属性值所在的层次,有可能在运行时已经做了值替换,跟配置文件中的不一样了。为了确认某个属性的具体值,例如book.count.rate属性,可以访问http://localhost:8080/env/book.counter.rate来查询,如果跟配置文件中的不一样,则可能是被系统变量或者命令行参数覆盖了。EnvironmentEndpoint类负责实现上述功能,有兴趣可以再看看它的源码;
    • /configprops提供不同配置对象,例如WebConfiguration.TomcatSslConnectionProperties,它与/env不同的地方在于它会表示出与配置项绑定的对象。尝试下访问http://localhost:8080/configprops,然后在网页中查询custom.tomcat.https,可以看到我们之前用于配置TomcatSslConnector对象的属性值(参见:让你的Spring Boot工程支持HTTP和HTTPS)。

      TomcatSslConnector对应的属性值
    • /autoconfig以web形式对外暴露AutoConfiguration 信息,这些信息的解释可以参考Spring Boot:定制自己的starter一文,这样我们就不需要通过“修改应用程序的日志级别和查看应用的启动信息”来查看应用的自动配置情况了。
    • /beans,这个endpoint列出所有由Spring Boot创建的bean。

      /beans显示所有Spring Boot创建的bean
    • /mappings,这个endpoint显示当前应用支持的URL映射,该映射关系由HandlerMapping类维护,通过这个endpoint可以查询某个URL的路由信息。

      /mappings查看URL映射
    • /health提供应用程序的健康状态,或者是某个核心模块的健康状态

    /health端点所提供的所有信息都是由一个或多个健康指示器提供的。表7-3列出了Spring Boot 自带的健康指示器:

    • /metrics,这个endpoint查看应用程序的度量值

    下表 /metrics端点报告的度量值和计数器,

    /metrics端点会返回所有的可用度量值,但你也可能只对某个值感兴趣。要获取单个值,请 求时可以在URL后加上对应的键名。例如,要查看空闲内存大小,可以向/metrics/mem.free发一 个GET请求:

    垃圾收集器

     

    http

    counter.status后的值是HTTP状态码,随后是所请 求的路径。举个例子,counter.status.200.metrics表明/metrics端点返回200(OK)状态码 的次数。 HTTP的度量信息在结构上也差不多,却在报告另一类信息。它们全部以gauge.response开头, 表明这是HTTP响应的度量信息。前缀后是对应的路径。度量值是以毫秒为单位的时间,反映了 近处理该路径请求的耗时。举个例子,代码清单7-6里的gauge.response.beans说明上一次 请求耗时169毫秒。 这里还有几个特殊的值需要注意。root路径指向的是根路径或/。

    star-star代表了那些Spring 认为是静态资源的路径,包括图片、JavaScript和样式表,其中还包含了那些找不到的资源。这就 是为什么你经常会看到counter.status.404.star-star,这是返回了HTTP 404 (NOT FOUND) 状态的请求数。 

     

    /trace追踪Web请求

    /trace端点能报告所有Web请求的详细信息,包括请求方法、路径、时间戳以及请求和响应的 头信息。代码清单7-7是/trace输出的一个片段,其中包含了整个请求跟踪项。 

    正如method和path属性所示,你可以看到这个跟踪项是一个针对/metrics的请求。 timestamp属性(以及响应中的Date头)告诉了你请求的处理时间。headers属性的内容是请 求和响应中所携带的头信息。 虽然代码清单7-7里只显示了一条跟踪项,但/trace端点实际能显示近100个请求的信息,包 含对/trace自己的请求。它在内存里维护了一个跟踪库。稍后在7.4.4节里,你会看到如何创建一 个自定义的跟踪库实现,以便将请求的跟踪持久化。 

    /dump导出线程活动

    /dump端点会生成当前线程活动的快照。完整的线程导出报告里会包含应用程序的每个线程。为了节省空间,下面只放了 一个线程的内容片段。如你所见,其中包含很多线程的特定信息,还有线程相关的阻塞和锁状态。 本例中,还有一个跟踪栈(stack trace),表明这是一个Tomcat容器线程。 

    /shutdown端点关闭应用程序

    为了关闭应用程序,你要往/shutdown发送一个POST请求。很显然,关闭运行中的应用程序是件危险的事情,因此这个端点默认是关闭的。要开启该端点,可以将endpoints.shutdown.enabled设置为true。举例来说,可以把如 下内容加入application.yml,借此开启/shutdown端点: 

    endpoints.shutdown.enabled=true

    GET请求提示不支持,如下图:

    用fiddler模拟一个POST请求,可以成功关闭应用,如下图: 

    上述各个endpoint是Spring Boot Actuator提供的接口和方法,接下来看看我们自己定制的HealthIndicator,我们只需要实现HealthIndicator接口,Spring Boot会收集该接口的实现,并加入到/health这个endpoint中。

    在我们的例子中,我们为每个CrudRepository实例都创建了一个HealthIndicator实例,为此我们创建了一个CompositeHealthIndicator实例,由这个实例管理所有的DbHealthIndicator实例。作为一个composite,它会提供一个内部的层次关系,从而可以返回JSON格式的数据。

    代码中的HealthAggregator实例的作用是:它维护一个map,告诉CompositeHealthIndicator如何决定所有HealthIndicator代表的整体的状态。例如,除了一个repository返回DOWN其他的都返回UP,这时候这个composite indicator作为一个整体应该返回UP还是DOWN,HealthAggregator实例的作用就在这里。

    Spring Boot使用的默认的HealthAggregator实现是OrderedHealthAggregator,它的策略是手机所有的内部状态,然后选出在DOWN、OUT_OF_SERVICE、UP和UNKNOWN中间具有最低优先级的那个状态。这里使用策略设计模式,因此具体的状态判定策略可以改变和定制,例如我们可以创建定制的HealthAggregator

    最后需要考虑下安全问题,通过这些endpoints暴露出很多应用的信息,当然,Spring Boot也提供了配置项,可以关闭指定的endpoint——在application.properties中配置<name>.enable=false

    还可以通过设置management.port=-1关闭endpoint的HTTP访问接口,或者是设置其他的端口,供内部的admin服务访问;除了控制端口,还可以设置仅仅让本地访问,只需要设置management.address=127.0.0.1;通过设置management.context-path=/admin,可以设置指定的根路径。综合下,经过上述设置,在本地访问http://127.0.0.1/admin/health来访问健康状态。

    可以在防火墙上屏蔽掉不是/admin/*的endpoints访问请求,更进一步,利用Spring Security可以配置验证信息,这样要访问当前应用的endpoints必须使用用户名和密码登陆。

    二、连接Actuator的远程 shell

    Actuator通过REST端点提供了不少非常有用的信息。另一个深入运行中应用程序内部的方式 是使用远程shell。Spring Boot集成了CRaSH,一种能嵌入任意Java应用程序的shell。Spring Boot 还扩展了CRaSH,添加了不少Spring Boot特有的命令,提供了与Actuator端点类似的功能。 要使用远程shell,只需加入远程shell的起步依赖即可。你需要这样的Gradle依赖:

    compile("org.springframework.boot:spring-boot-starter-remote-shell") 

    如果用Maven构建项目,你需要在pom.xml文件里添加如下依赖: 

    <dependency>   
        <groupId>org.springframework.boot</groupId>   
        <artifactId>spring-boot-starter-remote-shell</artifactId> 
    </dependency>

    添加了远程shell依赖后,就可以构建并运行应用程序了。在启动的时候,可以看到要写进日 志的一行密码。这行密码所在的行大概是这样的: 

    Using default password for shell access: c59b152d-f7e2-41de-86f1-6c3e9e38229b

    现在你可以通过SSH工具连接shell了,它监听的端口号是2000。如果你用的是Unix的ssh命 令,那么它看起来大概是这样的: 

    账号密码分别是user/c59b152d-f7e2-41de-86f1-6c3e9e38229b

    登陆成功后,显示如下:

    远程shell提供了24个可以在运行应用程序上下文中执行的命令,其中大部分都是CRaSH自带 的。但Spring Boot也添加了一些。表7-4列出了这些Spring Boot特有的命令。 

     

    例如用autoconfig生成了一个与Actuatord的/autoconfig端点类似的报告。

     

    metrics

    三、通过JMX监控应用程序 

    除了REST端点和远程shell,Actuator还把它的端点以MBean的方式发布了出来,可以通过 JMX来查看和管理。使用JMX是管理Spring Boot应用程序的一个好方法,如果你已在用JMX管理 应用程序中的其他MBean,则尤其如此。 

    Actuator的端点都发布在org.springframework.boot域下。比如,你想要查看应用程序的请求映 射关系,那么可以看一下图7-6(通过JConsole查看请求映射端点)。 

    连接成功后,

    如你所见,在requestMappingEndpoint下可以找到请求映射端点,位于org.spring- framework.boot域中的Endpoint下。Data属性中包含了该端点所要输出的JSON内容。 和其他MBean一样,端点MBean有可供调用的操作。大部分端点MBean只有访问操作,返回 其中的某个属性,但/shutdown端点提供了一些有趣(同时具有毁灭性)的操作,如下图所示,点击shutdown的方框,应用就停止了。


    参考:http://www.jianshu.com/p/734519d3c383
     
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/duanxz/p/3503094.html
Copyright © 2011-2022 走看看