Explicación detallada de JMX y uso de JConsole

JMX

JMX (Java Management Extensions) es un marco para la implantación de funciones de gestión en aplicaciones. Es un conjunto de agentes y servicios estándar. El servicio es un programa de monitorización del rendimiento del programa Java proporcionado oficialmente por el JDK. Admite acceso remoto, admite expansión, es decir, parámetros de rendimiento del monitor personalizados. Proporciona tres niveles de llamadas: red, API y cliente. De hecho, la plataforma Java utiliza JMX como interfaz estándar para la gestión y monitorización, cualquier programa puede obtener toda la información de gestión y monitorización siempre que acceda a esta interfaz de acuerdo con la especificación JMX. Las herramientas de monitoreo de operación y mantenimiento de uso común, como Zabbix, Nagios y otras herramientas que monitorean la JVM en sí, son toda la información obtenida a través de JMX.

Escenarios de aplicación

La página de administración del software de middleware WebLogic está desarrollada en base a JMX, mientras que JBoss es el sistema completo basado en la arquitectura JMX.Existen varias formas de modificar algunos parámetros de la siguiente manera:

  1. Escrito muerto en el código, modifíquelo cuando necesite hacer cambios y luego vuelva a compilar y lanzar.

  2. Escrito en el archivo de configuración, como las propiedades de Java, cuando necesita cambiar, solo necesita modificar el archivo de configuración, pero el sistema debe reiniciarse para que surta efecto.

  3. Escriba un fragmento de código para almacenar en caché el valor de configuración. Cuando el sistema lo obtenga, primero verifique si el archivo de configuración ha cambiado. Si hay un cambio, obtenga el último valor de la configuración; de lo contrario, léalo de la caché, por ejemplo, leer los datos del centro de configuración de Apollo.

  4. Utilice JMX para concentrar los atributos que deben configurarse en una clase, luego escriba un MBean y luego realice la configuración relacionada, y JMX proporciona una página de herramientas JConsole para facilitar la modificación de los valores de los parámetros.

Arquitectura JMX

  ┌─────────┐  ┌─────────┐
    │jconsole │  │   Web   │
    └─────────┘  └─────────┘
         │            │
┌ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─
 JVM     ▼            ▼        │
│   ┌─────────┐  ┌─────────┐
  ┌─┤Connector├──┤ Adaptor ├─┐ │
│ │ └─────────┘  └─────────┘ │
  │       MBeanServer        │ │
│ │ ┌──────┐┌──────┐┌──────┐ │
  └─┤MBean1├┤MBean2├┤MBean3├─┘ │
│   └──────┘└──────┘└──────┘
 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

La estructura de JMX se divide en tres capas: capa básica (principalmente MBean), capa de adaptación (Adaptador), capa de interfaz (Conector)

MBean

JMX convierte todos los recursos administrados en MBeans (ManagedBeans). Todos estos MBeans son administrados por MBeanServer. Si desea acceder a los MBeans, puede utilizar la interfaz de acceso externa proporcionada por MBeanServer, como RMI o HTTP.

El uso de JMX no necesita instalar ningún componente adicional, ni requiere bibliotecas de terceros, porque MBeanServer ya está integrado en la biblioteca estándar de JavaSErver, y JavaSE también proporciona un programa JConsole para que RMI se conecte al MBeanServer, de modo que todo El proceso se puede gestionar.

Además de que la JVM registrará sus diversos recursos como MBeans en JMX, nuestra propia información de configuración y monitoreo también se puede registrar como MBeans en JMX, de modo que el programa de gestión pueda controlar directamente los MBeans que exponemos.

Los MBeans se dividen en los siguientes cuatro tipos:

Tipos de descripción
MBean estándar Este tipo de MBean es el más simple, los recursos que puede administrar (incluyendo atributos, métodos y tiempo) deben estar definidos en la interfaz y luego el MBean debe implementar esta interfaz. Su denominación también debe seguir ciertas especificaciones, por ejemplo, si nuestro MBean es Hello, la interfaz debe ser HelloMBean.
MBean dinámico Debe implementar la interfaz javax.management.DynamicMBean, todos los atributos y métodos se definen en tiempo de ejecución
abrir MBean La especificación de este MBean aún no está completa y se está mejorando
modelo MBean En comparación con los MBeans estándar y dinámicos, no necesita escribir clases de MBean, solo use javax.management.modelmbean.RequiredModelMBean. RequiredModelMBean implementa la interfaz ModelMBean y ModelMBean extiende la interfaz DynamicMBean, por lo que, al igual que DynamicMBean, los recursos de administración del Model MBean también se definen en tiempo de ejecución. La diferencia con DynamicMBean es que los recursos administrados por DynamicMBean generalmente se definen en DynamicMBean (solo esos recursos se administran en tiempo de ejecución), y los recursos administrados por el modelo MBean no están en el MBean, sino en el externo (generalmente una clase), solo cuando se ejecuta En ese momento, se agregó al modelo MBean a través del método set. Los siguientes ejemplos se introducirán en detalle

Capa de adaptación

MBeanServer proporciona principalmente registro y gestión de recursos

Capa de acceso

Proporcionar acceso remoto

Instrucciones

  1. Escriba la interfaz de administración y los datos de monitoreo proporcionados por MBean.
  2. Registrar MBean

Caso:

Agregue la anotación @EnableMBeanExport al programa de inicio para decirle a Spring que registre automáticamente el MBean

@SpringBootApplication
@MapperScan(basePackages = "com.lyj.demo.mapper")
@EnableMBeanExport // 自动注册MBean
public class SpringbootDemoApplication {
    
    

    private static final Logger logger = LoggerFactory.getLogger(SpringbootDemoApplication.class);
    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringbootDemoApplication.class, args);
        }
        }

Escriba MBean, aquí es para configurar los datos de la lista negra como ejemplo, a través de JConsole para obtener datos de configuración y agregar datos para eliminar datos, y la configuración entrará en vigencia inmediatamente sin volver a compilar y publicar código.

package com.lyj.demo.mbean;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;

/**
 * @author 凌兮
 * @date 2021/3/25 14:05
 * 黑名单MBean类名必须以MBean结尾,这是规则
 */
@Component
// 表示这是一个MBean,将要被注册到JMX,objectName指定了这个MBean的名字,通常以company:name=Xxx(公司名);来分类MBean
@ManagedResource(objectName = "company:name = blackList", description = "blackList of Ip address")
public class BlackListMBean {
    
    
    private static Set<String> ips = new HashSet<>();

    static {
    
    
        ips.add("123");
        ips.add("234");
    }

    /**
     * 对于属性,使用@ManagedAttribute注解标注,本次的MBean只有get属性,没有set
     * 属性,说明这是一个只读属性。
     * @return
     */
    @ManagedAttribute(description = "Get IP addresses in blacklist")
    public String[] getBlacklist() {
    
    
        return ips.toArray(new String[1]);
    }

    /**
     * 对于操作,使用@ManagedOperation注解标注,操作有addBlacklist()和
     * removeBlacklist()其他方法如shouldBlock()不会被暴露给JMX。
     * @param ip
     */
    @ManagedOperation
    @ManagedOperationParameter(name = "ip", description = "Target IP address that will be added to blacklist")
    public void addBlacklist(String ip) {
    
    
        ips.add(ip);
    }

    @ManagedOperation
    @ManagedOperationParameter(name = "ip", description = "Target IP address that will be removed from blacklist")
    public void removeBlacklist(String ip) {
    
    
        ips.remove(ip);
    }

    public boolean shouldBlock(String ip) {
    
    
        return ips.contains(ip);
    }
}

Interceptar interfaz y clase de implementación:

public interface IpInterceptor {
    
    

    boolean preHandle(String ip);
}
@Component
@Slf4j
public class BlackIpHandle implements IpInterceptor {
    
    
    @Autowired
    private BlackListMBean blackListMBean;

    @Override
    public boolean preHandle(String ip) {
    
    
        return blackListMBean.shouldBlock(ip);
    }
}

método de prueba:

@RequestMapping("/test/Jmx/{str}")
public void jmxTest(@PathVariable(value = "str") String str) {
    
    
    if (blackIpHandle.preHandle(str)) {
    
    
        loggger.warn("拦截成功");
        return;
    }
    loggger.warn("拦截失败");
    return;
}

Inicie la aplicación, abra JConsole.exe en el archivo bin en el archivo jdk en java, busque su aplicación y conéctese a ella
Inserte la descripción de la imagen aquí
. Puede ver la información de la memoria y el hilo de la pila en JConsole. Puede ver la lista de MBean aquí. Encuentre nuestro Media registrada (empresa)
, que contiene atributos, operaciones, notificaciones, etc.
Primero, ejecutamos el resultado del método de obtención de datos de la lista negra: Inserte la descripción de la imagen aquí
se pueden ver tres datos, y lo mismo ocurre con la adición de datos. 6666 se agregó posteriormente dinámicamente por JConsole, y luego ejecutar la solicitud e interceptarla directamente con éxito. Aquí probamos directamente los resultados como se muestra en la figura:
Inserte la descripción de la imagen aquí

El programa Java abre el servicio JMX

Si desea monitorear un programa Java, debe agregar parámetros relacionados con JMX cuando se inicia el programa (conexión local, puede agregar o no aquí, el número de puerto aquí es el número de puerto que escucha JConsole, no el número de puerto del Servicio).

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9102
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

Los tres parámetros son: puerto de servicio, política de seguridad, cifrado SSL

Conección remota

El entorno de prueba se implementa en el servidor RedHat6.5 Por lo general, se pueden agregar los siguientes parámetros para permitir conexiones remotas.

-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Sin embargo, la prueba real no se puede conectar, después de consultar la información, la configuración final es la siguiente y se realiza la conexión remota.

(java -jar -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false app-1.0.jar&)

Al mismo tiempo, debe prestar atención a si el puerto del servidor está bloqueado y si los hosts están configurados con la IP real. Puede usar el comando hostname -i para consultar si la ip es válida. Por ejemplo, la ip real es 10.10.10.101 y el nombre de la computadora es mycomputer. La configuración de los hosts es la siguiente:

10.10.10.101   mycomputer

Supongo que te gusta

Origin blog.csdn.net/qq_40093255/article/details/115208924
Recomendado
Clasificación