Spring Boot hizmeti izleme, durum denetimi, iş parçacığı bilgileri, JVM yığın bilgileri

Geçtiğimiz yıl projemiz mikro hizmet 1.0'ın mimari dönüşümünü yaptı ancak hizmet izleme alanı yetişmedi. Hayır, yakın zamanda tüm temel mikro hizmet uygulamalarımızı izleme görevi üstlendim. Mikro hizmet uygulamalarımızın tamamı SpringBoot uygulamalarıdır, bu nedenle Aktüatör modülünü Spring Boot ile düşünmek doğaldır.

Bu makale, bu iş emrini tamamladıktan sonra Spring Boot Actuator modülünün öğrenilmesi ve uygulanmasının bir özetidir. Bu yazıda şunları öğrenebilirsiniz:

1, Spring Boot Actuator'a hızlı başlangıç 2, Spring Boot Actuator'ın bazı önemli uç noktalarına giriş 3. Aktüatör modülü aracılığıyla gerçek zamanlı olarak mevcut uygulamanın iş parçacığı dökümü bilgileri nasıl görüntülenir 4. Aktüatör modülü aracılığıyla gerçek zamanlı olarak mevcut uygulamanın yığın bilgileri nasıl görüntülenir 5. Mevcut uygulamanın günlük yazdırma seviyesi Aktüatör modülü aracılığıyla gerçek zamanlı olarak nasıl değiştirilir 6. ...

Daha sonra tanıtacağım:

TODO: İzleme alarmına ulaşmak için SpringBoot mikro hizmet uygulama entegrasyonu Prometheus + Grafana

1. Spring Boot Aktüatörü Nedir

Spring Boot Actuator modülü, Spring Boot uygulamalarını, fasulye yüklemesini, ortam değişkenlerini, günlük bilgilerini, iş parçacığı bilgilerini, JVM yığın bilgilerini vb. İzlememize ve yönetmemize yardımcı olmak için sağlık kontrolleri, denetim, gösterge toplama, HTTP izleme vb. Gibi üretim düzeyinde işlevler sağlar. . Bu modül, uygulamanın dahili bilgilerini toplayan ve dışarıya açıklayan bir modüldür.Yukarıdaki tüm işlevlere HTTP ve JMX üzerinden erişilebilir.

Dahili bilgileri açığa çıkarma özellikleri nedeniyle, Aktüatör ayrıca bazı harici uygulama izleme sistemleriyle (Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic, vb.) Entegre edilebilir. Bu izleme sistemleri, uygulamalarınızı birleşik ve kullanıcı dostu bir arayüz aracılığıyla izlemenize ve yönetmenize yardımcı olabilecek mükemmel panolar, grafikler, analizler ve uyarılar sağlar.

Aktüatör, bu harici uygulama izleme sistemleriyle entegre olmak için Mikrometre kullanır. Bu şekilde, harici bir izleme sistemi çok küçük bir konfigürasyonla kolayca entegre edilebilir.

Mikrometre, Java platformunda performans verilerinin toplanması için genel bir API sağlar Uygulamaların, performans göstergelerini toplamak için yalnızca Micrometer'in genel API'sini kullanması gerekir. Mikrometre, farklı izleme sistemleri ile adaptasyon çalışmasının tamamlanmasından sorumlu olacaktır. Bu, izleme sistemini değiştirmeyi kolaylaştırır.

Slf4j'nin Java Logger'daki konumunu karşılaştırın.

2. Hızlı başlangıç, Spring Boot Actuator Demosu oluşturun

Önce bir demo uygulaması oluşturuyoruz.

Spring Boot CLI ile oluşturabilirsiniz:

spring init -d = web, aktüatör -n = aktüatör-demo aktüatör-demo

Veya Spring Initializr ile oluşturun:

Karşılık gelen maven bağımlılığı:

< bağımlılıklar > ... < bağımlılık > < Grup kimliği > org.springframework.boot < /Grup kimliği > < artifactId > Spring-boot-starter-aktüatör < / artifactId > < /bağımlılık > ... < / bağımlılıklar >

Karşılık gelen Gradle bağımlılığı:

bağımlılıklar {compile ("org.springframework.boot: spring-boot-starter-actuator")}

Üç, Uç noktalar tanıtımı

Spring Boot, uygulamalara erişmek ve onlarla etkileşim kurmak için dışarıya sözde uç noktalar (bundan sonra uç noktalar olarak tercüme edilecektir) sağlar.

Örneğin, / health uç noktası, uygulamanın sağlığı hakkında bazı temel bilgiler sağlar. Ölçüm uç noktası, bazı yararlı uygulama ölçümleri sağlar (JVM bellek kullanımı, sistem CPU kullanımı, vb.).

Bu Aktüatör modüllerinin orijinal uç noktalarını yerel uç noktalar olarak adlandırıyoruz. Uç noktaların rolüne göre, kabaca üç kategoriye ayrılabiliriz:

Uygulama yapılandırma sınıfı: Uygulama yapılandırmasını, ortam değişkenlerini, uygulamaya yüklenen otomatikleştirilmiş yapılandırma raporlarını ve Spring Boot uygulamalarıyla yakından ilgili diğer yapılandırma bilgilerini alın.

Metrik kategorisi: Bellek bilgileri, iş parçacığı havuzu bilgileri, HTTP istek istatistikleri vb. Gibi uygulamanın çalışması sırasında izleme için ölçümler elde edin.

Operasyon kontrol sınıfı: Uygulamayı kapatmak gibi işlem fonksiyonları sağlar.

Yerel uç noktaların ayrıntılı tanıtımı için lütfen resmi web sitesine bakın ve bunları burada tekrar etmeyeceğim.

Dikkat edilmesi gereken şey:

1, Her uç nokta, yapılandırma yoluyla ayrı ayrı devre dışı bırakılabilir veya etkinleştirilebilir

2, Aktüatör 1.x'ten farklı, Actuator 2.x'in çoğu uç noktası varsayılan olarak yasaklanmıştır . Actuator 2.x'teki varsayılan son nokta, / actuator önekini ekler. Varsayılan olarak ortaya çıkan iki uç nokta / actuator / health ve / actuator / info'dur.

Dört, uç nokta maruziyet yapılandırması

JMX ve HTTP aracılığıyla açığa çıkan uç noktaları aşağıdaki yapılandırma ile yapılandırabiliriz.

PropertyDefaultmanagement.endpoints.jmx.exposure.exclude

management.endpoints.jmx.exposure.include * management.endpoints.web.exposure.exclude

management.endpoints.web.exposure.includeinfo, sağlık

Tüm izleme noktalarını açabilir

management.endpoints.web.exposure.include = *

Ayrıca parçayı açmayı da seçebilirsiniz, "*" tüm uç noktaları açığa çıkarmak anlamına gelir, birden fazla uç nokta belirtirseniz, bunları "," ile ayırın

management.endpoints.web.exposure.exclude = fasulye, izleme

Aktüatör varsayılan olarak / actuator / * içindeki tüm izleme noktası yollarına ayarlanır. Tabii ki, bu yol gerekirse de özelleştirilebilir.

management.endpoints.web.base-path = / minitor

Ayarladıktan ve yeniden başlattıktan sonra, erişim adresi tekrar / minitor / * olacaktır.

Şimdi aşağıdaki gibi yapılandırıyoruz:

# "*", tüm uç noktaları açığa çıkarmak anlamına gelir. Birden fazla uç nokta belirtilmişse, "," kullanarak management.endpoints.web.exposure.include = * # Atama kuralları, management.endpoints.web.exposure.exclude = ile aynıdır

DEMO programını başlatın ve maruz kalan uç noktaları görüntülemek için http: // localhost: 8080 / actuator adresini ziyaret edin:

Yukarıdaki görüntü, JSON-tutamaç eklentisinin Chrome tarayıcısına yüklenmiş olmasıdır, bu da aslında büyük bir json bölümü döndürür.

Aşağıda, birkaç önemli uç noktaya odaklanacağım.

Beş, önemli uç nokta analizi

5.1 / sağlık uç noktası

/ Health uç noktası, programın sağlığını kontrol etmek için programınızın sağlık göstergelerini toplar. Uç nokta tarafından açıklanan uygulama sağlık bilgileri şunlara bağlıdır:

management.endpoint.health.show-details = her zaman

Bu öznitelik aşağıdaki değerlerden biriyle yapılandırılabilir:

NameDescription hiçbir zaman ayrıntılı bilgileri, yukarı veya aşağı durumu göstermez, yetkilendirildiğinde varsayılan yapılandırma ayrıntılı bilgiler kimliği doğrulanmış kullanıcılara görüntülenir. Yetkili roller, management.endpoint.health.roles yapılandırması aracılığıyla her zaman ayrıntılı bilgileri tüm kullanıcılara sunabilir

Yukarıdaki konfigürasyona göre, her zaman için yapılandırdıktan sonra projeyi başlatıyoruz ve http: // localhost: 8080 / actuator / health port adresini ziyaret ediyoruz, şu bilgileri görebilirsiniz:

Sağlıkla ilgili çok az bilgi varmış gibi geliyor mu? Endişelenmeyin, çünkü yarattığımız şey en temel Demo projesi ve birçok bileşene dayanmıyor.

/ Health uç noktası, otomatik olarak yapılandırılmış birçok sağlık göstergesine sahiptir: redis, rabbitmq ve db gibi bileşenler. Projeniz ilgili bileşenlere bağlı olduğunda, bu sağlık göstergeleri otomatik olarak bir araya getirilecek ve ardından ilgili bilgiler toplanacaktır. Örneğin, yukarıdaki diskSpace düğüm bilgisi, DiskSpaceHealthIndicator'ın çalışıyor olmasıdır.

Yukarıdaki ekran görüntüsü resmi belgeden alınmıştır.

Bu, benim başka bir projem için / health son nokta bilgisidir.

Yukarıdaki bileşenin bir durum istisnası olduğunda, uygulama hizmetinin genel durumu kapalıdır. Yapılandırma yoluyla bir bileşenin sağlık izlemesini de devre dışı bırakabiliriz.

management.health.mongo.enabled: yanlış

Veya otomatik olarak yapılandırılan tüm sağlık göstergelerini devre dışı bırakın:

management.health.defaults.enabled: falseÖzel Sağlık Göstergesi

Elbette, bir Sağlık Göstergesini de özelleştirebilirsiniz, yalnızca HealthIndicator arabirimini uygulamanız veya AbstractHealthIndicator sınıfını genişletmeniz gerekir.

/ ** * @author Richard_yyf * @version 1.02020/1/16 * / @ Componentpublic sınıfı CustomHealthIndicator, AbstractHealthIndicator'ı genişletir {@Override korumalı void doHealthCheck (Health.Builder oluşturucu), İstisna atar {// Sağlık durumu bilgileri oluşturmak için oluşturucuyu kullanın // Bir istisna atarsanız, durum AŞAĞI olarak ayarlanır ve istisna bilgileri kaydedilir builder.up () .withDetail ("uygulama", "Bu proje sağlıklı") .withDetail ("hata", "Hiçbir şey , Çok iyiyim"); }}

son etki:

5.2 / metrics uç noktası

/ Metrics uç noktası, bellek bilgileri, iş parçacığı bilgileri, çöp toplama bilgileri, tomcat, veritabanı bağlantı havuzu vb. Gibi mevcut uygulamanın çeşitli önemli ölçümlerini döndürmek için kullanılır.

{"adlar": }

1.x'ten farklı olarak, Aktüatör bu arayüzde belirli gösterge bilgilerini görmez, yalnızca göstergelerin bir listesini görüntüler. Bir indikatör hakkında detaylı bilgi almak için aşağıdaki gibi spesifik indikatör bilgileri talep edebiliriz:

http: // localhost: 8080 / actuator / metrics / {MetricName}

Örneğin, /actuator/metrics/jvm.memory.max adresini ziyaret ettiğimde, döndürülen bilgiler aşağıdaki gibidir:

Tek bir alanı görüntülemek için sorgu parametresini de kullanabilirsiniz. Örneğin, /actuator/metrics/jvm.memory.max?tag=id:Metaspace adresini ziyaret edebilirsiniz. Sonuç:

5.3 / loggers uç noktası

/ Loggers uç noktası, programımız içinde yapılandırılan tüm kaydediciler hakkındaki bilgileri ortaya çıkarır. Bunu görmek için / actuator / loggers adresini ziyaret edebiliriz

Tek bir kaydediciye aşağıdaki şekillerde de erişebilirsiniz,

http: // localhost: 8080 / actuator / loggers / {name}

Örneğin, şimdi root logger'ı ziyaret ediyorum, http: // localhost: 8080 / actuator / loggers / root

{"configureLevel": "INFO", "effectiveLevel": "INFO"} Çalışma zamanında günlük seviyesini / günlükçülerin uç noktasını değiştirin. En çok bahsetmek istediğim şey, günlük seviyenizi dinamik olarak değiştirebilen bu özelliktir.

Örneğin, root logger'ın günlük seviyesini aşağıdaki şekillerde değiştirebiliriz. Yalnızca http: // localhost: 8080 / actuator / loggers / root URL'si ile bir POST isteği başlatmamız gerekir, POST mesajı aşağıdaki gibidir:

{"configurationLevel": "HATA AYIKLA"}

Dikkatlice düşünün, bu özellik çok faydalı mı? Bir üretim ortamında, uygulamanızın bazı anormal durumları tanılayabilmeniz için bazı Hata Ayıklama bilgileri vermesini istiyorsanız, uygulamayı yeniden başlatmadan yalnızca yukarıda açıklandığı gibi değiştirebilirsiniz.

Varsayılan değere sıfırlamak istiyorsanız, değeri null olarak değiştirin

5.4 / bilgi uç noktası

/ İnfo uç noktası, programınız hakkında bilgi görüntülemek için kullanılabilir. Bazı programların temel bilgileri olduğunu anlıyorum. Yapılandırma dosyası application.properties dosyasındaki yapılandırmayı ihtiyaçlarınıza göre özelleştirebilirsiniz (varsayılan olarak, uç nokta yalnızca boş bir json içeriği döndürür.):

info.app.name = actuator-test-demoinfo.app.encoding = UTF-8info.app.java.source = 1.8info.app.java.target = 1.8 # Bir maven projesinde, aşağıdaki şekillerde maven özelliklerine doğrudan başvurabilirsiniz # İnfo.app.encoding = @ project.build.sourceEncoding @ # info.app.java.source = @ java.version @ # info.app.java.target = @ java.version @ değeri

Projeye başlamak için http: // localhost: 8080 / actuator / info: adresini ziyaret edin:

{"uygulama": {"kodlama": "UTF-8", "java": {"kaynak": "1.8.0_131", "hedef": "1.8.0_131"}, "ad": "aktüatör testi -demo "}}

5.5 / fasulye uç noktası

/ Fasulye uç noktası, Bahar kapsayıcısındaki tüm çekirdeklerin takma adlarını, türlerini, tek tonlarını ve bağımlılıklarını döndürür.

Http: // localhost: 8080 / actuator /bean adresini ziyaret edin, iade aşağıdaki gibidir:

5.6 / heapdump uç noktası

Ziyaret: http: // localhost: 8080 / actuator / heapdump otomatik olarak bir Jvm yığın dosyası yığın dökümü oluşturacaktır. Bellek anlık görüntüsünü görüntülemek üzere bu dosyayı açmak için JDK ile birlikte gelen Jvm izleme aracı VisualVM'yi kullanabiliriz.

5.7 / threaddump uç noktası

Kişisel olarak bu uç noktanın özellikle yararlı olduğunu düşünüyorum, böylece sorunu günlük olarak bulduğumuzda iş parçacığı durumunu kontrol edebiliriz. Temelde iş parçacığı adını, iş parçacığı kimliğini, iş parçacığı durumunu, kilit kaynakları, iş parçacığı yığını ve diğer bilgileri bekleyip beklemeyeceğini görüntüler. Görüntülemesi sezgisel olmayabilir. Http: // localhost: 8080 / actuator / threaddump ziyaret edildiğinde aşağıdakiler döndürülür:

5.8 / kapatma bitiş noktası

Bu uç nokta, işlem denetimi uç noktasına aittir ve Spring Boot uygulamasını zarif bir şekilde kapatabilir. Bu özelliği kullanmak için önce yapılandırma dosyasında etkinleştirmeniz gerekir:

management.endpoint.shutdown.enabled = true

Nedeniyle Kapatma arayüzü, varsayılan olarak yalnızca POST isteklerini destekler Demo projesini başlatıyoruz ve http: // localhost: 8080 / actuator / shutdown için bir POST isteği başlatıyoruz. dönen mesajlar:

{"message": "Kapatılıyor, güle güle ..."}

Ardından uygulama kapatılır.

Uygulamanın kendisi açılıp kapanma işlemi bir çok tehlikeli Dolayısıyla, onu gerçekten çevrimiçi kullandığımızda, ona aşağıdakiler gibi belirli bir koruma mekanizması eklememiz gerekir: Aktüatörün uç nokta yolunu özelleştirin ve güvenlik doğrulaması için Spring Security'yi entegre edin Bekle. (Gerekli değilse, bu uç noktanın açılmasına gerek yoktur)

Altı, uç noktalarda güvenlik doğrulaması gerçekleştirmek için Spring Security'yi entegre edin

Uç nokta bilgileri ve ortaya çıkan etkileşim çok hassas olduğundan, yetkisiz dış erişimin önlenmesi gerekir. Uygulamanızda varsa Bahar Güvenliği Bağımlılık, varsayılan olarak kullan Form tabanlı HTTP kimlik doğrulaması Uç noktayı korumak için.

Değilse, ilgili bağımlılığı eklemeniz yeterlidir:

< bağımlılık > < Grup kimliği > org.springframework.boot < /Grup kimliği > < artifactId > Spring-boot-starter-güvenlik < / artifactId > < /bağımlılık >

Ekledikten sonra, Spring Security'nin varsayılan yapılandırmasını geçersiz kılmak için güvenlik doğrulama kuralları tanımlamamız gerekiyor.

Burada şablon yapılandırmasının iki versiyonunu veriyorum:

import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; import org.springframework.boot.actuate.context.ShutdownEndpoint; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework. context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; / ** * @author @author @yyyf * / Configurationpublic sınıfı ActuatorSecurityConfig, WebSecurityConfigurerAdapter {/ * * version1: * 1. '/ shutdown' uç noktasına erişimi kısıtlayın ve yalnızca ACTUATOR_ADMIN erişimine izin verin * 2. Diğer uç noktalara harici erişime izin verin * 3. Statik kaynaklara harici erişime izin verin * 4. Harici erişime izin verin '/' * 5. Diğer erişimin doğrulanması gerekiyor * sürüm2: * 1. Tüm uç noktalara erişimi kısıtlayın, yalnızca ACTUATOR_ADMIN erişimine izin verin * 2. Statik kaynaklara harici erişime izin verin * 3. Harici erişime izin verin '/' * 4. Diğer Erişimin doğrulanması gerekir * / @Override korumalı void configure (HttpSecurity http) Exception {// version1 // http // .authorizeRequests () // .requestMatchers (EndpointRequest.to (ShutdownEndpoint.class)) // .hasRole atar ("AC TUATOR_ADMIN ") // .requestMatchers (EndpointRequest.toAnyEndpoint ()) // .permitAll () // .requestMatchers (PathRequest.toStaticResources (). AtCommonLocations ()) // .permitAll () // .antMatchers (" / ") // .permitAll () // .antMatchers ("/ **") // .authenticated () // .and () // .httpBasic (); // version2 http .authorizeRequests () .requestMatchers (EndpointRequest.toAnyEndpoint ()) .hasRole ("ACTUATOR_ADMIN") .requestMatchers (PathRequest.toStaticResources (). atCommonLocations ()) .permitAll () .antMatchers ("/") .permitAll () .antMatchers ("/ **") .authenticated ( ). ve () .httpBasic ();}}

Application.properties dosyasının ilgili yapılandırması aşağıdaki gibidir:

# Spring Güvenliği Varsayılan kullanıcı adı ve passwordspring.security.user.name = actuatorspring.security.user.password = actuatorspring.security.user.roles = ACTUATOR_ADMIN
Salgın altında! Yerli internet şirketlerinin çalışma saatlerinin özeti
önceki
Çin'in önde gelen İnternet şirketlerinin teknik organizasyonundaki ayarlamalar neyi gösteriyor?
Sonraki
Resimler ve metinler, aptalların anlayabileceği JVM bellek düzeni
ThreadLocal Röportaj Liulian sordu, tutabilir misin?
Zamanlanmış görev planı ansiklopedisi
Bilinmeyen dağıtılmış kilit uygulamalarının hepsi burada
Derinlemesine yirmi bin kelime, dağıtılmış sistemlerin ilkelerini tanıtır
JVM röportajı 4 çekim, buna dayanabilir misin?
Saniyede milyonlarca eşzamanlılık elde etmek için "IO çoğullama" kullanma prensibini biliyor musunuz?
SpringBoot + RabbitMQ, mesajın% 100'ünün başarıyla teslim edilmesini ve tüketilmesini sağlamak için
Sadece okulun iyi seçilmesi değil, aynı zamanda bu popüler ana dalların da dikkatlice referans alınması gerekir.
Tayland'da Eğitim | Tayland'da eğitim hakkında bilmediğiniz şeyler
çok farklı! Taylandlı uğurlu sayılar yaptınız mı?
Neden çocukları Tayland'da okumaya göndermelisiniz? Bu anları okuduktan sonra anlıyorum
To Top