Feign Client در مقابل Rest Client

راهنمای جامع
مقدمه
در معماری های میکروسرویس مدرن، سرویس ها اغلب نیاز به ارتباط با یکدیگر از طریق HTTP دارند. جاوا راه های متعددی برای برقراری تماس های REST بین سرویس ها ارائه می دهد. دو رویکرد محبوب Feign Client و RestTemplate (که اغلب به عنوان Rest Client نامیده می شود) هستند. درک تفاوت بین آنها برای انتخاب ابزار مناسب برای کار ضروری است. در این مستندات، جنبههای کلیدی Feign Client و Rest Client، مزایا، محدودیتها و سناریوهای استفاده از آنها را بررسی خواهیم کرد.
- نمای کلی
1.1 Feign Client
Feign یک سرویس گیرنده وب اعلامی است که نوشتن کلاینت های HTTP در جاوا را ساده می کند. توسط نتفلیکس توسعه داده شده است، برای برقراری ارتباط میکروسرویس آسان تر، به طور یکپارچه با Spring Cloud ادغام می شود. با Feign، مشتریان REST API را با استفاده از واسطها و حاشیهنویسیهای ساده جاوا بهطور شفاف تعریف میکنید.
1.2 Rest Client (RestTemplate)
RestTemplate یک سرویس گیرنده HTTP همزمان است که توسط Spring ارائه شده است، که عمدتاً قبل از Spring 5 برای برقراری تماس های REST API استفاده می شود. برای ساخت درخواستهای HTTP نیاز به نوشتن کد دستی دارد که آن را پرمخاطبتر اما بسیار انعطافپذیر میکند. از بهار 5، RestTemplate به نفع کلاینت های مدرن تر و غیر مسدود کننده مانند WebClient کنار گذاشته شده است، اما همچنان به طور گسترده در برنامه های قدیمی استفاده می شود.
- تفاوت های کلیدی بین Feign Client و Rest Client
2.1 سهولت استفاده
Feign Client: Feign یک رویکرد اعلامی ارائه می دهد. شما یک رابط تعریف می کنید، آن را با روش های درخواست HTTP حاشیه نویسی می کنید، و Spring به طور خودکار مشتری را سیم می کند. این باعث می شود کد تمیزتر شود، بدون نیاز به نوشتن کد درخواست HTTP صفحه دیگ.
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
- **Rest Client (RestTemplate)**: With RestTemplate, you manually build HTTP requests. This approach offers more control but requires more code. For example, to make a GET request, you’d do:
RestTemplate restTemplate = new RestTemplate();
User user = restTemplate.getForObject("http://user-service/users/{id}", User.class, id);
2.2 پیکربندی و سفارشی سازی
-Feign Client: Feign بسیاری از پیکربندی های HTTP را با تکیه بر حاشیه نویسی انتزاعی می کند. با مدیریت پیکربندی Spring Boot ادغام میشود و امکان سفارشیسازی آسان کلاینتها را فراهم میکند، از جمله تلاشهای مجدد، زمانبندیها، و رهگیریها از طریق ویژگیها یا دانههای پیکربندی سفارشی.
نمونه ای از پیکربندی از طریق application.yml
:
user-service:
url: http://localhost:8080
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
Rest Client: با RestTemplate، پیکربندیهایی مانند زمانبندی، رهگیریها و مدیریت خطا باید به صورت دستی تنظیم شوند. به عنوان مثال، شما می خواهید ایجاد کنید HttpClient
و آن را به این صورت پیکربندی کنید:
HttpClient client = HttpClientBuilder.create().setConnectTimeout(5000).build();
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(client));
2.3 ادغام
Feign Client: Feign به خوبی با اجزای مختلف Spring Cloud، مانند Eureka برای کشف سرویس، Hystrix برای الگوهای قطع کننده مدار، و Ribbon برای متعادل کردن بار سمت مشتری، ادغام می شود. این باعث می شود که Feign به ویژه برای محیط های میکروسرویس مناسب باشد.
Rest Client: RestTemplate همچنین می تواند با کشف سرویس، قطع کننده های مدار و تعادل بار استفاده شود، اما این ادغام ها نیاز به پیکربندی دستی دارند. به عنوان مثال، ادغام Eureka یا Hystrix شما را ملزم می کند که منطق کشف یا انعطاف پذیری را جداگانه کدگذاری کنید.
2.4 حاشیه نویسی و پشتیبانی از روش های HTTP
Feign Client: Feign از یک سبک اظهاری استفاده می کند و از حاشیه نویسی برای ترسیم تماس های REST به طور مستقیم در رابط های جاوا استفاده می کند. از تمام روش های اصلی HTTP پشتیبانی می کند (GET
، POST
، PUT
، DELETE
و غیره)، و مشتریان Spring Cloud Feign می توانند از حاشیه نویسی هایی مانند استفاده کنند @RequestParam
، @RequestBody
، @PathVariable
، و @Headers
.
Rest Client: RestTemplate از تمام روش های HTTP نیز پشتیبانی می کند اما از کدگذاری ضروری استفاده می کند. شما به صورت دستی جزئیات هر درخواست را می نویسید، که می تواند کد را مفصل تر کند.
2.5 مدیریت خطا و انعطاف پذیری
Feign Client: ادغام Feign با Hystrix (برای قطع مدار) یا Resilience4j امکان مدیریت آسان خطا و الگوهای انعطاف پذیری را فراهم می کند. اگر یک تماس سرویس با شکست مواجه شود، روش های بازگشتی را می توان مستقیماً در رابط یا از طریق پیکربندی تعریف کرد.
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
Rest Client: مدیریت خطا در RestTemplate با گرفتن استثناها یا استفاده از آن انجام می شود ResponseErrorHandler
. به عنوان مثال، اجرای یک سفارش ResponseErrorHandler
در مقایسه با مکانیسمهای بازگشتی Feign به کد بسیار بیشتری نیاز دارد.
2.6 پشتیبانی ناهمزمان
Feign Client: به طور پیش فرض، Feign به صورت همزمان عمل می کند. با این حال، می توان آن را برای پشتیبانی از تماس های ناهمزمان با استفاده از CompletableFuture یا با ادغام آن با Hystrix پیکربندی کرد.
@GetMapping("/users/{id}")
CompletableFuture getUserByIdAsync(@PathVariable("id") Long id);
Rest Client: RestTemplate یک سرویس گیرنده همزمان است. برای ارتباطات غیرمسدود، اسپرینگ استفاده از WebClient (معرفی شده در بهار 5) را به جای RestTemplate برای عملیات ناهمزمان توصیه می کند.
2.7 عملکرد و کارایی
Feign Client: Feign یک لایه انتزاعی اضافه می کند و بر روی سایر مشتریان HTTP (مانند Apache HttpClient یا OkHttp) ساخته می شود. در حالی که این انتزاع استفاده را ساده می کند، می تواند از نظر عملکرد، به خصوص در برنامه های با توان بالا، مقداری سربار اضافه کند. با این حال، در بیشتر موارد، این سربار حداقل است.
Rest Client: RestTemplate کنترل بیشتری بر درخواستهای HTTP میدهد، که میتواند منجر به تنظیم دقیق و بهینهسازی عملکرد بهتر شود. همانطور که گفته شد، نوشتن کد RestTemplate بهینه شده بیشتر دستی است و در صورت عدم استفاده دقیق می تواند مستعد خطا باشد.
- چه زمانی از Feign Client استفاده کنیم؟
3.1 مزایای مشتری Feign
-
رویکرد اعلامی: نوشتن کد کمتر دیگ بخار، توسعه را سریعتر و تمیزتر می کند.
-
ادغام Spring Cloud: Feign با Eureka، Ribbon، Hystrix و سایر اجزای Spring Cloud بهطور کامل کار میکند.
-
مکانیزمهای سعی مجدد داخلی: پیکربندی آسان زمانبندی، تلاش مجدد و قطع کننده مدار با استفاده از Hystrix یا Resilience4j.
-
کشف سرویس: با ادغام Eureka، Feign به صورت پویا نمونه های سرویس را بدون نیاز به URL های کدگذاری شده حل می کند.
3.2 معایب Feign Client
-
Abstraction Overhead: Feign ممکن است عملکردی مشابه پیاده سازی های RestTemplate تنظیم شده را نداشته باشد، به خصوص در محیط های با کارایی بالا و با تاخیر کم.
-
فاقد پشتیبانی ناهمزمان خارج از جعبه: در حالی که می توان آن را برای تماس های همگام پیکربندی کرد، این کار به اندازه استفاده از یک کلاینت غیر مسدود کننده مانند WebClient شهودی نیست.
- چه زمانی از Rest Client استفاده کنیم؟
4.1 مزایای Rest Client
-
کنترل کامل: RestTemplate به توسعه دهنده کنترل کامل بر هر جنبه ای از درخواست HTTP را می دهد و بهینه سازی ها و پیکربندی های پیشرفته را امکان پذیر می کند.
-
برای سیستمهای قدیمی بهتر است: بسیاری از برنامههای قدیمی Spring هنوز از RestTemplate استفاده میکنند و ممکن است برای برخی موارد استفاده به Feign نیاز نباشد.
-
عملیات همزمان: ماهیت همزمان RestTemplate ممکن است در برخی از محیطهایی که به پیچیدگی اضافی ارتباط ناهمزمان یا غیر مسدود کننده نیاز ندارند ترجیح داده شود.
4.2 معایب Rest Client
-
کد کامل: برای مدیریت هر تماس REST به کد بیشتری نیاز دارد که حفظ کد را در مقایسه با Feign سختتر میکند.
-
ادغام کمتر: در حالی که امکان ادغام با Eureka، Ribbon و Hystrix وجود دارد، این به پیکربندی دستی بیشتری نیاز دارد.
-
منسوخ شده: RestTemplate به نفع WebClient برای تماس های غیر مسدود در بهار 5 و بعد از آن منسوخ شده است.
- نتیجه گیری
هم Feign Client و هم Rest Client نقاط قوت و محدودیت های خود را دارند. انتخاب بین این دو تا حد زیادی به نیاز پروژه شما بستگی دارد:
-
زمانی که نیاز به توسعه سریع میکروسرویسهایی دارید که از طریق HTTP با یکدیگر ارتباط برقرار میکنند، از Feign Client استفاده کنید، بهویژه در اکوسیستمهای Spring Cloud که میتوانید از ویژگیهای کشف سرویس و انعطافپذیری با حداقل راهاندازی استفاده کنید.
-
اگر به کنترل کامل بر روی درخواستها و پاسخهای HTTP نیاز دارید، یا اگر در یک پایگاه کد قدیمی کار میکنید که قبلاً به طور گسترده از آن استفاده میکند، Rest Client (RestTemplate) را انتخاب کنید.
برای پروژه های جدید، به خصوص در بهار 5 یا بالاتر، استفاده از WebClient را در نظر بگیرید، زیرا روشی مدرن و واکنشی برای مدیریت ارتباط RESTful ارائه می دهد.
متشکرم