
فرض کنید ما در کسب و کار خودمان یا در سازمانی که کار می کنیم از معماری میکروسرویس و REST API استفاده می کنیم. ما یک سری سرویس را به صورت soap از شرکت ها یا واحدهای دیگر دریافت می کنیم.
حال سوال اینجاست که بهترین و اصولی ترین جایی که این تبدیل پروتکل باید انجام بشه کجاست؟ آیا داخل هر سرویسی که نیاز به فراخوانی سرویس soap دارد باید این کار انجام شود، داخل Api Gateway باید این تبدیل انجام شود یا جایی دیگر؟
توی این مطلب میخوام این موضوع را به صورت خیلی ساده و خودمونی و برای همیشه روشن کنم. قبل از اینکه SOAP با REST قاطی بشه و سیستم ها تبدیل به آش شله قلمکار بشن.
بهترین و اصولیترین جا برای تبدیل SOAP → REST یک لایهٔ Anti-Corruption / Adapter / Integration Layer مستقل بیرون از سرویسهای میکروسرویسی است.
در معماری میکروسرویس، هیچوقت سرویسهات رو وادار نکن با دنیای عجیب SOAP صحبت کنن.
سرویسهای تو باید فقط REST بلد باشن و فاز «من هم SOAP بلدم، هم REST، هم GraphQL، هم چایی دم میکنم» نگیرن.
پس باید چی کار کنیم؟
این همون لایهایه که مثل مترجم همزمان سازمان ملل بین سرویسهای مدرن RESTای تو و سرویسهای باستانی SOAP طرف مقابل میایسته.
این لایه:
درخواست REST داخلی رو میگیره
تبدیلش میکنه به SOAP
با سرویس بیرونی حرف میزنه
جواب SOAP رو تبدیل میکنه به JSON/REST
و در نهایت «تمیز و اتو کشیده» تحویل میکروسرویسها میده
جداسازی کامل پروتکل خارجی از معماری داخلی
سرویسهای داخلی پاک و ساده میمونند (Single Responsibility)
اگر فردا SOAP منقرض شد یا REST بیرونی به gRPC تغییر کرد… فقط همین لایه رو آپدیت میکنی
امکان کشینگ، لاگینگ، ریتلیمیتینگ، امنیت و حتی Retry logic اینجا خیلی راحتتره
دیباگ و مانیتورینگ centralized میشه
انجام تبدیل داخل خود میکروسرویسها
سرویسهات چاق و شلخته میشن، وابسته به SOAP میشن و SRP میره رو هوا.
گیتوی، API
گیتوی باید Routing و Security و throttling بکنه… تبدیل SOAP به REST؟
عزیزم نه! اون طفل معصوم تحمل این مصیبت رو نداره.
Internal microservices (REST)
⬇️⬆️
Integration Layer / SOAP Adapter / ACL
⬇️⬆️
External SOAP Services
اول از همه: چه کسی با چه کسی حرف میزند؟
در معماری درست، جریان ارتباط اینجوریه:
Client
⬇️
API Gateway
⬇️
Microservice (REST)
⬇️
Anti-Corruption Layer (ACL)
⬇️
External SOAP service
یعنی ACL زیرمجموعهٔ Backend است نه زیرمجموعهٔ Gateway.
احراز هویت/مجوز
Rate Limiting
Routing
امنیت
لاگ و مانیتورینگ سطح بالا
aggregation خیلی ساده
گیتوی نباید تبدیل پروتکل انجام بده.
چون اگه گیتوی SOAP-دان بشه، دیگه بهش نمیگن Gateway… میگن «فرودگاه خدمات متفرقه!» 😅
وظیفهاش:
ترجمه REST → SOAP
ترجمه SOAP → REST
هندل کردن Retry، Error mapping، Fault mapping
کشینگ خاص سرویس خارجی
لاگهای سطح پروتکل خارجی
این کارها اساساً کار سرویسهای داخلی است، نه Gateway.
Flow سطح کاربردی
کلاینت به گیتوی ضربه میزند
گیتوی درخواست را به میکروسرویس تو پاس میدهد
سرویس تو اگر نیاز داشت با سرویس خارجی حرف بزند، به ACL میگوید
ACL میرود SOAP را صدا میزند
پاسخ را تمیز میکند و REST برمیگرداند
سرویس تو جواب نهایی را میدهد
گیتوی آن را تحویل کلاینت میدهد
جواب:
نه. به هیچوجه!
ACL یک سرویس داخلی است.
گیتوی فقط باید سرویسهای Domain را ببیند، نه Adapterهای پشت صحنه را.
اگر گیتوی ACL را ببیند:
لایهٔ دامنه دور زده میشود
coupling بالا میرود
ACL مجبور میشود رفتار API کاربر را تامین کند!! که فاجعه است.
معماری layered رسماً میکشد میرود
Gateway فقط به میکروسرویسها روت میکند
میکروسرویسها با ACL حرف میزنند
ACL با SOAP حرف میزند
گیتوی مثل گارد ورودی یک شرکت است.
کارمندها (میکروسرویسها) داخل ساختمان هستند.
ACL مثل مترجم شرکت است.
آیا گارد ورودی باید با مترجم وارد بحث شود؟
نه!
فقط با کارمندها حرف میزند.
کارمندها اگر نیاز داشتند، میروند سراغ مترجم. 😄
احتمالا سرویس soap نیاز به احراز هویت دارد، نام کاربری و رمز عبور اون توی چه لایه ای باید قرار بگیره؟
این سؤال دقیقاً همون نقطهایه که خیلی از تیمها اشتباه میکنن و آخرش پسورد SOAP رو میذارن تو گیتوی، بعد گیتوی دپرس میشه و شبها کابوس WSDL میبینه 😄
نام کاربری و رمز سرویس SOAP باید در خودِ لایهٔ ACL ذخیره و استفاده شود.
نه در گیتوی،
نه در میکروسرویسهای داخلی،
نه در کلاینت.
فقط و فقط ACL.
پس طبیعیه که احراز هویت مخصوص SOAP هم همینجا انجام بشه.
میکروسرویسهای داخلی نباید حتی بوی SOAP بهشون بخوره.
گیتوی = احراز هویت کاربران سیستم شما
میکروسرویس = منطق دامنه
ACL = ترجمه پروتکل + امنیت سرویسهای خارجی
اگر پسورد SOAP رو جای دیگه بذاری، این مرزهای طلایی قاطی میشه.
اگر credentialهای SOAP وارد گیتوی شوند:
گیتوی عملاً تبدیل میشود به سرویس خارجی شما
attack surface بیشتر میشود
مدیریت Rotation سخت میشود
لاگها خطرناک میشوند
اما اگر فقط ACL آنها را بداند،
امنیت و مدیریت ساده و متمرکز میماند.
ذخیره در Secret Manager (مثل Vault, AWS Secrets Manager, Kubernetes Secrets)
Inject شدن در ACL هنگام startup
استفاده فقط در کد adapter
عدم ذخیره سازی مستقیم در config معمولی یا image
گیتوی credential SOAP را پاس بدهد
کلاینت credential SOAP را بداند
درخواست REST داخلی شامل یوزر/پسورد SOAP باشد
سرویس داخلی خودش credential را ذخیره کند
اگر سرویس SOAP امکان استفاده از token داشته باشد (بعضی WSDLها دارند)،
بهترین کار:
ACL در startup یا دورهای token بگیرد
token را در حافظه یا cache امن نگه دارد
برای هر درخواست از همان token استفاده کند
این کار امنیت را چند برابر بالا میبرد.