Kaixo! Spring Boot-en "funtzionatzen du besterik gabe" (just works) filosofia maite dugu. Konfigurazio minimoarekin, web zerbitzari bat martxan jar dezakegu minutu gutxitan. Baina erosotasun honek, kontuz ibili ezean, aplikazio astun eta motelak sortzera eraman gaitzake. "Auto-konfigurazioa" ez da beti "auto-optimizazioa".
Gaur, zure Spring Boot aplikazioa "argaltzeko" bost aholku zehatz partekatuko ditut, azkarrago abiarazi dadin, tamaina txikiagoa izan dezan eta produkzioan eraginkorragoa izan dadin.
1. Aholkua: Izan minimalista zure mendekotasunekin
Arazoa: spring-boot-starter-web bezalako "starter" batek mendekotasun asko ekartzen ditu automatikoki: Tomcat zerbitzaria, Jackson (JSON liburutegia), eta abar. Baina, zer gertatzen da zuk Undertow erabili nahi baduzu Tomcat-en ordez? Edo Gson Jackson-en ordez? Beharrezkoak ez diren liburutegiak gehitzeak zure aplikazioa gizentzen du.
Irtenbidea:
- Aztertu zure mendekotasunak: Exekutatu mvn dependency:tree edo gradle dependencies zure proiektuak zein liburutegi guztiak ekartzen dituen ikusteko. Harrituko zara zenbat gauza dauden hor!
- Baztertu behar ez duzuna: Erabili <exclusions> etiketa Maven-en edo exclude hitz gakoa Gradle-n behar ez dituzun mendekotasun iragankorrak (transitive dependencies) kentzeko.
Adibidea (Gradle): Undertow erabiltzeko eta Tomcat baztertzeko.
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-undertow'
}
Onura: .jar fitxategi txikiagoa, memoria-aztarna murriztua eta segurtasun-ahultasunentzako azalera txikiagoa.
2. Aholkua: Atzeratu bean-en sorrera Lazy Initialization-ekin
Arazoa: Lehenespenez, Spring-ek zure aplikazioko singleton bean guztiak aplikazioa abiaraztean sortzen ditu. Ehunka bean badituzu, honek abiarazte-denbora nabarmen moteldu dezake, batez ere garapen-fasean.
Irtenbidea:
- Irtenbide globala: Gaitu "lazy initialization" globala zure application.properties fitxategian. Horrela, bean bat behar denean bakarrik sortuko da, eta ez hasieran.
-
Properties
spring.main.lazy-initialization=true - Irtenbide espezifikoa: Erabili @Lazy anotazioa bereziki astunak diren eta hasieran behar ez diren bean zehatzen gainean.
Onura: Aplikazioaren abiarazte-denbora izugarri hobetzen du, batzuetan segundotik milisegundora jaitsiz.
3. Aholkua: Sortu Docker irudi argalagoak Layered JARs-ekin
Arazoa: Zure kodean lerro bakar bat aldatzen duzun bakoitzean, Docker irudi osoa berreraiki eta erregistrora igotzen duzu. Horrek mendekotasun guztiak dituen ehunka megabyteko geruza erraldoia berriro igotzea dakar, nahiz eta mendekotasunak ez diren aldatu.
Irtenbidea: Spring Boot-ek duen Layered JARs (Geruzatutako JAR-ak) ezaugarria aprobetxatzea. Zure pom.xml edo build.gradle fitxategian konfigurazio sinple batekin, Spring Boot-ek zure .jar fitxategia hainbat geruza logikotan banatu dezake: kanpoko mendekotasunak, zure aplikazioaren kodea, etab.
Adibidea (Dockerfile sinplifikatua):
# Lehenik, geruzak atera
FROM eclipse-temurin:17-jre as builder
WORKDIR application
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
# Orain, eraiki irudi finala geruzak ordenan kopiatuz
FROM eclipse-temurin:17-jre
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
Onura: Docker-ek gutxitan aldatzen diren mendekotasun-geruza handiak cache-an gorde ditzake. Zure kodea aldatzen duzunean, aplikazioaren geruza txikia bakarrik berreraiki eta igo behar da. Horrek CI/CD zikloak izugarri azkartzen ditu.
4. Aholkua: Erabili Actuator zentzuz, ez itsu-itsuan
Arazoa: spring-boot-starter-actuator mendekotasuna gehitzeak kudeaketa-puntu (endpoint) asko gaitzen ditu lehenespenez. Honek baliabideak kontsumitu ditzake eta, ondo babesten ez bada, informazio sentikorra agerian utzi.
Irtenbidea: Esplizituki aukeratu zein endpoint behar dituzun application.properties-en.
# Web bidez endpoint hauek bakarrik erakutsi: health, info eta metrics
management.endpoints.web.exposure.include=health,info,metrics
# JMX bidezko endpoint guztiak desgaitu
management.endpoints.jmx.exposure.exclude=*
Onura: Aplikazioaren gainkarga murrizten du eta bere segurtasun-jarrera hobetzen du, funtsezko monitorizazio-gaitasunak mantenduz.
5. Aholkua (Etorkizuna Gaur): Bihurtu Natibo Spring Native eta GraalVM-rekin
Arazoa: Java makina birtualean (JVM) exekutatzen diren aplikazio tradizionalek abiarazte-denbora nahiko motela eta memoria-kontsumo handia dute. Hau ez da egoera aproposa zerbitzaririk gabeko (serverless) funtzioetarako edo azkar eskalatu behar duten mikrouzerbitzuetarako.
Irtenbidea: Spring Native proiektua eta GraalVM erabiltzea. Teknologia honek zure Java aplikazioa Ahead-of-Time (AOT) konpilatzen du, hau da, zuzenean sistema eragile espezifiko baterako exekutagarri natibo bat sortzen du, JVM-aren beharrik gabe.
Onurak (zenbakitan):
- Abiarazte-denbora: Segundo batzuen ordez, ehunka milisegundo edo gutxiago.
- Memoria-erabilera: 5-10 aldiz txikiagoa izan daiteke.
- Tamaina: Diskoan aztarna txikiagoa.
Konpromezuak: Eraikuntza-denbora luzeagoa eta Java-ren ezaugarri dinamiko batzuekin (hausnarketa/reflection) mugak izan ditzake.
Onura Nagusia: Zure Spring Boot aplikazioa "argaltzeko" azken modua da, hodei-ingurune modernoetarako (cloud-native) ezin hobea bihurtuz.
Amaiera: Spring Boot aplikazio arin eta sendo bat eraikiz
Spring Boot-en erosotasunak ez du zertan errendimenduaren kaltetan izan behar. Teknika hauek aplikatuz —mendekotasunen kudeaketa zorrotza, bean alferren hasieratzea, Docker geruza adimendunak, Actuator-en erabilera zentzuduna eta Spring Native-ren potentziala—, garatzeko errazak izateaz gain, produkzioan arinak, azkarrak eta oso eraginkorrak diren aplikazioak eraiki ditzakezu.
๋๊ธ