마이크로 서비스의 특성에 따르면 기능 모듈의 배포가 분포되어 있다고합니다. 대부분의 기능 모듈은 다른 기계에서 실행되며 서비스 호출을 통해 서로 상호 작용합니다. 전면 및 뒷면의 비즈니스 흐름은 많은 마이크로 서비스로 처리되고 통과됩니다. 예외를 신속하게 찾는 방법은 무엇입니까? 어떤 링크가 문제가 있습니까?
이 프레임 워크에서 마이크로 서비스의 모니터링이 특히 중요합니다. 이 기사는 주로 Spring Boot 액추에이터를 결합하여 MicroService Spring Boot Actuator의 일반적인 사용법을 공유하여 일상 생활에서 마이크로 서비스를 모니터링하고 관리 할 수 있습니다.
액추에이터 모니터링
Spring Boot는 "구성보다 습관이 우수하다"는 개념을 사용하고 패키지 스캔 및 자동화 된 구성 메커니즘을 사용하여 항아리에 의존하는 스프링 콩을로드합니다. 모든 스프링 구성을 구현하기 위해 XML 구성이 필요하지 않습니다. 이를 수행하면 코드가 매우 간결하지만 전체 애플리케이션의 인스턴스 생성 및 종속성과 같은 정보는 다양한 구성 클래스의 주석에 분리되어있어 전체 애플리케이션의 리소스와 인스턴스 간의 다양한 관계를 분석하기가 매우 어렵습니다.
액추에이터는 Spring Boot에서 제공하는 응용 프로그램 시스템의 내성 및 모니터링의 통합 기능입니다. 자동화 된 구성 정보, 생성 된 스프링 빈 및 일부 환경 특성과 같은 응용 프로그램 구성에 대한 자세한 정보를 볼 수 있습니다.
액추에이터 모니터링은 다음 종속성을 추가하여 수행 할 수 있습니다.
<pectionies> <pectionency> <groupId> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-web </artifactid> </depectency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-actomenty> </artifactid> <groupid> org.springframework.boot </groupid> <artifactid> 스프링-부트 스타터-보안 </artifactid> </dependency> </fectionencies>
액추에이터에 의해 노출 된 모니터링 인터페이스의 보안을 보장하려면 보안 제어 종속성을 추가해야합니다. 응용 프로그램 모니터링 엔드 포인트에 액세스 할 때는 확인 정보가 필요합니다. 보안 종속성, 보안을 추가하거나 관리하지 않도록 선택할 수는 있지만 권장되지 않습니다.
액추에이터의 REST 인터페이스
액추에이터 모니터링은 두 가지 범주로 나뉩니다 : 기본 엔드 포인트 및 사용자 정의 엔드 포인트; 사용자 정의 엔드 포인트는 주로 확장 성을 나타냅니다. 사용자는 실제 애플리케이션을 기반으로 더 관련 지표를 정의하고 런타임 동안 모니터링 할 수 있습니다.
기본 엔드 포인트는 응용 프로그램 런타임의 내부 상태를 이해하기 위해 응용 프로그램의 수많은 웹 인터페이스를 제공합니다. 기본 엔드 포인트는 세 가지 범주로 나눌 수 있습니다.
액추에이터는 다음 표에서 볼 수 있듯이 13 개의 인터페이스를 제공합니다.
| HTTP 방법 | 길 | 설명하다 |
|---|---|---|
| 얻다 | /autoconfig | 자동 구성 보고서가 제공되어 통과되지 않은 자동 구성 조건을 기록하고 통과하지 않은 경우를 기록합니다. |
| 얻다 | /configProps | 구성 특성으로 Bean을 주입하는 방법을 설명하십시오 (기본값 포함) |
| 얻다 | /콩 | 응용 프로그램 컨텍스트 및 관계에서 모든 콩을 설명합니다. |
| 얻다 | /덤프 | 스레드 활동의 스냅 샷을 얻으십시오 |
| 얻다 | /env | 모든 환경 속성을 얻으십시오 |
| 얻다 | /env/{name} | 이름을 기준으로 특정 환경 속성 값을 가져옵니다 |
| 얻다 | /건강 | 응용 프로그램에 대한 건강 지표를보고,이 값은 Healthindicator의 구현 클래스에서 제공합니다. |
| 얻다 | /정보 | 정보로 제목하는 속성에서 제공하는 응용 프로그램에 대한 사용자 정의 정보 얻기 |
| 얻다 | /매핑 | 모든 URI 경로 및 컨트롤러와의 매핑 관계를 설명하십시오 (액추에이터 엔드 포인트 포함). |
| 얻다 | /메트릭 | 메모리 사용 및 HTTP 요청 수와 같은 다양한 응용 프로그램 메트릭을보고합니다. |
| 얻다 | /metrics/{name} | 지정된 이름의 응용 프로그램 메트릭 값을보고합니다 |
| 우편 | /일시 휴업 | 응용 프로그램을 닫고 endpoints.shutdown.enabled를 true로 설정해야합니다. |
| 얻다 | /추적하다 | 기본 HTTP 요청 추적 정보 (타임 스탬프, HTTP 헤더 등)를 제공합니다. |
빨리 시작하십시오
관련 구성
프로젝트 의존성
<pectionies> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-web </artifactid> </depectency> <groupid> org.springframework.boot </groupid> <artifactid> spring-bboot-starter--
구성 파일
서버 : 포트 : 8080 관리 : 보안 : 활성화 : 허위 #스위치 오프 보안 인증 포트 : 8088 #Admin 포트는 8088로 조정됩니다. 컨텍스트-컨텍스트- /모니터 #Actuator 액세스 경로 엔드 포인트 : 삭제 : enabled : app : 이름 : Spring-Boot-Actuator 버전 : 1.0.0
구성이 완료되면 프로젝트를 시작할 수 있으며 다양한 모니터링 기능을 계속 확인할 수 있습니다.
명령에 대한 자세한 설명
autoconfig
Spring Boot의 자동 구성 기능은 매우 편리하지만 때로는 문제가있을 때 특정 원인을 찾기가 어렵다는 것을 의미합니다. AutoConfig를 사용하여 응용 프로그램 런타임 중 특정 구성이 적용되는 조건 또는 자동 구성이 적용되지 않는 이유를보십시오.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/autoconfig를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
{ "positiveMatches": { "DevToolsDatasourceAutoConfiguration": { "notmatched": [{ "조건": "DevToolsDatasourceAutoconfiguration.DevToolsDataSourceCeDition", "메시지": "DevToolsDatasource 조건은 DevToolsDatasource 조건을 찾지 못했습니다. }, "RemotedEvToolsAutoConfiguration": { "notmatched": [{ "조건": "onpropertyCondition", "message": "@conditionalonProperty (spring.devtools.recret)는 속성을 찾지 못했습니다. "@ConditionalOnClass는 필수 클래스 'javax.servlet.filter', 'org.springframework.http.server.serverhttprequest'; @ConditionalOnMissingClass를 찾지 못했습니다"}}}}configProps
구성 파일에 설정된 속성의 내용과 일부 구성 속성의 기본값을 봅니다.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/configprops를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
{... "EnvironmentEndpoint": { "prefix": "endpoints.env", "properties": { "id": "env", "sensitive": true, "enabled": true}}, "spring.http."springframework.boot.autoconfigure.web.multippartiperties ":"pectippartiets ":“sectippartipart. "spring.http.multipart", "Properties": { "maxRequestSize": "10MB", "filesizetHreshold": "0", "위치": "maxFilesize": "1mb", "enabled": true, "resolvelazily": false}, "infoendpoint": ""endpo " "속성": { "id": "info", "sensitive": false, "enabled": true}} ...}콩
이 예에서, 우리는 싱글 톤, 클래스 주소, 종속성 및 기타 정보가 표시되는 콩의 별칭, 유형을 알 수 있습니다.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/beans를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
[{ "Context": "Application : 8080 : Management", "Parent": "Application : 8080", "Beans": [{ "Bean": "EmbeddedServletContainerFactory", "Aliases": [] : "Singleton", "Type": "org.springframework.boot.context.embedded.tomcat.tomcatembeddedservletcontainerfactory", "null", "종속성": []}, { "bean": "endpointwebmvcchildcontextConfiguration": "Scope", "", ",", ",", ",", ",", ",", "scope" "org.springframework.actuate.actuate.autoconfigure.endpointwebmvcildcontextconfiguration $$ EnhancerByspringcglib $$ a4a10f9d", "resource": "null", "dependencies": []}}]덤프
/덤프 인터페이스는 현재 스레드 활동의 스냅 샷을 생성합니다. 이 기능은 매우 우수하므로 일상 생활에서 문제를 찾을 때 스레드 상황을 확인하는 것이 편리합니다. 주로 스레드 이름, 스레드 ID, 스레드 상태, 잠금 리소스 대기 여부와 같은 정보가 표시됩니다.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/dump를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
[{ "ThreadName": "HTTP-NIO-8088-Exec-6", "ThreadId": 49, "BlockedTime": "BlockedCount": 0, "WaitedTime": -1, "WaitedCount": "LockName": ":"LockName ": "java.util.concurrent.locks.abstractqueuedsynchronizer$ConditionObjec@1630a501": "LockownerId": "Lockownername": "NULL": "SEPLEDEND": FALSE, "ThreadState": "Waiting", "StackTrace": [ "Methodname": "Park", "" "," "", "", " "unsafe.java", "linenumber": "classname": "sun.misc.unsafe", "nativemethod": true}, { "methodname": "park", "filename": "locksupport.java", "linenumber": 175, "classname": "java.util.concurtorn." "nativeMethod": false}, { "methodname": "bewait", "filename": "acpractqueuedsynchronizer.java", "linenumber": 2039, "classname": "java.util.concurrent.concurrent.locks.abstractqueuedsynchronizer $ conditionObizer $ conditionOzizer $ conditionOBER $" "GetTask", "Filename": "ThreadPoolexecutor.java", "LineNumber": 1067, "ClassName": "java.util.concurrent.threadpoolexecutor", "nativeMethod": false}, { "methodName": "runWorker", "FilenOnc" "ThreadPoolecutor." 1127, "className": "java.util.concurrent.threadpoolexecutor", "nativeMethod": false}, { "methodName": "run", "filename": "ThreadPoolexecutor.java", "LineNumber": 617, "ClassName": "java.util.concurrent.threadpoolexecutor $ worker", "nativeMethod": false}, { "methodName": "run", "filename": "taskthread.java", "linenumber": 61, "classname": "org.apache.tomcat.threads.taskThreadTaskThreadTHREADTHTHERDENDER", "nativeMethod": false}, { "methodname": "run", "filename": "strook.java", "linenumber": 745, "classname": "java.lang.thread", "nativeMethod": false}], "lockedmonitors": [], "lockindsynchronizers": ",", ",", "," "ClassName": "java.util.concurrent.locks.abstractqueuedsynchronizer $ conditionObject", "IdentityHashCode": 372286721}} ...]env
사용 된 환경 변수, JVM 속성, 명령 행 매개 변수, 프로젝트에서 사용하는 JAR 패키지 등을 포함하여 시스템 환경 변수의 구성 정보를 표시합니다. configprops와 달리 구성 정보는 구성 정보에 중점을두고 ENV는 운영 환경 정보에 중점을 둡니다.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/env를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
{ "profiles": [], "server.ports": { "local.management.port": 8088, "local.server.port": "servletcontextinitparams": {}, "SystemProperties": { "com.sun.management.jmxRemote.autherticate" "Java (TM) SE 런타임 환경", "spring.output.ansi.enabled": "항상", "sun.boot.library.path": "c : // program files // java // jdk1.8.0_101 // jre // bin", "java.vm.version": "25.101-13" 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. " "sun.io", "user.country": "cn", "cn", "user.script": "", "sun.java.launcher": "sun_standard", "sun.os.patch.level": "", "pid": "5268", "com.sun.management.jmxRemote.port": "60093" "Java Virtual Machine spe민감한 정보가 /env에 노출되는 것을 피하려면 비밀번호, 비밀, 키 (또는 이름의 마지막 단락)라는 모든 속성이 "*"와 함께 /env에 추가됩니다. 예를 들어, 속성 이름 Database.Password가있는 경우 /ENV의 디스플레이 효과는 다음과 같습니다.
"Database.Password": "******"
/env /{name} 사용
즉, ENV 확장자는 다음과 같은 지정된 구성 정보를 얻을 수 있습니다.
건강
HealthEndpoint가 디스크 감지 및 데이터베이스 감지를 포함한 기본 모니터링 결과를 제공한다는 것을 알 수 있습니다.
샘플 프로젝트를 시작하고 방문하십시오 : http : // localhost : 8088/monitor/health 정보의 일부, 다음 JSON 응답은 상태, 디스크 공간 및 DB로 구성됩니다. 응용 프로그램의 전반적인 건강 상태를 설명하고 UP은 응용 프로그램이 건강하다는 것을 나타냅니다. 디스크 공간은 총 디스크 공간, 나머지 디스크 공간 및 최소 임계 값을 설명합니다. Application.Properties 임계 값은 구성 가능합니다
{ "status": "up", "diskspace": { "status": "up", "total": 209715195904, "free": 183253909504, "Threshold": 10485760} "db": { "상태": "Up", "database": "mysql", "hello", "}}실제로, Spring Boot-Actuator 소스 코드를 살펴보면 HealthEndpoint에서 제공 한 정보가 이에 국한되지 않음을 알 수 있습니다. org.springframework.actuate.acealth package에서 elasticsearchHealthIndicator, Redishealthindicator, Rabbithealthindicator 등을 찾을 수 있습니다.
정보
정보는 정보로 시작하는 구성 파일에서 구성하는 구성 정보입니다. 예를 들어, 예제 프로젝트의 구성은 다음과 같습니다.
정보 : 앱 : 이름 : Spring-Boot-Actuator 버전 : 1.0.0
샘플 프로젝트를 시작하고 방문 : http : // localhost : 8088/monitor/info 정보의 반환 부분은 다음과 같습니다.
{ "app": { "name": "Spring-Boot-Actuator", "버전": "1.0.0"}}}매핑
모든 URI 경로 및 컨트롤러와의 매핑 관계 설명
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/mappings를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
{ "/**/favicon.ico": { "bean": "faviconhandlermpapp"}, "{[/hello]}": { "bean": "requestMappingHandlerMpapp", "method": "public java.lang.String com.neo.controller.helloconTroller."{/erry]}, "},"}, " "bean": "requestMappingHandlerMpapping", "method": "public org.springframework.http.responesentity <java.util.map <java.lang.string, java.lang.object >> org.springframework.boot.autoconfigure.web.basicerrorcontroller.error (javax.servlet.http.httpservletrequest) "}}메트릭
가장 중요한 모니터링 내용 중 하나는 주로 JVM 컨텐츠 사용, GC 상황, 클래스로드 정보 등 모니터링하는 것입니다.
샘플 프로젝트를 시작하고 http : // localhost : 8088/monitor/metrics를 방문하십시오. 정보의 반환 부분은 다음과 같습니다.
{ "mem": 337132, "mem.free": 183380, "Processors": 4, "instance.uptime": 254552, "Uptime": 259702, "Systemload.average": -1.0, "heap.committed": 292864, "heap.init": "Heap." 1827840, "nonheap.committed": 45248, "nonheap.init": 2496, "nonheap.used": 44269, "nonheap": 0, "strids.peak": 63, "strook": 43, "strooks" 6357, "Class.Inloaded": 0, "gc.ps_scavenge.count": 8, "gc.ps_scavenge.time": 99, "gc.ps_markseep.count": 1, "gc.ps_markseep.time": 43, "httpsessions.max": "httpsessions.": 0}./metrics 인터페이스가 제공하는 정보는 단순히 다음과 같이 분류됩니다.
| 분류 | 접두사 | 보고서 내용 |
|---|---|---|
| 쓰레기 수집가 | GC.* | 발생한 가비지 컬렉션의 수와 쓰레기 수집에 소비 된 시간은 마크 청소 쓰레기 수집기 및 병렬 쓰레기 수집기 (데이터 데이터가 Java.lang.Management. GarbageCollectorMxbean)에 적합합니다. |
| 메모리 | Mem.* | 응용 프로그램에 할당 된 메모리의 양과 자유 메모리의 양 (데이터 데이터가 Java.Lang. 런타임에서 시작) |
| 더미 | 더미.* | 현재 메모리 사용 (데이터 데이터는 java.lang.management.memoryusage에서 시작) |
| 클래스 로더 | 수업.* | JVM 클래스 로더에 의해로드 및 언로드 된 클래스 수 (데이터 데이터는 Java.Lang. Management.ClassLoadingmxBean)에서 시작되었습니다. |
| 체계 | 프로세서, 인스턴스 .uptime, 가동 시간, Systemload.verage | 프로세서 수 (Java.lang.runtime에서 시작된 데이터), 런타임 (데이터 데이터가 Java.lang.management.runtimemxBean),로드 평균 (데이터 데이터가 Java.lang.management.operatingsystemmmxbean)과 같은 시스템 정보 |
| 스레드 풀 | 실.* | JVM 스타트 업 후 스레드, 데몬 스레드 및 최고 수의 스레드 수 (데이터 데이터는 Java.Lang.Management.threadMxBean)에서 시작되었습니다. |
| 데이터 소스 | DataSource.* | 데이터 소스 연결 수 (데이터 소스의 메타 데이터, 스프링 애플리케이션 컨텍스트에 데이터 소스 Bean이 존재하는 경우에만) |
| Tomcat 세션 | httpsessions.* | Tomcat의 활성 세션 번호 및 최대 세션 번호 (데이터는 임베디드 Tomcat 서버를 사용하여 응용 프로그램을 실행할 때만 사용할 수있는 임베디드 Tomcat의 콩에서 나옵니다). |
| http | Counter.status., Gauge.Response. | 다양한 응용 프로그램 서비스에 대한 HTTP 요청에 대한 조치 및 카운터 |
설명:
일시 휴업
인터페이스를 켜고 Spring Boot 응용 프로그램을 우아하게 닫으십시오. 이 기능을 사용하려면 먼저 구성 파일에서 활성화해야합니다.
엔드 포인트 : 종료 : enabled : true
구성이 완료되면 샘플 프로젝트를 시작하고 방문 : http : // localhost : 8088/monitor/shutdown 정보의 일부는 다음과 같습니다.
{ "메시지": "종료, 작별 인사 ..."}이 시점에서 응용 프로그램이 닫혔다는 것을 알게 될 것입니다.
추적하다
/Trace 인터페이스는 요청 방법, 경로, 타임 스탬프, 요청 및 응답 헤더 정보를 포함하여 모든 웹 요청의 자세한 정보를보고하고 각 요청의 자세한 정보를 기록 할 수 있습니다.
샘플 프로젝트를 시작하고 먼저 방문하십시오 : http : // localhost : 8080/hello, 그런 다음 브라우저에서 실행하십시오 : http : // localhost : 8088/monitor/trace 반품 정보보기 :
[{ "timestamp": 1516780334777, "info": { "method": "get", "path": "/hello", "headers": { "request": { "host": "Connection": "Keep-alive", "cache-control": "Windows nt" 10.0; win64) Applewebkit/537.36 (Gecko와 같은 KHTML) Chrome/63.0.3239.84 Safari/537.36 ":"1 ","accept ": "텍스트/html, 응용 프로그램/xhtml+xml, application/xml; q = 0.9, image/webp, image/apng,*/*; q = 0.8", "accept-encoding": "gzip, deflate, br", "zh-cn, zh; q = 0.9", "쿠키": "쿠키": "UM_DISTINCTID = 16053BA344F1CD-0DC220C44CC94-B7A103E-13C680-16053BA3450751; HM_LVT_0FB30C642C5F6453F17D881F529A1141 = 1513076406,1514961720,1515649377; HM_LVT_6D8E8BB59814010152D98507A18AD229 = 1515247964,1515296008,1515672972,1516086283 "},"응답 ": {x-application-Conttext" "텍스트/html; charset = utf-8", "내용 길이": "11", "date": "Wed, 2018 년 1 월 24 일 07:52:14 GMT", "상태": "200"}}, "timetaken": "4"}}]위의 정보는 /hello 요청의 세부 사항을 보여줍니다.
다른 구성
민감한 정보에 대한 액세스 제한
위 표에 따르면 인증이 거짓 인 경우, 이는 무감각하고 마음대로 액세스 할 수 있음을 의미합니다. 그렇지 않으면 보호받을 수 있으며 마음대로 액세스 할 수 없습니다.
endpoints.mappings.sensitive = false
이를 위해서는 각각을 설정해야합니다. 민감한 방법을 사용하려면 사용자가 기본적으로 액추에이터 역할을 수행해야하므로 OFF에서 보안 제한을 설정할 수도 있습니다.
management.security.enabled = false
또는 세밀한 통제를 위해 스프링 보안과 협력하십시오.
인터페이스를 활성화하고 비활성화합니다
액추에이터의 인터페이스는 유용하지만 반드시 모든 것을 필요로하는 것은 아닙니다. 기본적으로 모든 인터페이스 ( /종료 제외)가 활성화됩니다. 예를 들어, /metrics 인터페이스를 비활성화하려면 다음과 같이 설정할 수 있습니다.
endpoints.metrics.enabled = false
하나 또는 두 개의 인터페이스 만 열려면 먼저 모든 인터페이스를 비활성화 한 다음 원하는 몇 가지를 활성화하여 더 편리합니다.
endpoints.enabled = falseendpoints.metrics.enabled = true
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.