Asosiy xususiyatlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

Bu qismda Spring Boot haqida batafsil gaplashamiz. Bu yerda siz asosiy funksiyalarni bilib olasiz, ular sizni qiziqtirishi va sozlashingiz uchun mo‘ljallangan.

SpringApplication

SpringApplication klassi Spring dasturini yuklash uchun qulay usulni taqdim etadi, bu main() metodidan boshlanadi. Ko‘p hollarda siz SpringApplication.run statik metodiga vakolatni topshirasiz, quyidagi misolda ko‘rsatilgandek:

Java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } 
Kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) } 

Dastur ishlayotganida siz quyidagi natijaga o‘xshash narsa ko‘rishingiz kerak:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.5)
2022-10-20 12:40:17.841  INFO 16284 --- [           main] o.s.b.d.f.s.MyApplication                : Starting MyApplication using Java 1.8.0_345 on myhost with PID 16284 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2022-10-20 12:40:17.849  INFO 16284 --- [           main] o.s.b.d.f.s.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2022-10-20 12:40:20.443  INFO 16284 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-10-20 12:40:20.455  INFO 16284 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-20 12:40:20.455  INFO 16284 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-20 12:40:20.716  INFO 16284 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-10-20 12:40:20.716  INFO 16284 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2566 ms
2022-10-20 12:40:22.045  INFO 16284 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-20 12:40:22.073  INFO 16284 --- [           main] o.s.b.d.f.s.MyApplication                : Started MyApplication in 4.937 seconds (JVM running for 6.049)

Standart bo‘yicha INFO darajasidagi log xabarlar ko‘rsatiladi, ular ishga tushirish jarayoni haqida muhim ma‘lumotlarni, masalan, dastur kim tomonidan ishga tushirilganligini, ko‘rsatadi. Agar sizga ishlov berishning boshqa darajasi kerak bo'lsa, "Loglarni boshqarish darajalari" bo'limida aytilgandek sozlashingiz mumkin. Dastur versiyasi asosiy sinf paketi versiyasi orqali aniqlanadi. Ishga tushirish haqidagi ma‘lumotlarni logdan o‘chirish spring.main.log-startup-info ni false ga o‘rnatib bajariladi. Bu, shuningdek, faol profil loglarini ham o‘chiradi.

Agar ishga tushirishda qo‘shimcha loglarni qo'shmoqchi bo‘lsangiz, siz SpringApplication sinfning logStartupInfo(boolean) metodini qayta yoza olasiz.

Ishga tushirishdagi xatoliklar

Agar sizning dasturni ishga tushirib bo‘lmasa, ro‘yxatdan o‘tgan FailureAnalyzers maxsus xato xabarini taqdim etadi va muammoni hal qilish uchun ma‘lum bir harakatni amalga oshiradi. Masalan, agar veb-dastur 8080 portidan ishga tushirilsa, lekin bu port allaqachon band bo‘lsa, quyidagi kabi xabar ko‘ringan bo‘lsa kerak:

***************************
APPLICATION FAILED TO START
***************************
Description:
Embedded servlet container failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that is listening on port 8080 or configure this application to listen on another port.
Spring Boot bir qancha FailureAnalyzer realizatsiyalarini taqdim etadi, lekin siz o‘zingiznikini qo‘shishingiz mumkin.

Agar hech qanday tahlilchi istisnolarni hal qila olmasa, nima noto‘g‘ri ketganini yaxshiroq tushunish uchun shartlar haqida to'liq hisobot chiqarish mumkin. Buning uchun debug xususiyatni yoqish yoki org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener uchun debug darajasidagi logni yoqish kerak.

Masalan, agar dastur java -jar yordamida ishga tushiriliyotgan bo‘lsa, xususiyat debugni quyidagicha yoqishingiz mumkin:

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

So'nggi vaqtda ishga tushirish

SpringApplication dasturda so'nggi vaqtda ishga tushirishni amalga oshirishga imkon beradi. Agar so'nggi ishga tushirish faol bo'lsa, binalar faqat kerak bo'lganda yaratiladi, dastur ishga tushirilayotganda emas. Natijada, so'nggi ishga tushirishni yoqish dastur ishga tushirish vaqtini qisqartirishi mumkin. Veb-dasturda so'nggi ishga tushirishni yoqish ko'p veb-dasturga tegishli binlar HTTP so'rovi olinguncha ishga tushirilmasligini anglatadi.

So'nggi ishga tushirishning kamchiligi shundaki, u dasturdagi xatoni kechikish bilan aniqlanishiga olib kelishi mumkin. Agar noto‘g‘ri sozlangan bin so'nggi vaqtda ishga tushirilsa, xato endi ishga tushirish vaqtida sodir bo‘lmaydi, muammoni bin ishga tushgandan keyin aniqlash mumkin bo‘ladi. Shuningdek, JVM barcha dastur binlarini joylashtirish uchun etarli xotiraga ega ekanligiga ishonch hosil qilish kerak, faqat ishga tushirilganlarini emas. Shu sababli, so'nggi ishga tushirish standart bo‘yicha faol emas va so‘nggi ishga tushirishni yoqishdan oldin JVM kupa hajmini aniq sozlash tavsiya etiladi.

So‘nggi ishga tushirishni dasturiy ravishda SpringApplicationBuilderdagi lazyInitialization metodidan yoki SpringApplicationdagi setLazyInitialization metodidan foydalanib, yoqish mumkin. Bundan tashqari, bu spring.main.lazy-initialization xususiyatidan foydalanib, quyidagi misolda ko'rsatilgandek yoqilishi mumkin:

Properties
spring.main.lazy-initialization=true
Yaml
spring:
  main:
    lazy-initialization: true
Agar dasturning boshqa qismlari uchun so‘nggi ishga tushirishdan foydalangan holda, ayrim binlar uchun so‘nggi ishga tushirishni o‘chirish kerak bo‘lsa, ularga @Lazy(false) annotatsiyasi yordamida aniq "lazy" atributini false qilib belgilash mumkin.

Bannerni sozlash

Ishga tushirishdagi banner faqat classpath ga banner.txt fayl qo'shib yoki spring.banner.location xususiyatini bu fayl joylashuviga o‘rnatish orqali o‘zgartirilishi mumkin. Agar fayl UTF-8 dan boshqa kodlashga ega bo‘lsa, spring.banner.charset xususiyatini o‘rnatish mumkin. Text faylidan tashqari, banner.gif, banner.jpg yoki banner.png rasm faylini classpathga qo'shish yoki spring.banner.image.location xususiyatini o‘rnatish orqali ham ko‘rish mumkin. Rasm ASCII grafik ko‘rinishga aylantiriladi va har qanday tekst banner yuqoriga joylashtiriladi.

banner.txt faylida Environmentda mavjud bo‘lgan har qanday kalitdan foydalanish mumkin, shuningdek quyidagi o‘rinbosarlar:

Jadval 1. Banner o'zgaruvchilari
O‘zgaruvchi Tarif

${application.version}

Sizning dasturning MANIFEST.MFda deklaratsiya qilingan versiyasi. Misol uchun, Implementation-Version: 1.0 1.0 sifatida chiqariladi.

${application.formatted-version}

Sizning dasturning MANIFEST.MFda deklaratsiya qilingan va ekranga chiqarish uchun formatlangan versiyasi (qavsga o‘ralgan va v prefiksi bilan boshlanadi). Masalan, (v1.0).

${spring-boot.version}

Siz foydalanayotgan Spring Boot versiyasi. Masalan, 2.7.5.

${spring-boot.formatted-version}

Siz foydalanayotgan Spring Boot versiyasi, ekranga chiqarish uchun formatlangan (qavsga o‘ralgan va v prefiksi bilan boshlanadi). Masalan, (v2.7.5).

${Ansi.NAME} (yoki ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME})

Bu yerda NAME - ANSI kodlash nomi. Ma‘lumot uchun AnsiPropertySourcega qarang.

${application.title}

Sizning dasturning MANIFEST.MFda e‘lon qilingan nomi. Misol uchun, Implementation-Title: MyApp MyApp sifatida chiqariladi.

SpringApplication.setBanner(…​) metodini foydalanib, dasturni banner yaratish mumkin. org.springframework.boot.Banner interfeysidan foydalaning va o‘zingizning printBanner() metodini amalga oshiring.

Shuningdek, banner System.out(console) ga chiqarilishi kerakmi, log xabarnomasiga (log) yuborilishi kerakmi yoki umuman chiqarilmasligi kerakmi (off) havolasini boshqarish uchun spring.main.banner-mode xususiyatidan foydalanishingiz mumkin.

Chiqayotgan banner quyidagi nom bilan yagona bino sifatida ro`yxatdan o`tadi: springBootBanner.

${application.version} va ${application.formatted-version} xususiyatlari Spring Boot ishga tushirish vositalarini foydalanganda mavjud. Agar jar fayli chiqarilgan bo‘lsa va u java -cp <classpath> <mainclass> orqali ishga tushirilsa, qiymatlar aniqlanmaydi.

Shuningdek, biz har doim chiqarilgan jar fayllarni java org.springframework.boot.loader.JarLauncher orqali ishga tushirishni tavsiya qilamiz. Bu application.* banner o‘zgaruvchilarini ilova yaratilishidan oldin va classpath yaratilishidan oldin ishga tushiradi.

SpringApplication sozlash

Agar standart SpringApplication sozlamalari sizning xohishingizga to‘g‘ri kelmasa, lokal nusxa yaratishingiz va uni sozlashingiz mumkin. Masalan, bannerni o‘chirib qo‘yish uchun quyidagicha yozing:

Java
import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.setBannerMode(Banner.Mode.OFF); application.run(args); } } 
Kotlin
import org.springframework.boot.Banner import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) { setBannerMode(Banner.Mode.OFF) } } 
SpringApplication ga uzatilgan konstruktor argumentlari Spring binalari uchun konfiguratsiya manbalari hisoblanadi. Ko‘p hollarda bu @Configuration annotatsiya bilan belgilangan klasslarga havolalardir, lekin ular @Component annotatsiyaga ega bo‘lgan klasslarga bevosita havolalar ham bo‘lishi mumkin.

Shuningdek, SpringApplicationni application.properties fayli yordamida sozlashingiz mumkin.

Fluid API Builder

Agar siz ApplicationContext iyerarxiyasini (bir nechta kontekstlarni ota-ona/bola munosabatlari bilan) yaratishingiz kerak bo'lsa yoki "fluid" API builderdan foydalanishni afzal ko'rsangiz, SpringApplicationBuilderga murojaat qilishingiz mumkin.

SpringApplicationBuilder bir nechta metod chaqiruvlarini zanjirlash imkonini beradi va ota-ona va bola iyerarxiyasini yaratish imkonini beruvchi parent va child metodlarini o‘z ichiga oladi, quyidagi misolda ko‘rsatilgan:

Java
new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);
Kotlin
SpringApplicationBuilder()
    .sources(Parent::class.java)
    .child(Application::class.java)
    .bannerMode(Banner.Mode.OFF)
    .run(*args)
ApplicationContext iyerarxiyasini yaratishda ba‘zi cheklovlar mavjud. Masalan, veb-komponentlar majburiy bola kontekstida bo‘lishi kerak, va bir xil Environment ota va bola kontekstlari uchun bir xil ishlatiladi.

Ilovalarning mavjudligi

Platformalarda joylashdirilganida, ilovalar Kubernetes protsesslarining yordamida dasturiy mavjudlik holatini platformaga yuborishi mumkin. Spring Boot keng tarqalgan mavjudlik holatlari "liveness" (haqiqiylik) va "readiness" (tayyorlik)ni qo‘llab-quvvatlaydi. Agar siz Spring Bootning "akturator" vositalaridan foydalansangiz, ushbu holatlar ilova holati endpoints guruhlari sifatida namoyish etiladi.

Bundan tashqari, tayyorlik holati ma'lumotlarini o‘z binlaringizga ApplicationAvailability interfeysini qo‘shish orqali olish mumkin.

Liveness holati

Dastur xizmat qilayotganini anglatadi va u haqiqiy ishlash yoki o‘zini tuzatishi mumkin bo'lmagan holatda emasligini bildiradi. "Liveness" holati buzilganida, dasturni qayta ishga tushirish kerak bo‘lgan holatda.

Umuman olganda, "Liveness" holati tashqi tekshiruvlarga asoslanmasligi kerak, masalan, ilova holatidagi tekshirishlar. Bu holatda tashqi tizimning (ma’lumotlar bazasi, veb API, tashqi cache) ishdan chiqishi butun platformada domino effekti yaratadi va ommaviy qayta yuklashlar va boshqa muammolarni keltirib chiqaradi.

Spring Boot ilovalarining ichki holati asosan Spring uchun ApplicationContext orqali ifodalanadi. Agar ilova konteksti muvaffaqiyatli ishga tushirilgan bo‘lsa, Spring Boot ilovani haqiqiy holatda deb hisoblaydi. Ilovada foydalanish uchun kontest tugatilgan paytdan boshlab haqiqiy deb hisoblanadi.

Readiness holati

Dastur tayyorlik holati, dasturni trafikni qayta ishlashga tayyorligini bildiradi. Readiness buzilgan holat, platformaga dasturni endi trafik yo‘naltirmaslik kerakligini aytadi. Bu ko‘pincha ishga tushirish paytida, CommandLineRunner va ApplicationRunner komponentlari jarayonida yoki dastur juda band yoki boshqa biror sabab bilan qo‘shimcha trafikka tayyor emasligida sodir bo'ladi.

Dastur tayyor deb qabul qilinadi, ilova va buyrug‘lar kiritilganidan so‘ng.

Ishga tushirish paytida bajarilishi kutilgan vazifalar CommandLineRunner va ApplicationRunner komponentlari orqali bajarilishi kerak, Spring komponenti lifecycle callbacks kabi @PostConstruct dan foydalanish o‘rniga.

Ilovaning mavjudlik holatini boshqarish

Ilova komponentlari har qanday vaqtda mavjudlik holatini olish yoki ilova holatini yangilash mumkin, ApplicationAvailability interfeysini kiritish orqali. Ko‘pincha, ilovalar davlat yangilanishiga tinglanishi yoki ilovaning davlatini yangilashi kerak.

Masalan, Kubernetes'ning exec testini ma‘lum bir faylni "moslash" qilib, tayyorgarlik davlatini eksport qilish mumkin:

Java
import org.springframework.boot.availability.AvailabilityChangeEvent; import org.springframework.boot.availability.ReadinessState; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class MyReadinessStateExporter { @EventListener public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) { switch (event.getState()) { case ACCEPTING_TRAFFIC: // /tmp/healthy faylni yaratish break; case REFUSING_TRAFFIC: // /tmp/healthy faylni o'chirish break; } } } 
Kotlin
import org.springframework.boot.availability.AvailabilityChangeEvent import org.springframework.boot.availability.ReadinessState import org.springframework.context.event.EventListener import org.springframework.stereotype.Component @Component class MyReadinessStateExporter { @EventListener fun onStateChange(event: AvailabilityChangeEvent<ReadinessState?>) { when (event.state) { ReadinessState.ACCEPTING_TRAFFIC -> { // /tmp/healthy faylni yaratish } ReadinessState.REFUSING_TRAFFIC -> { // /tmp/healthy faylni o'chirish } else -> { // ... } } } } 

Shuningdek, dasturni normal holatga qaytarib bo'lmasa, dastur holatini yangilashimiz mumkin:

Java
import org.springframework.boot.availability.AvailabilityChangeEvent; import org.springframework.boot.availability.LivenessState; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; @Component public class MyLocalCacheVerifier { private final ApplicationEventPublisher eventPublisher; public MyLocalCacheVerifier(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void checkLocalCache() { try { // ... } catch (CacheCompletelyBrokenException ex) { AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN); } } } 
Kotlin
import org.springframework.boot.availability.AvailabilityChangeEvent import org.springframework.boot.availability.LivenessState import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Component @Component class MyLocalCacheVerifier(private val eventPublisher: ApplicationEventPublisher) { fun checkLocalCache() { try { // ... } catch (ex: CacheCompletelyBrokenException) { AvailabilityChangeEvent.publish(eventPublisher, ex, LivenessState.BROKEN) } } } 

Spring Boot ilovaning liveness va readiness holatlarini tekshirish uchun Kubernetes HTTP testlarini taqdim etadi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION