Explication détaillée de JMX et utilisation de JConsole

JMX

JMX (Java Management Extensions) est un framework d'implantation de fonctions de gestion dans les applications. C'est un ensemble d'agents et de services standard. Le service est un programme de surveillance des performances des programmes Java officiellement fourni par le JDK. Prend en charge l'accès à distance, prend en charge l'expansion, c'est-à-dire les paramètres de performance du moniteur personnalisés. Fournit trois niveaux d'appels: réseau, API et client. En fait, la plate-forme Java utilise JMX comme interface standard de gestion et de surveillance.Tout programme peut obtenir toutes les informations de gestion et de surveillance tant qu'il accède à cette interface conformément à la spécification JMX. Les outils de surveillance de fonctionnement et de maintenance couramment utilisés tels que Zabbix, Nagios et d'autres outils de surveillance de la JVM elle-même sont toutes les informations obtenues via JMX.

Scénarios d'application

La page de gestion du logiciel middleware WebLogic est développée sur la base de JMX, tandis que JBoss est l'ensemble du système basé sur l'architecture JMX. Il existe plusieurs façons de modifier certains paramètres comme suit:

  1. Écrit mort dans le code, modifiez lorsque vous devez apporter des modifications, puis recompilez et relâchez.

  2. Écrit dans le fichier de configuration, comme les propriétés java, lorsque vous devez modifier, il vous suffit de modifier le fichier de configuration, mais le système doit être redémarré pour prendre effet.

  3. Écrivez un morceau de code pour mettre en cache la valeur de configuration. Lorsque le système l'obtient, vérifiez d'abord si le fichier de configuration a changé. En cas de modification, récupérez la dernière valeur de la configuration, sinon lisez-la à partir du cache, par exemple, lire les données du centre de configuration Apollo.

  4. Utilisez JMX pour concentrer les attributs à configurer dans une classe, puis écrivez un MBean, puis effectuez la configuration associée, et JMX fournit une page d'outil JConsole pour faciliter la modification des valeurs de paramètres.

Architecture JMX

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

La structure de JMX est divisée en trois couches: couche de base (principalement MBean), couche d'adaptation (adaptateur), couche d'interface (connecteur)

MBean

JMX transforme toutes les ressources gérées en MBeans (ManagedBeans). Ces MBeans sont tous gérés par MBeanServer. Si vous souhaitez accéder aux MBeans, vous pouvez utiliser l'interface d'accès externe fournie par MBeanServer, telle que RMI ou HTTP.

L'utilisation de JMX n'a ​​pas besoin d'installer de composants supplémentaires, ni de bibliothèques tierces, car MBeanServer est déjà intégré à la bibliothèque standard JavaSErver, et JavaSE fournit également un programme JConsole pour que RMI se connecte au MBeanServer, de sorte que l'ensemble processus peut être géré.

En plus de la JVM enregistrera ses diverses ressources en tant que MBeans dans JMX, nos propres informations de configuration et de surveillance peuvent également être enregistrées en tant que MBeans dans JMX, de sorte que le programme de gestion puisse contrôler directement les MBeans que nous exposons.

Les MBeans sont divisés en quatre types suivants:

Types de la description
MBean standard Ce type de MBean est le plus simple. Les ressources qu'il peut gérer (y compris les attributs, les méthodes et l'heure) doivent être définies dans l'interface, puis le MBean doit implémenter cette interface. Son nom doit également suivre certaines spécifications. Par exemple, si notre MBean est Hello, l'interface doit être HelloMBean.
MBean dynamique Doit implémenter l'interface javax.management.DynamicMBean, tous les attributs et méthodes sont définis au moment de l'exécution
ouvrir MBean La spécification de ce MBean n'est pas encore terminée et est en cours d'amélioration
modèle MBean Par rapport aux MBeans standard et dynamiques, vous n'avez pas besoin d'écrire des classes MBean, utilisez simplement javax.management.modelmbean.RequiredModelMBean. RequiredModelMBean implémente l'interface ModelMBean et ModelMBean étend l'interface DynamicMBean, si similaire à DynamicMBean, les ressources de gestion du Model MBean sont également définies lors de l'exécution. La différence avec DynamicMBean est que les ressources gérées par DynamicMBean sont généralement définies dans DynamicMBean (seules ces ressources sont gérées à l'exécution), et les ressources gérées par le modèle MBean ne sont pas dans le MBean, mais dans l'externe (généralement une classe), uniquement lors de l'exécution A l'époque, il a été ajouté au modèle MBean via la méthode set. Les exemples suivants seront présentés en détail

Couche d'adaptation

MBeanServer assure principalement l'enregistrement et la gestion des ressources

Couche d'accès

Fournir un accès à distance

Instructions

  1. Ecrivez l'interface de gestion et les données de surveillance fournies par le MBean.
  2. Enregistrer MBean

Cas:

Ajoutez l'annotation @EnableMBeanExport au programme de démarrage pour dire à Spring d'enregistrer automatiquement le 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);
        }
        }

Write MBean, voici pour configurer les données de la liste noire à titre d'exemple, via JConsole pour obtenir des données de configuration et ajouter des données pour supprimer des données, et la configuration prendra effet immédiatement sans recompilation et publication de code.

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);
    }
}

Interface d'interception et classe d'implémentation:

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éthode d'essai:

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

Démarrez l'application, ouvrez JConsole.exe dans le fichier bin dans le fichier jdk en java, recherchez votre application et connectez-vous
Insérez la description de l'image ici
. Vous pouvez afficher la mémoire et les informations de thread de pile dans JConsole. Vous pouvez voir la liste des MBean ici. Trouvez notre Registered Mean (company)
, qui contient des attributs, des opérations, des notifications, etc.
Premièrement, nous exécutons le résultat de la méthode d'obtention des données de la liste noire: Insérez la description de l'image ici
vous pouvez voir trois données, et il en va de même pour l'ajout de données. par JConsole, puis exécutez la demande et interceptez directement avec succès. Ici, nous testons directement les résultats comme indiqué sur la figure:
Insérez la description de l'image ici

Le programme Java ouvre le service JMX

Si vous souhaitez surveiller un programme Java, vous devez ajouter des paramètres liés à JMX au démarrage du programme (connexion locale, vous pouvez ajouter ou non ici, le numéro de port ici est le numéro de port que JConsole écoute, pas le numéro de port du un service).

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

Les trois paramètres sont: le port de service, la politique de sécurité, le cryptage SSL

Connexion à distance

L'environnement de test est déployé sur le serveur RedHat6.5 En règle générale, les paramètres suivants peuvent être ajoutés pour permettre les connexions à distance.

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

Cependant, le test réel ne peut pas être connecté. Après avoir interrogé les informations, la configuration finale est la suivante et la connexion à distance est établie.

(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&)

Dans le même temps, vous devez faire attention à savoir si le port du serveur est bloqué et si les hôtes sont configurés avec l'adresse IP réelle. Vous pouvez utiliser la commande hostname -i pour demander si l'adresse IP est valide. Par exemple, l'adresse IP réelle est 10.10.10.101 et le nom de l'ordinateur est mycomputer. La configuration des hôtes est la suivante:

10.10.10.101   mycomputer

Je suppose que tu aimes

Origine blog.csdn.net/qq_40093255/article/details/115208924
conseillé
Classement