- 浏览: 7252272 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
检测虚拟机当前的状态总是 Java 开放人员所关心的,也正是因为如此,出现了大量的 profiler 工具来检测当前的虚拟机状态。从 Java SE 5 之后,在 JDK 中,我们有了一些 Java 的虚拟机检测 API,即 java.lang.management
包。Management 包里面包括了许多 MXBean 的接口类和 LockInfo、MemoryUsage、MonitorInfo 和 ThreadInfo 等类。从名字可以看出,该包提供了虚拟机内存分配、垃圾收集(GC)情况、操作系统层、线程调度和共享锁,甚至编译情况的检测机制。这样一来,Java 的开发人员就可以很简单地为自己做一些轻量级的系统检测,来确定当前程序的各种状态,以便随时调整。
要获得这些信息,我们首先通过 java.lang.management.ManagementFactory
这个工厂类来获得一系列的 MXBean。包括:
-
ClassLoadingMXBean
ClassLoadMXBean 包括一些类的装载信息,比如有多少类已经装载 / 卸载(unloaded),虚拟机类装载的 verbose 选项(即命令行中的 Java – verbose:class 选项)是否打开,还可以帮助用户打开 / 关闭该选项。
-
CompilationMXBean
CompilationMXBean 帮助用户了解当前的编译器和编译情况,该 mxbean 提供的信息不多。
-
GarbageCollectorMXBean
相对于开放人员对 GC 的关注程度来说,该 mxbean 提供的信息十分有限,仅仅提供了 GC 的次数和 GC 花费总时间的近似值。但是这个包中还提供了三个的内存管理检测类:MemoryManagerMXBean,MemoryMXBean 和 MemoryPoolMXBean。
-
MemoryManagerMXBean
这个类相对简单,提供了内存管理类和内存池(memory pool)的名字信息。
-
MemoryMXBean
这个类提供了整个虚拟机中内存的使用情况,包括 Java 堆(heap)和非 Java 堆所占用的内存,提供当前等待 finalize 的对象数量,它甚至可以做 gc(实际上是调用 System.gc)。
-
MemoryPoolMXBean
该信息提供了大量的信息。在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含了该内存池的详细信息,如是否可用、当前已使用内存 / 最大使用内存值、以及设置最大内存值等等。
-
MemoryManagerMXBean
-
OperatingSystemMXBean
该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等。
-
RuntimeMXBean
运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等。
-
ThreadMXBean
在 Java 这个多线程的系统中,对线程的监控是相当重要的。ThreadMXBean 就是起到这个作用。ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个线程的所有信息。
我们知道,management 和底层虚拟机的关系是非常紧密的。其实,有一些的是直接依靠虚拟机提供的公开 API 实现的,比如 JVMTI;而另外一些则不然,很大一块都是由虚拟机底层提供某些不公开的 API / Native Code 提供的。这样的设计方式,保证了 management 包可以提供足够的信息,并且使这些信息的提供又有足够的效率;也使 management 包和底层的联系非常紧密。
package com.easyway.space.commons.systems; import java.lang.management.ClassLoadingMXBean; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.LockInfo; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryManagerMXBean; import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; import java.lang.management.MemoryUsage; import java.lang.management.MonitorInfo; import java.lang.management.OperatingSystemMXBean; import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; /** * 系统监控工具 * management 和底层虚拟机的关系是非常紧密的。其实,有一些的是直接依靠虚拟机提供的公 * 开 API 实现的,比如 JVMTI;而另外一些则不然,很大一块都是由虚拟机底层提供某些不公开 * 的 API / Native Code 提供的。这样的设计方式,保证了 management 包可以提供足够的信 * 息,并且使这些信息的提供又有足够的效率;也使 management 包和底层的联系非常紧密。 * @author longgangbai * */ public class SystemUtils { /** *ClassLoadingMXBean ClassLoadMXBean 包括一些类的装载信息, * 比如有多少类已经装载 / 卸载(unloaded), * 虚拟机类装载的 verbose 选项(即命令行中的 Java – verbose:class 选项)是否打开, * 还可以帮助用户打开 / 关闭该选项。 */ public static void getVMClassInformation(){ ClassLoadingMXBean classLoadMXBean=ManagementFactory.getClassLoadingMXBean(); int loadClazzCount=classLoadMXBean.getLoadedClassCount(); System.out.println("加载类的数量:"+loadClazzCount); long hasloadClazzCount=classLoadMXBean.getTotalLoadedClassCount(); System.out.println("已经加载类的数量:"+hasloadClazzCount); long hasUnloadClazzCount=classLoadMXBean.getUnloadedClassCount(); System.out.println("尚未加载类的数量:"+hasUnloadClazzCount); boolean isVerbose=classLoadMXBean.isVerbose(); System.out.println("是否开始加载类信息:"+isVerbose); //CompilationMXBean 帮助用户了解当前的编译器和编译情况,该 mxbean 提供的信息不多。 CompilationMXBean compilationMXBean=ManagementFactory.getCompilationMXBean(); String jitName=compilationMXBean.getName(); System.out.println("即时编译的名称:"+jitName); long totalCompileTime=compilationMXBean.getTotalCompilationTime(); System.out.println("总的编译时间:"+totalCompileTime+"/s"); boolean isSupport=compilationMXBean.isCompilationTimeMonitoringSupported(); if(isSupport){ System.out.println("支持即时编译器编译监控"); }else{ System.out.println("不支持即时编译器编译监控"); } List<GarbageCollectorMXBean> gcMXBeanList=ManagementFactory.getGarbageCollectorMXBeans(); //相对于开放人员对 GC 的关注程度来说,该 mxbean 提供的信息十分有限,仅仅提供了 GC 的次数和 GC 花费总时间的近似值。 for (GarbageCollectorMXBean gcMXBean : gcMXBeanList) { //内存池名称 String[] poolNames=gcMXBean.getMemoryPoolNames(); for (String poolName : poolNames) { System.out.println("poolNames="+poolName); } } //提供了内存管理类和内存池(memory pool)的名字信息。 List<MemoryManagerMXBean> memoryMgrMXBeanList=ManagementFactory.getMemoryManagerMXBeans(); //内存管理器的信息 for (MemoryManagerMXBean memoryManagerMXBean : memoryMgrMXBeanList) { String[] poolNames=memoryManagerMXBean.getMemoryPoolNames(); for (String poolName : poolNames) { System.out.println("poolNames="+poolName); } } //内存信息 MemoryMXBean memoryMXBean=ManagementFactory.getMemoryMXBean(); //java堆得使用情况信息 MemoryUsage heapMemoryUsage=memoryMXBean.getHeapMemoryUsage(); long usaged=heapMemoryUsage.getUsed(); System.out.println("java 内存堆使用内存:"+usaged); long maxUsage=heapMemoryUsage.getMax(); System.out.println("java 内存堆最大使用内存:"+maxUsage); long initUsage=heapMemoryUsage.getInit(); System.out.println("java 内存堆初始化时占用内存:"+initUsage); List<MemoryPoolMXBean> memoryPoolMXBeanList=ManagementFactory.getMemoryPoolMXBeans(); //该信息提供了大量的信息。在 JVM 中,可能有几个内存池,因此有对应的内存池信息,因此,在工厂类中 //,getMemoryPoolMXBean() 得到是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都包含 //了该内存池的详细信息,如是否可用、当前已使用内存 / 最大使用内存值、以及设置最大内存值等等。 for (MemoryPoolMXBean memoryPoolMXBean : memoryPoolMXBeanList) { //内存池的名称 String poolName=memoryPoolMXBean.getName(); //内存管理器的名称 String[] memoryMgrNames=memoryPoolMXBean.getMemoryManagerNames(); for (String mgrName : memoryMgrNames) { System.out.println("内存管理器的名称:"+mgrName); } //java JVM最近内存的使用情况 MemoryUsage memoryUsage=memoryPoolMXBean.getCollectionUsage(); System.out.println("内存池的收集器内存使用率:"+memoryUsage.getUsed()/memoryUsage.getMax()+"%"); memoryPoolMXBean.getCollectionUsageThreshold(); memoryPoolMXBean.getCollectionUsageThresholdCount(); MemoryType memoryType=memoryPoolMXBean.getType(); System.out.println("内存的信息:"+memoryType.name()); MemoryUsage memoryUage=memoryPoolMXBean.getUsage(); System.out.println("内存池的内存使用率:"+memoryUage.getUsed()/memoryUage.getMax()+"%"); memoryPoolMXBean.getUsageThreshold(); System.out.println(); memoryPoolMXBean.getUsageThresholdCount(); System.out.println(); } //该类提供的是操作系统的简单信息,如构架名称、当前 CPU 数、最近系统负载等。 OperatingSystemMXBean operateSystemMBean=ManagementFactory.getOperatingSystemMXBean(); String operateName=operateSystemMBean.getName(); System.out.println("操作系统的名称:"+operateName); int processListCount=operateSystemMBean.getAvailableProcessors(); System.out.println("操作系统的进程数:"+processListCount); String osArchName=operateSystemMBean.getArch();//System.getProperty("os.arch"); System.out.println("操作系统的架构:"+osArchName); double loadAverage=operateSystemMBean.getSystemLoadAverage(); System.out.println("操作系统的负载均衡信息:"+loadAverage); String versionName=operateSystemMBean.getVersion();//System.getProperty("os.version"); System.out.println("操作系统的版本号码:"+versionName); //运行时信息包括当前虚拟机的名称、提供商、版本号,以及 classpath、bootclasspath 和系统参数等等。 RuntimeMXBean runtimeMXBean=ManagementFactory.getRuntimeMXBean(); String vmName=runtimeMXBean.getVmName(); System.out.println("虚拟机的名称:"+vmName); String vmVersion=runtimeMXBean.getVmVersion(); System.out.println("虚拟机的版本:"+vmVersion); Map<String, String> sysMaps=runtimeMXBean.getSystemProperties(); Set<Entry<String,String>> keyLists=sysMaps.entrySet(); for (Entry<String, String> entry : keyLists) { System.out.println(entry.getKey()+":"+entry.getValue()); } String vmVendor=runtimeMXBean.getVmVendor(); System.out.println("系统的供应商的名称:"+vmVendor); //类加载器的路径 String clazzPath=runtimeMXBean.getClassPath();//System.getProperty("java.class.path")} System.out.println("操作系统的类加载器的名称:"+clazzPath); List<String> argsList=runtimeMXBean.getInputArguments(); System.out.println("操作系统的参数信息"); for (String args : argsList) { System.out.println(" "+args); } String libPath=runtimeMXBean.getLibraryPath();// System.getProperty("java.library.path") System.out.println("java 的类库路径:"+libPath ); String specVersion=runtimeMXBean.getManagementSpecVersion(); System.out.println("实施运行Java虚拟机管理接口规范 的版本"+specVersion); String specName=runtimeMXBean.getSpecName(); System.out.println("规范的名称:"+specName); String specVender=runtimeMXBean.getSpecVendor(); System.out.println("规范管理接口供应商 :"+specVender); long startTime=runtimeMXBean.getStartTime(); System.out.println("java 虚拟机的开始启动的时间:"+startTime); runtimeMXBean.getSpecVersion(); System.out.println("规范接口版本::"+operateName); String bottClassPath =runtimeMXBean.getBootClassPath(); System.out.println("操作系统的bootstrap 的classloader:"+bottClassPath); //在 Java 这个多线程的系统中,对线程的监控是相当重要的。ThreadMXBean 就是起到这个作用。 //ThreadMXBean 可以提供的信息包括各个线程的各种状态,CPU 占用情况,以及整个系统中的线 //程状况。从 ThreadMXBean 可以得到某一个线程的 ThreadInfo 对象。这个对象中则包含了这个 //线程的所有信息。 //线程的信息 ThreadMXBean threadMXBean=ManagementFactory.getThreadMXBean(); //所有的线程的编号 long[] threadIds=threadMXBean.getAllThreadIds(); for (long threadId : threadIds) { //线程的信息 ThreadInfo threadInfo=threadMXBean.getThreadInfo(threadId); //线程被阻塞的数量 threadInfo.getBlockedCount(); //被锁定线程的监控信息 MonitorInfo[] monitorInfos=threadInfo.getLockedMonitors(); for (MonitorInfo monitorInfo : monitorInfos) { int depth=monitorInfo.getLockedStackDepth(); System.out.println("锁定的程度:"+depth); } //异步锁定的信息 LockInfo[] lockinfos=threadInfo.getLockedSynchronizers(); //锁定的信息 for (LockInfo lockInfo : lockinfos) { System.out.println("锁定类的名称:"+lockInfo.getClassName()); } //线程的名称 String threadName=threadInfo.getThreadName(); System.out.println("线程的名称:"+threadName); Thread.State state=threadInfo.getThreadState(); System.out.println("线程的信息:"+state.name()); } long cpuTime=threadMXBean.getCurrentThreadCpuTime(); long curentTime=threadMXBean.getCurrentThreadUserTime(); long threadCount=threadMXBean.getDaemonThreadCount(); long peakliveThreadCount=threadMXBean.getPeakThreadCount(); long threadCounts=threadMXBean.getThreadCount(); System.out.println("当前处于live状态的线程总的数量:"+threadCounts); long totalThreadCount=threadMXBean.getTotalStartedThreadCount(); System.out.println("JVM 启动之后,总的自动线程数量:"+totalThreadCount); } /** * * @return */ public static final String getHeapMemoryUsage() { ClassLoadingMXBean mxbean; return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() .getUsed() + "/" + ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() .getMax(); } /** * 当前使用内存的百分比 * @return */ public static final String getHeapMemoryUsagePercent() { return (((double) ManagementFactory.getMemoryMXBean() .getHeapMemoryUsage().getUsed() / (double) ManagementFactory .getMemoryMXBean().getHeapMemoryUsage().getMax()) * 100L) + "%"; } /** * 当前非java堆占用的百分比 * @return */ public static final String getNonHeapMemoryUsage() { return ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage() .getUsed() + "/" + ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage() .getMax(); } /** * * @return */ public static final String getNonHeapMemoryUsagePercent() { return (((double) ManagementFactory.getMemoryMXBean() .getNonHeapMemoryUsage().getUsed() / (double) ManagementFactory .getMemoryMXBean().getNonHeapMemoryUsage().getMax()) * 100) + "%"; } /** * 获取线程数 * @return */ public static final String getThreadCount() { return "" + ManagementFactory.getThreadMXBean().getThreadCount(); } }
发表评论
-
[转] J2EE集群原理
2013-07-23 09:57 4475J2EE集群原理 什么是集群呢?总的来说,集群包括两个概念 ... -
[转]J2EE 中间件 JVM 集群
2013-07-23 09:51 24651 前言越来越多的关键任务和大型应用正运行在J2EE平台上,象 ... -
[转]通过 Terracotta实现基于Tomcat的Web应用集群
2013-07-23 09:45 5081转载自: http://blog.csdn.n ... -
Terrocotta - 基于JVM的Java应用集群解决方案
2013-07-23 09:47 2454前言 越来越多的企业 ... -
Quartz与Terracotta的集成
2013-07-22 20:39 2729Quartz与Terracotta的集成 • 综述 • 配置 ... -
Terracotta服务器的不同配置方式
2013-07-22 20:37 2096Terracotta Server有4类配置方式:1、单机,无 ... -
Terracotta 3.2.1简介 (一)
2013-07-22 20:25 2432Terracotta开源项目以及Terracotta公司 ... -
Jvm级别的集群(转)
2013-07-22 20:14 2291Java的垃圾回收机制( ... -
【转】java并发编程-Executor框架
2012-11-28 13:20 3669转载自 http://www.iteye.com/topic ... -
【转】互联网常见Open API文档资源
2012-07-17 17:22 2370原文出处:http://www.williamlong.i ... -
最近项目开发中遇到几个问题
2011-11-25 18:49 17871.JDK1.60安装之后与Apache CXF开发WebSe ... -
Java 文件合并功能
2011-08-25 08:44 3714在项目中在一个文件目录中存放多个临时文件合并文件功 ... -
Java 分割功能实现
2011-08-25 08:39 2744在项目针对比较大的文件需要文件的分割功能,特意写了一个 ... -
在JVM关闭的时候线程该怎么关闭呢
2011-08-21 13:11 2183在编写线程类的时候设置一个标志,用于表示是否开始执行 ... -
Java获取系统IP地址
2011-08-21 13:01 5995在一个项目中如果你想获取系统的ip地址那么可能许多同 ... -
java 网络编程,RMI,EJB之间那些屁事(二)
2010-12-12 14:40 1874使用RMI和EJB的童鞋,都知道EJB有客户端 ... -
java 网络编程,RMI,EJB之间那些屁事(一)
2010-12-12 14:18 2993在java的开发中不可避免的遇到java ... -
关于JDK1.5不支持创建泛型数组的解决方案
2009-12-05 14:59 3773在项目中需要 ... -
JDK1.5中的打印服务
2009-12-01 13:23 2537package com.unutrip.print; imp ... -
Java中静态变量的适用场景
2009-11-28 15:32 2085Java类中的静态变量在程序运行期间,其内存空间对所有 ...
相关推荐
基于JMX的IT系统管理关键技术研究与实现,详细介绍了使用jmx的方法
网络的迅速发展对现有网络管理系统的优化提出了迫切的...因此提出了一种利用JMX技术来改进网络管理系统中实时监控管理的一个实现模型。此模型有效地解决了实时监控中的网络拥塞、指标管理混乱、客户端负载过重等问题。
简单介绍了JMX规范,在此基础上,讨论了使用JMX体系结构建立网络管理程序的一般方法,最后结合JMX规范和实现方法,分析基于JMX网络管理系统的优势。
Jmeter测试,实现一次登录,多次业务请求(批量生成并注册用户)。主要实现方式是通过setUp线程组设置登录请求,在循环控制器下使用beanshell脚本自动生成用户名、账号,...每一个元件的作用都写在comments(注释)里。
网络游戏-基于JMX的网络业务管理方法及其应用系统.zip
mx4j是jmx的开源框架实现,可实现系统开发的微内核管理
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。文件里面包含jmx开发5个常见的jar包,其中还有些example。
JMX 全称为 Java Management Extensions,翻译过来就是 Java 管理扩展,用来管理和监测 Java 程序。最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作...
光宇java的JMX远程服务器管理监控系统的帮助文件,说明了JMX在javaweb中的一些应用及应用方法。
JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用系统,那么推荐你...
JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用系统,那么推荐你...
Extensions,用于我们管理和监控java应用程序。JMX有以下用途: 监控应用程序的运行状态和相关统计信息。 修改应用程序的配置(无需重启)。 状态变化或出错时通知处理。 举个例子,我们可以通过jconsole监控应用...
这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有...对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦!
但如果是开发的一个复杂系统(如一个电商平台、一个企业内部管理系统),则该系统本身也需要被管理,如需要了解这个软件的运行情况,比如某些状态是否正常、当前登录用户数,还有可能需要动态的调整系统的某些参数,...
设计并实现了一种构件级集群动态管理系统,支持在...它基于OSGi框架组织管理系统构件,并通过构件管理代理支持基于JMX的远程管理。最后通过实验展示了系统效果,最终验证了构件级管理在应对动态需求变化时的有效性。
管理控制台、TongLINKQ8.1系统管理手册_配置管理、TongLINKQ8.1系统管理手册_系统工具、TongLINKQ8.1系统开发手册_C#编程参考、TongLINKQ8.1系统开发手册_C编程参考、TongLINKQ8.1系统开发手册_JAVA编程参考、...
可以通过 WAS 远程服务器获取有关系统和 JVM 的信息。 它提供了一个直观的界面,因此任何人都可以轻松使用它。 如何使用 启动WAS时,一定要在JVM选项中添加以下选项(No Secure Mode方法) -Dcom.sun.management....
通过统一的图形化管理控制台,您可以管理和监控网络、操作系统、数据库等基础设施服务,也可以管理和监控Java虚拟机、JBoss Web、连接池等中间件,还可以通过自定义的JMX MBean管理和监控您的业务应用。通过对配置...
功能描述:微服务车票系统,分管理员和普通用户两种角色。除了基本功能,可实现限流,一人一单,每日热搜等功能 #### 涉及技术栈:MySQL,Redis,RabbitMQ,MybatisPlus,SpringBoot,SpringCloud,Seata,Sentinel...