As características dos microsserviços determinam que a implantação de módulos funcionais é distribuída. A maioria dos módulos funcionais é executada em diferentes máquinas e interage entre si por meio de chamadas de serviço. Os fluxos de negócios na frente e no back office serão processados e passados por muitos microsserviços. Como localizar rapidamente exceções? Qual link tem um problema?
Sob essa estrutura, o monitoramento dos microsserviços é particularmente importante. Este artigo combina principalmente o atuador de inicialização da primavera para compartilhar com você o uso comum do Atuador de inicialização do MicrosService Spring, para que possamos monitorar e gerenciar nossos microsserviços na vida cotidiana.
Monitoramento do atuador
A Spring Boot usa o conceito de "hábitos melhor do que a configuração" e usa a digitalização de pacotes e os mecanismos automatizados de configuração para carregar feijões de mola que dependem de potes. Não requer nenhuma configuração XML para implementar todas as configurações de mola. Embora fazer isso torna nosso código muito conciso, as informações como criação de instância e dependências de todo o aplicativo são discretas às anotações de várias classes de configuração, o que dificulta a análise dos vários relacionamentos entre recursos e instâncias em todo o aplicativo.
O atuador é uma função integrada da introspecção e monitoramento dos sistemas de aplicativos fornecidos pela Spring Boot. Você pode visualizar informações detalhadas da configuração do aplicativo, como informações de configuração automatizadas, feijões de mola criados e algumas propriedades ambientais.
O monitoramento do atuador pode ser feito adicionando as seguintes dependências
<Dependences> <pendency> <voundid> org.springframework.boot </frupiD> <TRATIFACTID> Spring-boot-starter-web </artifactId> </dependency> <pendencency> <pursping> org.springframework.boot </groupId> <Artifactid> Spring-BoTtars Starter-TringFramework.Boot </GroupId> <GrupidId> org.springframework.boot </frupid> <TRATIFACTID> Spring-boot-Starter-Security </ArtifactId> </dependency> </dependências>
Para garantir a segurança da interface de monitoramento exposta pelo Atuador, é necessário adicionar dependências de dependências de controle de segurança de primavera-inicialização. Ao acessar pontos de extremidade de monitoramento de aplicativos, são necessárias informações de verificação. Dependências de segurança, você pode optar por não adicionar ou gerenciar a segurança, mas isso não é recomendado.
Interface de repouso do atuador
O monitoramento do atuador é dividido em duas categorias: terminais nativos e terminais definidos pelo usuário; Os pontos de extremidade personalizados se referem principalmente à escalabilidade. Os usuários podem definir alguns indicadores mais preocupados com base em seus aplicativos reais e monitorá -los durante o tempo de execução.
Os pontos de extremidade nativos fornecem inúmeras interfaces da Web em aplicativos para entender o estado interno do tempo de execução do aplicativo. Os pontos de extremidade nativos podem ser divididos em três categorias:
O atuador fornece 13 interfaces, conforme mostrado na tabela a seguir.
| Métodos HTTP | caminho | descrever |
|---|---|---|
| PEGAR | /AutoConfig | Um relatório de configuração automática é fornecido para registrar quais condições de configuração automáticas foram aprovadas e quais não foram aprovadas. |
| PEGAR | /ConfigProps | Descreva como injetar um feijão com propriedades de configuração (incluindo valores padrão) |
| PEGAR | /feijões | Descreva todos os feijões no contexto do aplicativo e seu relacionamento |
| PEGAR | /jogar fora | Obtenha um instantâneo da atividade do thread |
| PEGAR | /Env | Obtenha todos os atributos do ambiente |
| PEGAR | /Env/{Nome} | Obtenha valores específicos do atributo de ambiente com base no nome |
| PEGAR | /saúde | Relatórios de métricas de saúde para o aplicativo, esses valores são fornecidos pela classe de implementação do HealthIndicator |
| PEGAR | /Info | Obtenha informações personalizadas para o aplicativo, que é fornecido pelos atributos liderados por informações |
| PEGAR | /mapeamentos | Descreva todos os caminhos do URI e seu relacionamento de mapeamento com o controlador (incluindo pontos de extremidade do atuador) |
| PEGAR | /métricas | Relatar várias métricas de aplicativos, como uso de memória e contagem de solicitações HTTP |
| PEGAR | /métricas/{nome} | Relata o valor métrico do aplicativo do nome especificado |
| PUBLICAR | /desligar | Feche o aplicativo e requer endpoints.shutdown.enabled para ser definido como true |
| PEGAR | /rastreio | Forneça informações básicas de rastreamento de solicitação HTTP (timestamp, cabeçalho HTTP, etc.) |
Comece rapidamente
Configurações relacionadas
Dependência do projeto
<Dependences> <pendency> <voundiD> org.springframework.boot </groupiD> <TRORFACTID> Spring-boot-starter-web </artifactId> </dependency> <pendenceM> <PrethId> org.springframework.boot </groupid> <ArtifactId> <puring-brottar-brtar-tringframework.boot </groupid> <Artifactid> Spring-BoTtars Starter-Tringwork.boot </grupo> <Artifactid> Spring-BoTtars Starter-Tringwork.Boot </Groupid> <Artifactid>
Arquivo de configuração
Servidor: Porta: 8080 Management: Segurança: Ativado: False #Switch Off Porta de autenticação de segurança: 8088 #Admin A porta é ajustada para 8088 contexto: /Monitor #Access Pathpoints de acesso: desligamento: habilitado: trueInfo: App: Nome: Spring-boot-actuator Versão: 1.0.0
Após a conclusão da configuração, o projeto pode ser iniciado e você pode continuar a verificar as várias funções de monitoramento.
Explicação detalhada do comando
AutoConfig
A função de configuração automática da Spring Boot é muito conveniente, mas às vezes também significa que é difícil descobrir a causa específica quando há um problema. Use o AutoConfig para visualizar as condições sob as quais uma determinada configuração entra em vigor durante o tempo de execução do aplicativo ou por que uma configuração automática não entra em vigor.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/autoconfig. A parte de retorno da informação é a seguinte:
{"positivematches": {"devToolsdataSourCeautoconfiguration": {"NotMatched": [{"Condition": "DevToolsDatasourceAutoconfiguration.DevToolsDataSourCeCondition" Data ":" DevToolsdatas ]}, "RemotedEvToolSautoconfiguration": {"nãoMatched": [{"condicionado": "onPropertyCondition", "Message": "@ConditionalOnProperty (spring.devtools.remote.secret) não encontrou propriedade 'secreta'"}], "match": [{"Match.Remote.Secret) não encontrou a propriedade '"}], "mataged": [":". "@ConditionalOnClass encontrou as classes necessárias 'javax.servlet.filter', 'org.springframework.http.server.serverhttprequest'; @conditionalonmissingclass não encontrou classe indesejada"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}ConfigProps
Veja o conteúdo das propriedades definidas no arquivo de configuração, bem como os valores padrão de algumas propriedades de configuração.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/configProps. A parte de retorno da informação é a seguinte:
{ ... "environmentEndpoint": { "prefix": "endpoints.env", "properties": { "id": "env", "sensitive": true, "enabled": true } }, "spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties": { "prefix": "spring.http.multipart", "properties": { "maxRequestSize": "10MB", "fileSizeThreshold": "0", "location": null, "maxFileSize": "1MB", "enabled": true, "resolveLazily": false } }, "infoEndpoint": { "prefix": "endpoints.info", "Propriedades": {"id": "info", "sensível": false, "ativado": true}} ...}feijões
A partir do exemplo, podemos ver que o pseudônimo do feijão, tipo, seja um singleton, o endereço da classe, a dependência e outras informações são exibidas.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/beans. A parte de retorno da informação é a seguinte:
[{"Context": "Aplicativo: 8080: Gerenciamento", "Parent": "Application: 8080", "Beans": [{"Bean": "IncorpdedservletContainerFactory", "Aliases": [], "Scope": "Singleton", "Type": "org.springframework.boot.context.embedded.tomcat.tomcatembeddedservletContainerFactory", "Resource": "NULL", "Dependências": []}, {"bean": "endpointwebmbmvcContexContetConfiguration", "Bean": "EndpointwebmBmvcConetConetConfiguration", "Alias": "org.springframework.boot.actuate.autoconfigure.endpointwebmvcchildContextConfiguration $$ ENCERMEBYSPRINGCGLIB $$ A4A10F9D", "Recurso": "Null", "Dependências": []}}}] "jogar fora
A interface /dump gerará um instantâneo da atividade atual do encadeamento. Essa função é muito boa, o que torna conveniente verificar a situação do tópico quando estamos localizando problemas na vida cotidiana. Ele exibe principalmente informações como nome do thread, ID do thread, status do thread, seja para aguardar os recursos de bloqueio.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/dump. A parte de retorno da informação é a seguinte:
[{"ThreadName": "HTTP-NIO-8088-EXEC-6", "ThreadID": 49, "BlockedTime": -1, "BlockedCount": 0, "WaitedTime": -1, "WaitedCount": 2, "Lockname": "java.util.concurrent.locks.abstractQueedsynchronizer$ConditionObject@1630A501", "LockOwnerID": -1, "LockOwnerName": nulo, "Innativo": "Suspense": Falsestate ":" "Park" "," parque ":" parque ":" Methodtrace ":" Suspense ": Falsestate": "", "StackTrace" [{Suspense ": "UNSAFE.java", "linho": -2, "ClassName": "Sun.misc.unsfe", "nativemethod": true}, {"MethodName": "Park", "FileName": "LockSupport.java", "Linarum": 175, "Classname" " "java.util.concurrent.locks.locksupport", "nativemethod": false}, {"MethodName": "Await", "FileName": "AbstractQueedSynchronizer.java", "linenumber": 2039, "ClassName": "java.util.concurrent.locks.abstractQueedsynchronizer $ conditionObject", "nativemethod": false}, ... {"MethodName": "getTask", "FileName": "ThreadPoolexecutor.java", "linunumber": 1067, "ClassName" ": "PoolExecutor.java", "LinNumber": 1067, "Class." "Nativemethod": false}, {"MethodName": "RunWorker", "FileName": "ThreadpoolExecutor.java", "linenumber": 1127, "ClassName": "Java.util.Concurrent.ThreadPoolor", "NatVemethod": "ThreadpoolExecutor.java", "linenumber": 617, "ClassName": "java.util.concurrent.threadpoolExecutor $ worker", "nativemethod": false}, {"MethodName": "run," filename ":" TaskThread.Java "," "linum": "run," filename ":" TaskThread.Java "," "org.apache.tomcat.util.threads.taskthread $ wrappingrunnable", "nativemethod": false}, {"MethodName": "run", "filename": "thread.java", "linenumber": 745, "classMame": "Java.lang.lang.th", ",": "Java.java", "linenumber": 745, "ClassName": " "LockedMonitors": [], "LockedSynchronizers": [], "Lockinfo": {"ClassName": "java.util.concurrent.locks.abstractqueedsynchronizer $ condicioneObject", "identityhcode": 372286721}}}Env
Exibe as informações de configuração das variáveis do ambiente do sistema, incluindo as variáveis de ambiente utilizadas, propriedades da JVM, parâmetros da linha de comando, pacotes JAR usados pelo projeto, etc. Diferentemente do ConfigProps, o ConfigProps se concentra nas informações de configuração, enquanto o ENV se concentra na operação de informações do ambiente.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/Env. A parte de retorno da informação é a seguinte:
{"Perfis": [], "Server.ports": {"local.management.port": 8088, "local.server.port": 8080}, "servletContextinitParams": {}, "SystemProperties": {"com.sun.management.jmxRemote.aThent. "Java (TM) SE RUNTIME AIMBIMENCIAL", "spring.output.ansi.enabled": "sempre", "sun.boot.library.path": "c: // arquivos de programas // java // jdk1.8.0_101 // jre // bin," java.vm.version ": 25.101 // Corporation "," java.vendor.url ":" http://java.oracle.com/ "," java.rmi.server.randomids ":" true "," path.separator ":"; "Sun.io", "user.country": "cn", "user.script": "", "sun.java.launcher": "sun_standard", "sun.os.patch.level": "," pid ":" 5268 "," com.sun.Management.jmxRemote.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port.port. "Java Virtual Machine SPEPara evitar informações confidenciais sendo expostas a /Env, todos os atributos nomeados senha, segredo, chave (ou o último parágrafo do nome são estes) serão adicionados ao /Env com "*". Por exemplo, se houver um banco de dados de nome da propriedade.password, seu efeito de exibição em /Env é assim:
"Database.password": "********"
Uso de /Env /{Name}
Ou seja, a extensão Env pode obter as informações de configuração especificadas, como: http: // localhost: 8088/monitor/Env/java.vm.version, retornar: {"java.vm.version": "25.101-b13"}
saúde
Você pode ver que o HealthEndPoint nos fornece resultados de monitoramento padrão, incluindo detecção de disco e detecção de banco de dados
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/saúde retorna parte das informações, a seguinte resposta JSON é composta de estado, espaço em disco e banco de dados. Descreve o status geral de saúde do aplicativo, indica que o aplicativo é saudável. O espaço em disco descreve o espaço total do disco, o espaço restante do disco e o limite mínimo. O limite Application.Properties é configurável
{"status": "up", "DiskSpace": {"status": "up", "Total": 209715195904, "grátis": 183253909504, "limite": 10485760} "db": {"" ":" up "," datase "", "datase": ":", ",", ",", ",", ",", ", 10485760}" db ": {" "": "up", "datase"De fato, analisando o código-fonte do attuador de inicialização da primavera, você descobrirá que as informações fornecidas pelo HealthEndPoint não se limitam a isso. Sob o pacote org.springframework.boot.actuate.health, você encontrará ElasticsearchHealthIndicator, RedishealthIndicator, Rabbithealthindicator, etc.
informações
Informações são as informações de configuração que configuramos no arquivo de configuração, começando com informações. Por exemplo, nossa configuração no projeto de exemplo é:
Info: App: Nome: Spring-Boot-ATtuator Versão: 1.0.0
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/informações A parte de retorno da informação é a seguinte:
{"App": {"Name": "Spring-boot-actuator", "versão": "1.0.0"}}mapeamentos
Descreva todos os caminhos de URI e seu relacionamento de mapeamento com o controlador
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/mapeamentos. A parte de retorno da informação é a seguinte:
{ "/**/favicon.ico": { "bean": "faviconHandlerMapping" }, "{[/hello]}": { "bean": "requestMappingHandlerMapping", "method": "public java.lang.String com.neo.controller.HelloController.index()" }, "{[/error]}": { "Bean": "requestmapphandlemapping", "método": "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étricas
Um dos conteúdos de monitoramento mais importantes é monitorar principalmente o uso de conteúdo da JVM, situação de GC, informações de carregamento de classe etc.
Inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/métricas. A parte de retorno da informação é a seguinte:
{"MEM": 337132, "Mem.Free": 183380, "Processors": 4, "Instância.uptime": 254552, "Uptime": 259702, "SystemLoad.average": -1.0, "Heap.Commited": 29284, "HEP.init "20," 292864, "": ":" 292864: "" 292864: "": "292864": "29264": "292864:" ":" 292864: ":" 292864: "" 292864: "" 292864: 1827840, "Nonheap.Commited": 45248, "Nonheap.init": 2496, "não -heap.Used": 44269, "Nonheap": 0, "Threads.peak": 63, "Threads.Daemon": 43, "Threads.TotalStarted": 83, "Threads.Daemon": 43, "Threads.TotalStarted": 83, " "Classes.unloaded": 6357, "Class.unloaded": 0, "gc.ps_scavenge.count": 8, "gc.ps_scavenge.time": 99, "gc.ps_marksweep.count": 1, "GC.PS_MARKEEP.As informações fornecidas pela interface /métricas são simplesmente classificadas da seguinte forma:
| Classificação | Prefixo | Relatar conteúdo |
|---|---|---|
| Coletor de lixo | gc.* | O número de coleções de lixo que ocorreram e o tempo gasto na coleção de lixo é adequado para coletores de lixo para limpar marcas e coletores de lixo paralelos (dados originários de java.lang.Management. GarbagecollectormxBean) |
| Memória | Mem.* | A quantidade de memória alocada para o aplicativo e a quantidade de memória livre (dados originários de Java.lang. |
| pilha | Heap.* | Uso da memória atual (dados originados em java.lang.management.memoryusage) |
| Carregador de classe | Classes.* | O número de classes carregadas e descarregadas pelo carregador de classe JVM (dados originados em java.lang. Management.ClassLoadingMxBean) |
| sistema | Processadores, Instance.uptime, Uptime, Systemload.average | Informações do sistema, como o número de processadores (dados originários de java.lang.runtime), tempo de execução (dados originários de java.lang.management.runtimemxbean), média de carga (dados originários de java.lang.management.operatingsystemmxbean) |
| Pool de threads | fio.* | O número de threads, fios daemon e o número de pico de threads após a inicialização da JVM (os dados originados em java.lang.management.threadmxbean) |
| Fonte de dados | DataSource.* | Número de conexões de fonte de dados (metadados da fonte de dados, somente se o feijão do DataSource existir no contexto do aplicativo da primavera) |
| Tomcat Sessão | httpSessions.* | O número da sessão ativa do Tomcat e o número máximo da sessão (os dados vêm de feijões incorporados do tomcat, que só estão disponíveis ao executar o aplicativo usando o servidor incorporado TomCat) |
| Http | contador.status., gauge.Response. | Medidas e contadores para solicitações HTTP para vários serviços de aplicativo |
Explicação:
desligar
Ligue a interface e feche elegantemente o aplicativo de inicialização da mola. Para usar esta função, você deve primeiro habilitá -la no arquivo de configuração:
terminais: desligamento: habilitado: true
Após a conclusão da configuração, inicie o projeto de amostra e visite: http: // localhost: 8088/monitor/desligamento A parte do retorno das informações é a seguinte:
{"mensagem": "Desligando, tchau ..."}Neste ponto, você descobrirá que o aplicativo foi fechado.
traço
A interface /rastreio pode relatar as informações detalhadas de todas as solicitações da Web, incluindo métodos de solicitação, caminhos, registros de data e hora e informações sobre o cabeçalho de solicitação e resposta, e registrar as informações detalhadas de cada solicitação.
Inicie o projeto de amostra, visite -o primeiro: http: // localhost: 8080/hello e depois execute -o no navegador: http: // localhost: 8088/monitor/rastrear as informações de devolução:
[{"Timestamp": 1516780334777, "info": {"método": "get", "caminho": "/hello", "cabeçalhos": {"request": {"host": "lochost: 8080", "conexão": "alive", "cache-controle": " NT 10.0; "Texto/html, aplicativo/xhtml+xml, aplicativo/xml; q = 0,9, imagem/webp, imagem/apng,*/*; q = 0,8", "aceita codificação": "gzip, desflate, BR", "aceita-language": "zh-cn, zh; "Um_distinctId = 16053BA344F1CD-0DC220C44CC94-B7A103E-13C680-16053BA3450751; Hm_lvt_0fb30c642c5f6453f17d881f529a1141 = 1513076406,1514961720,1515649377; Hm_lvt_6d8e8bb59814010152d98507a18ad229 = 1515247964,1515296008,1515672972,1516086283 "}," resposta ": {" X-Appltication "" "" "Appplication" "" "" "" "" "Appplication" Application-CON-CON ":" Response ": {" X-Application " "Texto/html; charset = utf-8", "content-comprimento": "11", "Date": "Wed, 24 de janeiro de 2018 07:52:14 GMT", "Status": "200"}}, "timetaken": "4"}}]As informações acima mostram os detalhes da solicitação /hello.
Outras configurações
Restrições ao acesso a informações confidenciais
De acordo com a tabela acima, se a autenticação for falsa, significa que é insensível e pode ser acessada à vontade. Caso contrário, será protegido e não poderá ser acessado à vontade.
endpoints.mappings.sensitive = false
Isso requer a configuração de cada um, o que é mais problemático. O método sensível exige que o usuário tenha a função do atuador por padrão, para que você também possa definir as restrições de segurança:
Management.Security.Enabled = false
Ou cooperar com a segurança da primavera para controle de grão fino.
Ativar e desativar interfaces
Embora as interfaces do atuador sejam úteis, você não precisa necessariamente de todas elas. Por padrão, todas as interfaces (exceto /desligamento) estão ativadas. Por exemplo, para desativar a interface /métricas, você pode defini -la da seguinte forma:
endpoints.metrics.enabled = false
Se você deseja abrir apenas uma ou duas interfaces, desative todas as interfaces primeiro e depois ative aqueles que desejar, o que é mais conveniente.
endpoints.enabled = falsendPoints.metrics.enabled = true
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.