SpringBoot特性之Actuator
来源:互联网 发布:三个字网络流行语 编辑:程序博客网 时间:2024/05/18 02:41
SpringBoot自动配置的特性,很大程度上解放了我们繁琐的配置的工作,但是也向我们屏蔽了很多内部运行
的细节,好在SpringBoot为我们提供了Actuator,Actuator在应用程序里提供了众多的Web端点,通过它
们,我们可以了解应用程序运行时的内部状况。我们可以了解Bean的组装信息,获取环境配置信息,等等
Actuator为我们提供了如下的一些端口
我们如果要使用Actuator的话也很简单,我们首先在pom文件中引入Actuator的依赖就行了,如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
然后再添加一个配置项即可:
management: security: enabled: false
下面我们访问几个来看一下功能(端口号换成自己应用的端口号):
请求:http://localhost:8003/beans
效果如下:
在上面的图片中,Actuator为我们展示了一个Bean的信息,Bean的名字(bean)、别名(aliases)、
scope(singleton or prototype)、类型(type)、位置(resource绝对路径)、依赖(dependencies)
请求:http://localhost:8003/autoconfig
效果如下:
SpringBoot的另一个重要的特性是自动配置,当我们访问/autoconfig的时候,Actuator为我们输出了
autoconfig的一些信息,自动配置这个bean需要什么样的条件。
其他的一些Actuator端点也很有意思,例如:/configprops、/mappings、/heapdump等。当然我们也可以自定义Actuator来满足自己的功能需要,demo如下所示:
package com.zkn.springboot.exercise.endpoint;import org.springframework.boot.actuate.endpoint.AbstractEndpoint;import org.springframework.stereotype.Component;import java.lang.management.*;import java.util.HashMap;import java.util.Map;/** * @author zkn * @date 2017/11/15 22:50 */@Componentpublic class ThreadInfoEndpoint extends AbstractEndpoint<Map<String, String>> { public ThreadInfoEndpoint() { //id super("threadInfo"); } /** * Called to invoke the endpoint. * * @return the results of the invocation */ @Override public Map<String, String> invoke() { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); //获取所有的线程信息 ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true); if (threadInfos != null && threadInfos.length > 0) { Map<String, String> map = new HashMap<>(threadInfos.length); for (ThreadInfo threadInfo : threadInfos) { map.put(threadInfo.getThreadName(), getThreadDumpString(threadInfo)); } return map; } return null; } /** * 组装线程信息 * * @param threadInfo */ private String getThreadDumpString(ThreadInfo threadInfo) { StringBuilder sb = new StringBuilder("threadName:" + threadInfo.getThreadName() + ",threadId:" + threadInfo.getThreadId() + ",threadStatus:" + threadInfo.getThreadState()); //锁的名字 if (threadInfo.getLockName() != null) { sb.append(",lockName:" + threadInfo.getLockName()); } //锁的持有者 if (threadInfo.getLockOwnerName() != null) { sb.append(",lockOwnerName:" + threadInfo.getLockOwnerName()); } //线程中断 if (threadInfo.isSuspended()) { sb.append(",suspended:" + threadInfo.isSuspended()); } if (threadInfo.isInNative()) { sb.append(",inNative:" + threadInfo.isInNative()); } sb.append("\n"); StackTraceElement[] stackTraceElementst = threadInfo.getStackTrace(); MonitorInfo[] monitorInfos = threadInfo.getLockedMonitors(); StackTraceElement stackTraceElement; if (stackTraceElementst != null) { int i; for (i = 0; i < stackTraceElementst.length; i++) { stackTraceElement = stackTraceElementst[i]; sb.append(",stackTraceElement:" + i + ";" + stackTraceElement.toString()); if (i == 0 && threadInfo.getLockInfo() != null) { Thread.State ts = threadInfo.getThreadState(); switch (ts) { case BLOCKED: sb.append("\t- blocked on " + threadInfo.getLockInfo()); sb.append('\n'); break; case WAITING: sb.append("\t- waiting on " + threadInfo.getLockInfo()); sb.append('\n'); break; case TIMED_WAITING: sb.append("\t- waiting on " + threadInfo.getLockInfo()); sb.append('\n'); break; default: } } for (MonitorInfo mi : monitorInfos) { if (mi.getLockedStackDepth() == i) { sb.append("\t- locked " + mi); sb.append('\n'); } } } if (i < stackTraceElementst.length) { sb.append("\t..."); sb.append('\n'); } LockInfo[] locks = threadInfo.getLockedSynchronizers(); if (locks.length > 0) { sb.append("\n\tNumber of locked synchronizers = " + locks.length); sb.append('\n'); for (LockInfo li : locks) { sb.append("\t- " + li); sb.append('\n'); } } sb.append('\n'); } return sb.toString(); }}
关键点是:一:继承AbstractEndpoint这个类(注意泛型类型),二:写一个无参的构造函数,调用父类的一
个有参构造函数,传入一个id描述(id描述会映射为响应的请求),三:重写invoke方法。在
AbstractEndpoint中注入Environment,所以你可以通过Environment获取系统环境变量中的值。
- SpringBoot特性之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- SpringBoot四大神器之Actuator
- springboot actuator
- springboot【22】监控管理之Actuator监控端点简介
- springboot【23】监控管理之Actuator监控端点实践
- springboot监控actuator使用手册
- springboot-actuator 401 无权限
- SpringBoot-Actuator-加SpringSecurity验证
- SpringBoot Actuator端点访问失败
- springboot【24】监控管理之Actuator的/info端点输出Git版本信息
- wxPython多个窗口的基本结构
- 泛型dao
- POJ3045 Cow Acrobats 贪心
- chrome控制台的使用
- 深度学习(Deep Learning)
- SpringBoot特性之Actuator
- 【模块学习】关于磁力计HMC5883L型号探索
- 购物车修改排序删除
- Python利用os.walk遍历文件夹
- 欢迎使用CSDN-markdown编辑器
- hdoj 1789
- RecyclerView的瀑布流简单应用
- 英语突击队总结
- Mysql高可用--双主热备+keepalived