第62天:了解JMX及其体系结构(代理级别)
#devops #java #jvm #jmx

在第一部分中,我们对JMX及其远程管理层进行了讨论。在这一中,我们将了解其第二层是代理层。

代理概述

JMX代理是直接控制资源的标准管理代理。它使它们可用于远程管理应用程序。 JMX代理通常位于与控制资源的同一系统上,但这不是必需。

JMX代理是在JVM中运行并充当托管豆(MBEANS)和管理应用程序之间的联络的管理实体。 JMX代理的各个组件在以下各节中概述:

  1. mbean服务器
  2. 代理服务
  3. 协议适配器和连接器

服务器MRS:

mbean服务器又名MBEAN代理是JMX代理的核心组件。这是JMX代理中对象进行管理操作的注册表。在管理应用程序中可以看到一个注册MBEAN服务器的对象。 MBEAN服务器仅公开MBEAN的管理接口。

您想从代理JVM外部管理的任何资源都必须在服务器上注册为MBEAN。 MBEAN服务器提供了一个标准化的接口,用于访问同一JVM中的MBEAN。从而为当地对象赋予操纵可管理资源的所有好处。可以通过以下方式实例化和注册MBEANS:

  • 另一个mbean
  • 代理本身
  • 远程管理应用程序

注册MBEAN时,必须为其分配一个唯一的对象名称。管理应用程序使用对象名称来识别其执行管理操作的对象。 MBEAN上可用的操作包括:

  • 发现mbeans的管理接口
  • 阅读和写下其属性值
  • 执行由MBEANS定义的操作
  • 获得MBEANS发出的通知
  • 通过使用其对象名称或其属性值来查询mbeans
  • 建筑
  • 什么是mbean
  • mbean服务器

女士

mbeans是托管的豆类,代表要管理的资源的Java对象。 mbeans可以是标准的或动态的。标准mbeans是符合从Javabeans组件模型的设计模式的Java对象。动态MBEANS在运行时定义其管理接口。

有两种类型的MBeans

  1. 标准mbean
  2. 动态mbean

标准MBEAN通过其属性和操作直接公开要管理的资源。属性通过“ getter”和“ setter”方法暴露。操作是经理可以使用的类的其他方法。所有这些方法在MBEAN界面上静态定义,并通过内省可见。这是使新资源可管理的最直接方法。

动态MBEAN是一个MBEAN,在运行时定义其管理接口。例如,MBEAN配置可以通过解析XML文件来确定其属性的名称和类型。

JMX代理是在JVM中运行并充当托管豆(MBEANS)和管理应用程序之间的联络的管理实体。 JMX代理的各个组件在以下各节中概述:

  1. mbean服务器
  2. 代理服务
  3. 协议适配器和连接器

服务器女人

MBEAN服务器是JMX代理的核心组件。它是JMX代理中对象的注册表,该注册表暴露于管理操作。在管理应用程序中可见在MBEAN服务器上注册的对象。 MBEAN服务器仅公开MBEAN的管理接口,从来没有直接对象参考。

您想从代理JVM外部管理的任何资源都必须在服务器上注册为MBEAN。 MBEAN服务器提供了一个标准化的接口,用于访问同一JVM中的MBEAN,从而为当地对象提供了操纵可管理资源的所有好处。可以通过以下方式实例化和注册MBEANS:

  1. 另一个mbean
  2. 代理本身
  3. 远程管理应用程序

当您注册mbean时,you must assign it a unique object name。管理应用程序使用对象名称来识别其执行管理操作的对象。 MBEAN上可用的操作包括:

  1. 发现mbeans的管理接口
  2. 阅读和写下其属性值
  3. 执行由MBEANS定义的操作
  4. 获得MBEANS发出的通知
  5. 通过使用其对象名称或其属性值来查询mbeans

代理服务

代理服务是可以对MBEAN服务器注册的MBEAN进行管理操作的对象。代理服务也可以由MBEAN提供,允许它们及其功能通过MBEAN服务器控制。 Java管理扩展(JMX)规范,版本1.4定义以下代理服务:

  • 动态类加载程序:通过管理服务获取动态类加载并实例化新类和本机库。从网络中动态下载的。
  • 监视器:监视MBEAN属性的数值或字符串值。他们可以通知其他几种更改的其他对象。

计时器:计时器提供调度机制,可以以预定的间隔发送通知。

关系服务:关系服务使MBEAN可以相互交流。

协议适配器和连接器

协议适配器和连接器使代理可以从远程管理应用程序访问。他们通过MBEANS的特定协议提供了视图,这些协议已实例化并在MBEAN服务器上注册。他们使JVM之外的管理应用程序能够:

获取或设置现有mbeans的属性
对现有MBEANS进行操作
实例化和注册新的mbeans
注册并接收MBEANS发出的通知

平台mbeans
平台MBEAN(也称为MXBEAN)是用于监视和管理Java虚拟机(JVM)的MBEAN。每个MXBEAN都封装了JVM功能的一部分,例如JVM的类加载系统,JIT编译系统,垃圾收集器等。 Java.lang.Management软件包定义了平台MXBEANS。

表1列出了所有平台MBEAN及其管理的VM的方面。每个平台MXBEAN都有一个唯一的Javax.Management.ObjectName,用于在平台MBEANSERVER中注册。根据表中所示,JVM可能具有零,一个或一个以上的实例,具体取决于其功能。

平台mbeans

实例
接口 管理 对象名称 每个VM
classloadingmxbean 类加载系统 java.lang:type = classloading 一个
compilationmxbean 编译系统 java.lang:type = compilation 零或一个
garbagecollectormxbean 垃圾收集器 java.lang:type = garbageCollector name = collectorName 一个或多个
MemoryManagerMxBean(GarbageCollectormxBean的子接口) 内存池 java.lang:type = memoryManager name = ManagerName 一个或多个
MemoryPoolMxBean 内存 java.lang:type = memorypool name = poolname 一个或多个
memorymxbean 内存系统 java.lang:type =内存 一个
peratatingsystemmxbean 基础操作系统 java.lang:type = pertatingingsystem 一个
runtimemxbean 运行时系统 java.lang:type = runtime 一个
threadmxbean 线程系统 java.lang:type =螺纹 一个

平台豆服务器

平台MBEAN服务器可以通过在同一Java虚拟机中运行的不同托管组件共享。您可以使用Method ManagementFactory.getPlatformMbeanServer()访问平台MBEAN服务器。对此方法的第一个调用是创建平台MBEANSERVER,并使用其唯一的对象名称对平台MXBEAN进行注册。随后,它返回最初创建的平台mbeanserver。

MXBEAN会动态创建和破坏,例如,内存池和管理人员将自动注册并将其放置到平台MBEANSERVER中。如果设置了系统属性javax.management.builder.initial,则将由指定的MBEANSERVERBUILDER完成平台MBEANSERVER创建。

使用平台MBEANSERVER在平台MXBEAN之外注册其他MBEAN。这使所有mbeans都可以通过同一MBEANSERVER发布,并使网络发布和发现更加容易。

现在,在此Java代码中,我们创建一个MBEAN,并在VisualVM中看到它

在步骤1

让我们创建一个SystemStatusMBean来获取一些相关的信息

public interface SystemStatusMBean {
       Long getuptime();
    }

这通过使用依赖注入来告诉MBEANSSERVER,该对象将导出1个指标:

  • 正常时间

让我们写下实现此行为的实际对象:

public class SystemStatus implements SystemStatusMBean {
   private Long uptime;
   private Thread backgroundThread;

   public SystemStatus() {
       // First we initialize all the metrics
       this.backgroundThread = new Thread();
       this.uptime = 0;

       // We will use a background thread to update the metrics
       this.backgroundThread = new Thread(() -> {
           try {
               while (true) {
                   // Every second we update the metrics
                   uptime += 1;
                   Thread.sleep(1000L);
               }
           } catch (Exception e) {
               e.printStackTrace();
           }
       });
       this.backgroundThread.setName("backgroundThread");
       this.backgroundThread.start();
   }


   // Through this getters, defined in the interface SystemStatusMBean,
   // all the metrics will be automatically retrieved

   @Override
   public Long getUptime() {
       return uptime;
   }
}

从上一个代码中,您可以看到您只是创建一个从接口中实现所有指标的对象,并将每秒使用背景线程每秒更新它们。

最后,我们创建了mbean对象的实例,然后在mbeanserver中注册:

import javax.management.*;
import java.lang.management.ManagementFactory;

public class Day62 {
   public static void main(String[] args) {
       try {
           // Initialize the object
           SystemStatus systemStatus = new SystemStatus();

           // Register the object in the MBeanServer
           MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
           ObjectName objectName = new ObjectName("com.simple.app:name=SystemStatus");
           platformMBeanServer.registerMBean(systemStatus, objectName);

       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

mbean需要一个ObjectName来在mbeanserver中识别它。该名称必须包含一个domain,以避免碰撞和钥匙。在此示例中,域将是com.simple.app,关键将是name=SystemStatus

现在让我们从VisualVM看MBEAN

运行程序后,它将以while(true)的形式在后台运行线程

我已经在Intellij scratch中运行了此程序,因此VisualVM正在将其注册。现在,如果我单击MBEAN菜单,我将看到

之类的东西

我们可以在PlafromMBean注册中看到的com.simple.app。扩展后,我们将看到对象的名称是SystemStatus

打开SystemStatus后,我们可以看到为获取程序的正常运行时间定义的uptime。该指标将根据程序进行更新。因此,如果我们按refresh,那么我们可以看到正常运行时间指标的更新值。

这里的正常运行时间指标从14秒更改为61秒。因此,我们可以使用MBEANS定义指标并获取信息。