Les caractéristiques des microservices déterminent que le déploiement de modules fonctionnels est distribué. La plupart des modules fonctionnels fonctionnent sur différentes machines et interagissent entre eux via des appels de service. Les flux commerciaux à l'avant et au back-office seront traités et transmis par de nombreux microservices. Comment localiser rapidement les exceptions? Quel lien a un problème?
Dans ce cadre, la surveillance des microservices est particulièrement importante. Cet article combine principalement l'actionneur de démarrage de Spring pour partager avec vous l'utilisation commune de l'actionneur de démarrage de Spring Microservice, afin que nous puissions surveiller et gérer nos microservices dans la vie quotidienne.
Surveillance de l'actionneur
Spring Boot utilise le concept de "Habitudes mieux que la configuration" et utilise des mécanismes de numérisation et de configuration automatisés pour charger les haricots à ressort qui dépendent des bocaux. Il ne nécessite aucune configuration XML pour implémenter toutes les configurations de ressort. Bien que cela rend notre code très concis, les informations telles que la création d'instances et les dépendances de l'ensemble de l'application sont discrètes pour les annotations de diverses classes de configuration, ce qui nous rend très difficile d'analyser les différentes relations entre les ressources et les instances de toute l'application.
L'actionneur est une fonction intégrée de l'introspection et de la surveillance des systèmes d'application fournis par Spring Boot. Vous pouvez afficher des informations détaillées sur la configuration des applications, telles que les informations de configuration automatisées, créé des haricots à ressort et certaines propriétés environnementales.
La surveillance de l'actionneur peut être effectuée en ajoutant les dépendances suivantes
<Dependances> <Dedency> <GroupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-web </retifactid> </dependency> <pedidency> <proupId> org.springframework.boot </proupactid> </ dépendance> Spring-boot-starter-cactuator </letifactid> </ dépendance> Spring-Boot-starter-Catorat <GroupId> org.springFramework.boot </prouprid> <ArtefactId> printemps-boot-starter-security </refactive> </dependency> </dpendances>
Afin d'assurer la sécurité de l'interface de surveillance exposée par actionneur, il est nécessaire d'ajouter des dépendances de contrôle de sécurité Spring-Boot-Start-Security Dependances. Lors de l'accès aux points de terminaison de surveillance des applications, des informations de vérification sont requises. Dépendances de sécurité, vous pouvez choisir de ne pas ajouter ou gérer la sécurité, mais elle n'est pas recommandée.
Interface de repos de l'actionneur
La surveillance de l'actionneur est divisée en deux catégories: points de terminaison natifs et points de terminaison définis par l'utilisateur; Les points de terminaison personnalisés se réfèrent principalement à l'évolutivité. Les utilisateurs peuvent définir certains indicateurs plus concernés en fonction de leurs applications réelles et les surveiller pendant l'exécution.
Les points de terminaison natifs fournissent de nombreuses interfaces Web dans les applications pour comprendre l'état interne de l'exécution des applications. Les points de terminaison natifs peuvent être divisés en trois catégories:
L'actionneur fournit 13 interfaces, comme indiqué dans le tableau suivant.
| Méthodes HTTP | chemin | décrire |
|---|---|---|
| OBTENIR | / AutoConfig | Un rapport de configuration automatique est fourni pour enregistrer quelles conditions de configuration automatiques ont été réalisées et qui n'ont pas été transmises. |
| OBTENIR | / configProps | Décrivez comment injecter un bean avec les propriétés de configuration (y compris les valeurs par défaut) |
| OBTENIR | /haricots | Décrivez tous les haricots dans le contexte d'application et leur relation |
| OBTENIR | /décharge | Obtenez un instantané de l'activité du fil |
| OBTENIR | / env | Obtenez tous les attributs de l'environnement |
| OBTENIR | / env / {nom} | Obtenir des valeurs d'attribut d'environnement spécifiques en fonction du nom |
| OBTENIR | /santé | Signale les mesures de santé pour l'application, ces valeurs sont fournies par la classe de mise en œuvre de HealthIndicator |
| OBTENIR | / info | Obtenez des informations personnalisées pour l'application, qui est fournie par les attributs dirigés par info |
| OBTENIR | / mappages | Décrivez tous les chemins URI et leur relation de cartographie avec le contrôleur (y compris les points de terminaison de l'actionneur) |
| OBTENIR | /métrique | Signaler diverses mesures d'application, telles que l'utilisation de la mémoire et le nombre de demandes HTTP |
| OBTENIR | / métriques / {nom} | Signale la valeur métrique de l'application du nom spécifié |
| POSTE | /fermer | Fermez l'application et nécessite des points de terminaison. |
| OBTENIR | /tracer | Fournir des informations de suivi de demande HTTP de base (horodatage, en-tête HTTP, etc.) |
Commencez rapidement
Configurations connexes
Dépendance du projet
<Dependances> <Dedency> <GroupId> org.springFramework.boot </proupId> <ArtifActid> printemps-boot-starter-web </ artifactid> </dependency> <pedidency> <proupId> org.springframework.boot </prouprid> <etifactive> Spring-Boot-starter-actuator </titifactid>
Fichier de configuration
Server: Port: 8080Management: Security: Activé: False #Switch Off Security Authentication Port: 8088 #AdMin Le port est ajusté au 8088 Context Path: / Monitor #Actuator Access Path Pointts: Shutdown: Activé: TrueInfo: App: Nom: Spring-Boot-ACTUATER version: 1.0.0
Une fois la configuration terminée, le projet peut être démarré et vous pouvez continuer à vérifier les différentes fonctions de surveillance.
Explication détaillée de la commande
autoconfig
La fonction de configuration automatique de Spring Boot est très pratique, mais parfois cela signifie également qu'il est difficile de découvrir la cause spécifique en cas de problème. Utilisez AutoConfig pour afficher les conditions dans lesquelles une certaine configuration prend effet pendant l'exécution de l'application, ou pourquoi une configuration automatique ne prend pas effet.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / autoconfig. La partie de retour des informations est la suivante:
{"positivematches": {"devtoolsdatasourceautoconfiguration": {"notmatched": [{"condition": "DevtoolsdatasourceAutoconfiguration.devtoolsdatasourcecondition", "message": "Devtoolsdatasource condition n'a pas trouvé de bean de dataSource unique". }, "RemotedevtoolsautoConfiguration": {"notmatched": [{"condition": "onPropertyCondition", "message": "@conditionalonproperty (printemps.devtools.remote.secret) n'a pas trouvé de propriété 'Secrect'"}], "Morde "@ConditionalonClass a trouvé des classes requises 'javax.servlet.filter', 'org.springframework.http.server.serverhttprequest'; @conditionalonMissingClass n'a pas trouvé de classe indésirable"}]}}}configprops
Affichez le contenu des propriétés définies dans le fichier de configuration, ainsi que les valeurs par défaut de certaines propriétés de configuration.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / monitor / configProps. La partie de retour des informations est la suivante:
{... "EnvironmentEndpoint": {"Prefix": "endpoint.env", "Properties": {"id": "Env", "Sensitive": true, "activé": true}}, "printemp "printemps.http.multupart", "Properties": {"MaxRequestSize": "10Mb", "FilesiSetHreshold": "0", "Location": NULL, "MaxFilesize": "1MB", "activé": true, "Resolvelazily": False}, "Inoendpoint": {"préolvelazily" "Propriétés": {"id": "info", "sensible": false, "activé": true}} ...}haricots
D'après l'exemple, nous pouvons voir que l'alias du bean, le type, que ce soit un singleton, l'adresse de la classe, la dépendance et d'autres informations sont affichées.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / beans. La partie de retour des informations est la suivante:
[{"Context": "Application: 8080: Management", "Parent": "Application: 8080", "Beans": [{"Bean": "EmbeddeDservletContainerFactory", "Aliases": [], "Scope": "Singleton", "Type": "org.springframework.boot.context.embedded.tomcat.tomcatembeddedeservletContainerFactory", "Resource": "null", "dépendances": []}, {"bean": "endpointwebmvcchildcontextconfiguration", "aliases": [], "SCOPE": "SingleTon", "Aliases": [] " "org.springframework.boot.actuate.autoconfigure.endpointwebmvcchildContextConfiguration $$ EnhancerByspringCglib $$ a4a10f9d", "ressource": "null", "dépendances": []}}]décharge
L'interface / vidage générera un instantané de l'activité de thread actuelle. Cette fonction est très bonne, ce qui nous permet de vérifier la situation du fil lorsque nous localisons des problèmes dans la vie quotidienne. Il affiche principalement des informations telles que le nom de thread, l'ID de thread, l'état du thread, s'il faut attendre les ressources de verrouillage.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / vidage. La partie de retour des informations est la suivante:
[{"ThreadName": "Http-Nio-8088-Exec-6", "Threadid": 49, "BlockEdTime": -1, "BlockEdCount": 0, "Witedtime": -1, "WaitedCount": 2, "Lockname": "Java.util.concurrent.locks.abstralie "Lockownerid": -1, "LockownerName": null, "invative": false, "suspendu": false, "threadState": "Waiting", "StackTrace": [{"Methodname": "Park", "FileNAM }, {"Methodname": "Park", "FileName": "locksupport.java", "linenumber": 175, "classname": "java.util.concurrent.locks.locksupport", "nativemethod": false}, {"Methodnname": "await", "filename": "Abstracte "LineNumber": 2039, "ClassName": "java.util.concurrent.locks.abstractqueeEdSynchronizer $ ConditionObject", "NativeMethod": false}, ... {"Methodnname": "GetTask", "Filename": "Claskname": " "java.util.concurrent.threadpoolExecutor", "nativeMethod": false}, {"Methodname": "runworker", "filename": "threadpoolExecutor.java", "linenumber": 1127, "classname": "java.util.concurrent.threadpoolExExExExExEx FAUX}, {"Methodname": "Run", "FileName": "ThreadpoolExecutor.java", "LineNumber": 617, "ClassName": "Java.util.concurrent.threadpoolExecutor $ Worker "LineNumber": 61, "classname": "org.apache.tomcat.util.threads.taskthread $ wappingrunnable", "nativemethod": false}, {"méthodyname": "run", "filename": "Thread.java", "linenumber": 745, "classname": "java.lang.thread", 745, "classname": "java.lang.thread", 745, "classname": "java.lang.thread", 745, "Classname": "Java.Lang.thread", 745, "Classname": "Java.Lang.thread", 745, "Classname": "Java.Lang.thread", 745, "CLASSNAME": "Java" "nativeMethod": false}], "LockedMonitors": [], "LockedSynchronizers": [], "lockinfo": {"classname": "java.util.concurrent.locks.abstralieeEdSynchronizer $ conditionobject", "identitéhashcode": 372286721}!]env
Affiche les informations de configuration des variables d'environnement système, y compris les variables d'environnement utilisées, les propriétés JVM, les paramètres de ligne de commande, les packages JAR utilisés par le projet, etc. Contrairement à ConfigProps, ConfigProps se concentre sur les informations de configuration, tandis que Env se concentre sur les informations sur l'environnement de fonctionnement.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / monitor / env. La partie de retour des informations est la suivante:
{"Profils": [], "server.ports": {"local.management.port": 8088, "local.server.port": 8080}, "ServletContextinitParams": {}, "SystemProperties": {"com.sun.management.jmxremote.authenticate": "false", "Java.runtile": ":": "false", "Java.runsime": ":": ":" faux "," Java.runtile ":": ":": "false", "Java.runtile": ":": ":" falsi "Java (TM) SE Runtime Environment", "printemps.output.ansi.enabled": "Always", "Sun.boot.library.path": "C: // Program Files // Java // JDK1.8.0_101 // JRE // bin", "Java.vm Corporation "," java.vendor.url ":" http://java.oracle.com/ "," java.rmi.server.randomids ":" true "," path.separator ":"; "," java.vm.name ":" java hotSpot (tm) 64-bit server vm "", "file.encoding.pkg":: 64-bit server vm "," file.encoding.pkg ":: 64-Bit Server VM" "," File.Encoding.pkg ": TM) 64-BIT VM" "Sun.io", "user.country": "cn", "user.script": "", "Sun.java.launcher": "Sun_standard", "Sun.os.patch.level": "", "pid": "5268", "com.sun.management.jmxreme.port": "60093", "java.v. "Java Virtual Machine SPEPour éviter que les informations sensibles soient exposées à / env, tous les attributs nommés mot de passe, Secret, Key (ou le dernier paragraphe du nom) seront ajoutés à / env avec "*". Par exemple, s'il existe une base de données de nom de propriété.
"database.password": "******"
Utilisation de / env / {nom}
Autrement dit, l'extension Env peut obtenir les informations de configuration spécifiées, telles que: http: // localhost: 8088 / monitor / env / java.vm.version, return: {"java.vm.version": "25.101-b13"}
santé
Vous pouvez voir que HealthEndpoint nous fournit des résultats de surveillance par défaut, y compris la détection du disque et la détection de la base de données
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / Monitor / Health Returns Part des informations, la réponse JSON suivante est composée d'état, d'espace disque et de DB. Décrit l'état de santé global de l'application, UP indique que l'application est saine. L'espace disque décrit l'espace disque total, l'espace disque restant et le seuil minimum. Le seuil d'application.properties est configurable
{"Status": "Up", "Diskspace": {"Status": "Up", "Total": 209715195904, "Free": 183253909504, "STATHOLD": 10485760} "DB": "Status": "Up", "Database": "MysQL", "Hello": 1}}En fait, en examinant le code source de Spring Boot-Actorator, vous constaterez que les informations fournies par HealthEndpoint ne sont pas limitées à cela. Dans le cadre du package org.springframework.boot.actuate.health, vous trouverez ElasticsearchHealthindicator, RedishEalthIndicator, RabbithealthIndicator, etc.
informations
Les informations sont les informations de configuration que nous configurons dans le fichier de configuration en commençant par des informations. Par exemple, notre configuration dans l'exemple du projet est:
Info: App: Nom: Spring-Boot-Actorator Version: 1.0.0
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / info La partie retour des informations est la suivante:
{"app": {"name": "printemp-boot-actuator", "version": "1.0.0"}}mappages
Décrivez tous les chemins URI et leur relation de cartographie avec le contrôleur
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / Monitor / mappings. La partie de retour des informations est la suivante:
{"/**/favicon.ico": {"bean": "faviconhandlermapping"}, "{[/ hello]}": {"bean": "requestmappinghandlermapping", "méthode": "public java.lang.string com.neo.controller. "bean": "requestmappinghandlermapping", "Method": "public org.springframework.http.Responseentity <java.util.map <java.lang.string, java.lang.object >> org.springframework.boot.autoconfigure.web.basicerrorcontroller.error (javax.servlet.http.httpservletRequest) "}}métrique
L'un des contenus de surveillance les plus importants est principalement la surveillance de l'utilisation du contenu JVM, de la situation GC, des informations de chargement de classe, etc.
Démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / métriques. La partie de retour des informations est la suivante:
{"MEM": 337132, "mem.free": 183380, "processeurs": 4, "instance.uptime": 254552, "Uptime": 259702, "Systemload.Every": -1.0, "Heap.Committed": 292864, "heap.Init": 129024, "Heap.used": "109483,": ":": ":": "HEAP": 129024 " 1827840, "nonheap.commise": 45248, "nonheap.init": 2496, "nonheap.used": 44269, "nonheap": 0, "threads.pak": 63, "threads.daemon": 43, "threads.totalstarted": 83, "Threads": 46, "Classes": 6357, "Und. 6357, "Classes.Unloaded": 0, "gc.ps_scavenge.count": 8, "gc.ps_scavenge.time": 99, "gc.ps_marksweep.count": 1, "gc.ps_marksweep.time": 43, "httpessions.max": -1, "Les informations fournies par l'interface / métriques sont simplement classées comme suit:
| Classification | Préfixe | Signaler un contenu |
|---|---|---|
| Éboueur | gc. * | Le nombre de collections de déchets qui se sont produites et le temps consacré à la collecte des ordures conviennent aux collectionneurs de déchets et aux ordures parallèles (données provenant de Java.lang.Management. GarbageCollectormxbean) |
| Mémoire | mem. * | La quantité de mémoire allouée à l'application et la quantité de mémoire libre (données proviennent de java.lang. Exécution) |
| tas | tas.* | Utilisation actuelle de la mémoire (données provenant de java.lang.management.memoryusage) |
| Chargeur de classe | classes. * | Le nombre de classes chargées et déchargées par le chargeur de classe JVM (données provenant de Java.lang. Management.ClassloadingMXBean) |
| système | processeurs, instance.Uptime, Uptime, Systemload.Every | Les informations système, telles que le nombre de processeurs (données provenant de java.lang.runtime), l'exécution (données provenant de java.lang.management.runtimemxbean), moyenne de chargement (données provenant de java.lang.management.OperatingSystemMXBean) |
| Piscine | fil de discussion.* | Le nombre de threads, les fils de démon et le nombre de threads de pic après le démarrage de JVM (données provenant de java.lang.management.threadmxbean) |
| Source de données | dataSource. * | Nombre de connexions de source de données (métadonnées à partir de la source de données, uniquement si le bean de données de données existe dans le contexte de l'application Spring) |
| Session de Tomcat | httpSessions. * | Numéro de session actif de Tomcat et numéro de session maximum (les données proviennent des haricots de Tomcat intégrés, qui ne sont disponibles que lors de l'exécution de l'application à l'aide du serveur Tomcat intégré) |
| Http | Counter.Status., Gauge.Response. | Mesures et compteurs pour les demandes HTTP pour divers services d'application |
Explication:
fermer
Allumez l'interface et fermez élégamment l'application de démarrage de ressort. Pour utiliser cette fonction, vous devez d'abord l'activer dans le fichier de configuration:
Points de terminaison: arrêt: activé: true
Une fois la configuration terminée, démarrez l'exemple de projet et visitez: http: // localhost: 8088 / moniteur / arrêt de retour partie des informations est la suivante:
{"Message": "Arrêt, au revoir ..."}À ce stade, vous constaterez que l'application a été close.
tracer
L'interface / trace peut signaler les informations détaillées de toutes les demandes Web, y compris les méthodes de demande, les chemins, les horodatages et les informations d'en-tête de demande et de réponse, et enregistrer les informations détaillées de chaque demande.
Démarrez l'exemple de projet, visitez-le d'abord: http: // localhost: 8080 / bonjour, puis exécutez-le dans le navigateur: http: // localhost: 8088 / moniteur / trace Voir les informations de retour:
[{"Timestamp": 1516780334777, "Info": {"Method": "Get", "Path": "/ Hello", "En-têtes": {"requête": {"Host": "LocalHost: 8080", "Connexion": "Keep-ALive", "Cache-Control": "Max-Age = 0", "User-Agent": "Moz / 5.0. NT 10.0; Win64; "Texte / Html, application / xhtml + xml, application / xml; q = 0,9, image / webp, image / apng, * / *; q = 0,8", "accepter-codage": "gzip, dégonfler,", "cookie": ":" zh-cn, zh; q = 0,9 "," cookie ":: "UM_DISTINCTID = 16053BA344F1CD-0DC220C44CC94-B7A103E-13C680-16053BA3450751; HM_LVT_0FB30C642C5F6453F17D881F529A1141 = 1513076406.1514961720,1515649377; Hm_lvt_6d8e8bb59814010152d98507a18ad229=1515247964,1515296008,1515672972,1516086283" }, "response": { "X-Application-Context": "application:8080", "Content-Type": "text / html; charset = utf-8", "contenu-longueur": "11", "date": "mer, 24 janvier 2018 07:52:14 GMT", "Status": "200"}}, "TimeTaken": "4"}}]Les informations ci-dessus affichent les détails de la demande / bonjour.
Autres configurations
Restrictions sur l'accès aux informations sensibles
Selon le tableau ci-dessus, si l'authentification est fausse, cela signifie qu'il est insensible et est accessible à volonté. Sinon, il sera protégé et ne peut être accessible à volonté.
endpoint.mappings.sentitif = false
Cela nécessite la configuration de chacun, ce qui est plus gênant. La méthode sensible nécessite que l'utilisateur ait le rôle de l'actionneur par défaut, vous pouvez donc également définir les restrictions de sécurité sur le désactivation:
Management.Security.enabled = False
Ou coopérer avec la sécurité du printemps pour un contrôle à grain fin.
Activer et désactiver les interfaces
Bien que les interfaces de l'actionneur soient utiles, vous n'avez pas nécessairement besoin de tous. Par défaut, toutes les interfaces (sauf / arrêt) sont activées. Par exemple, pour désactiver l'interface / métrique, vous pouvez le définir comme suit:
endpoint.metrrics.enabled = false
Si vous souhaitez uniquement ouvrir une ou deux interfaces, alors désactivez d'abord toutes les interfaces, puis activez les quelques-unes que vous voulez, ce qui est plus pratique.
endpoint.enabled = falsendpoint.metrrics.enabled = true
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.