خلاصه مطلب
در این مقاله به بررسی چند تکنیک میپردازیم که میتواند عملکرد API در برنامههای Spring Boot را بهبود بخشد.

Spring Boot رایجترین فریمورک برای ایجاد APIهای REST در جاوا است. این فریمورک تمامی تنظیمات و کدهای پیشفرض را مدیریت میکند و ما تنها باید منطق اصلی را پیادهسازی کنیم.
با بزرگتر شدن API و استفاده زیاد مشتریان، ممکن است عملکرد آن کاهش یابد.
در این مقاله به بررسی چند تکنیک میپردازیم که میتواند عملکرد API در برنامههای Spring Boot را بهبود بخشد. استفاده کارآمد از @Async و @CompletableFuture
Spring Boot محدودیتی در تعداد درخواستهای همزمان دارد. اما اگر محاسبات سنگینی وجود داشته باشد که میتوان آنها را در یک نخ جداگانه اجرا کرد، این کار میتواند به بهبود عملکرد منجر شود.
برخی وظایف، مانند لاگگذاری، میتوانند به صورت غیرهمزمان انجام شوند تا تأخیر API کاهش یابد.
مثال استفاده از @Async با CompletableFuture
ابتدا باید Async را فعال کنیم:
| import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync;@Configuration @EnableAsync // Magic switch! public class AsyncConfig { // You can also configure the thread pool executor here // for more control, but Spring provides a default one. } |
ایجاد یک سرویس
| import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit;@Service public class SlowService { @Async // Tells Spring to run this in a separate thread public CompletableFuture performSlowTask(String input) { System.out.println("Starting slow task for: " + input + " on thread: " + Thread.currentThread().getName()); try { // Simulate a long-running operation (e.g., external API call) TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return CompletableFuture.failedFuture(e); } String result = "Processed: " + input; System.out.println("Finished slow task for: " + input); return CompletableFuture.completedFuture(result); // Return the result wrapped in a CompletableFuture } } |
سپس میتوانیم سرویس را به این صورت فراخوانی کنیم:
| CompletableFuture futureresult = slowService.performSlowTask(data); |
برنامهنویسی واکنشگرا با استفاده از Spring WebFlux
Spring WebFlux یک فریمورک غیرمسدودکننده و واکنشگرا است. این فریمورک از مدل event-loop استفاده میکند که تعداد کمی نخ ثابت دارد تا ارتباطات همزمان بسیاری را بهطور کارآمد مدیریت کند.
| @GetMapping("/reactive-process") public Mono processReactively(@RequestParam String data) { System.out.println("Received reactive request for: " + data); // Simulate a non-blocking delay (like a reactive API call) return Mono.delay(Duration.ofSeconds(2)) .map(d -> "Reactively processed: " + data) .doOnNext(result -> System.out.println("Finished reactive task for: " + data)); } |
تنظیمات پیشرفته پایگاه داده
پایگاههای داده معمولاً بزرگترین عامل محدودکننده در بهبود عملکرد API هستند.
حتی اگر شاخصها تنظیم شده باشند، استراتژیها و پرسوجوهای ناکارآمد میتوانند منجر به عملکرد ضعیف شوند.
چه تکنیکهایی میتوانند در این زمینه کمک کنند؟
استفاده از استراتژیهای کش پیشرفته(Using Advanced Caching Strategies)
همه ما میدانیم که کش میتواند عملکرد را با بازگرداندن نتایج به جای درخواست دادههای مشابه از پایگاه داده یا تماسهای شبکهای، بهبود بخشد.
بهینهسازی سریالسازی دادهها(Optimizing the Data Serialization)
سریالسازی یا دسیریالسازی میتواند زمان و حافظه زیادی برای اشیاء پیچیده بزرگ مصرف کند.
برای استفاده از Protobuf، مراحل زیر را باید طی کنیم:
مثال فایل product.proto
| syntax = "proto3"; package com.example.proto;option java_package = "com.example.myapp.dto.proto"; option java_outer_classname = "ProductProtos";message Product { int64 id = 1; string name = 2; double price = 3; } |
پیکربندی فشردهسازی درخواست و پاسخ
پاسخهای API میتوانند بزرگ باشند، بهویژه اگر از JSON استفاده میکنیم. این میتواند باعث کاهش تأخیر API شود، زیرا هرچه اندازه بسته بزرگتر باشد، زمان بیشتری برای انتشار آن در شبکه نیاز است.
میتوانیم Spring Boot را برای فشردهسازی خودکار پاسخهای HTTP با استفاده از GZip یا سایر فناوریهای فشردهسازی پیکربندی کنیم.
نمونهای از application.properties برای فشردهسازی پاسخها
| # Enable response compression server.compression.enabled=true# Specify the MIME types that should be compressed server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css# Minimum response size (bytes) to trigger compression. Don't compress tiny responses. server.compression.min-response-size=2048 # Compress only if response is > 2KB# You can also specify which user agents to exclude (if some have issues) # server.compression.excluded-user-agents=some-buggy-client# Brotli support (if available on the server classpath/environment - requires specific setup) # server.compression.brotli.enabled=true |
تنظیمات JVM
بسیاری از تنظیمات JVM میتوانند بر عملکرد و پایداری API تأثیر بگذارند.
نمونهای از تنظیمات JVM
| # Start with 1GB initial heap, 2GB max heap, using G1GC java -Xms1g -Xmx2g -XX:+UseG1GC -jar your-springboot-app.jar# Example: Potentially using ZGC (requires compatible JDK) # java -Xms2g -Xmx2g -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar your-springboot-app.jar |
نکات پایانی
در این مقاله تکنیکهای پیشرفتهای برای بهبود عملکرد API پوشش داده شد. اما نکات مهمی نیز باید در نظر گرفته شوند:
لیست دوره های آکادمی جاواپرو

