معماری میکرو سرویس یا یکپارچه؟
برای درک میکروسرویسها، باید بدانیم کاربرد سیستمهای یکپارچه چیست و چه چیزی باعث شد در زمانهای اخیر از برنامههای یکپارچه به میکروسرویسها حرکت کنیم.
سیستمهای یکپارچه ( Monolithic applications )
اگر تمام عملکردهای یک پروژه در یک بخش واحد وجود داشته باشند، آن برنامه به عنوان یک برنامهی یکپارچه شناخته میشود. ما برنامهی خود را در لایههای مختلفی مانند Presentation ، Service ، UI طراحی میکنیم و سپس آن بخش از کدهای نوشته شده را به عنوان یک فایل خروجی به کار میگیریم. این چیزی نیست جز یک برنامهی یکپارچه، که در آن " mono " یک پایگاه کد منفرد حاوی تمام عملکردهای مورد نیاز را نشان میدهد.
چرا اصلا به سمت میکروسرویسها برویم؟
خب برای جواب به این سوال بهتر است معایب سیستمهای یکپارچه را مرور کنیم:
- مدیریت دشوار بخاطر گسترش برنامه در گذشت زمان
- برای تغییری کوچک، کل برنامه را دوباره باید منتشر ( publish ) کنیم
- با تغییر و آپدیت برنامه، زمان انتشار افزایش مییابد.
- درک دشوار برای توسعه دهندههای جدید هر پروژه
- برای تقسیم ترافیک روی قسمتهای مختلف برنامه، باید نمونههای کل برنامه را در چندین سرور منتشر کنیم که بسیار ناکارآمد و باعث استفادهی بیهوده از منابع میشود
- اگر از فناوری یا تکنولوژیهای جدید استفاده کنیم، برای عملکردی خاص، چه از نظر هزینه و چه از نظر زمان، بر کل برنامه تاثیر گذار است
- و در نهایت وجود یک باگ در هر ماژول میتواند کل برنامه را مختل کند.
و اما مزایای سیستمهای یکپارچه:
- توسعهی آن نسبت به میکروسرویسها ساده است.
- انتشار آن آسانتر است؛ زیرا فقط یک خروجی، مستقر شدهاست.
- در مقایسه با معماری میکروسرویسها، توسعهی آن نسبتا آسانتر و سادهتر است.
- مشکلات تأخیر و امنیت شبکه در مقایسه با معماری میکروسرویسها نسبتاً کمتر است.
- توسعه دهندگان نیازی به یادگیری برنامههای مختلف ندارند؛ آنها میتوانند تمرکز خود را بر روی یک برنامه حفظ کنند.
میکروسرویس ها
این یک سبک توسعه معماری است که در آن برنامه از سرویسهای کوچکتری تشکیل شدهاست که بخش کوچکی از عملکرد و دادهها را با برقراری ارتباط مستقیم با یکدیگر، با استفاده از پروتکلی مانند HTTP مدیریت میکند. به عبارتی دیگر خدمات یا سرویسهای کوچکی هستند که با هم کار میکنند.
معماری میکروسرویس تأثیر بسزایی در رابطهی بین برنامه و پایگاه داده دارد. بجای اشتراک گذاری یک پایگاه داده با سایر میکروسرویسها، هر میکروسرویس، پایگاه داده خاص خود را دارد که اغلب منجر به تکثیر برخی از دادهها میشود، اما اگر میخواهید از این معماری بهره مند شوید، داشتن یک پایگاه داده در هر میکروسرویس، ضروری است؛ زیرا اتصال ضعیف را تضمین میکند. مزیت دیگر داشتن یک پایگاه دادهی مجزا برای هر میکروسرویس این است که هر میکروسرویس میتواند از نوع پایگاه دادهای که برای نیازهای خود مناسبتر است، استفاده کند. هر سرویس یک ماژول را ارائه میدهد، به طوری که خدمات مختلف را میتوان به زبانهای برنامه نویسی مختلف نوشت. الگوهای زیادی در معماری میکروسرویس دخیل هستند مانند discovery و registry service ، Caching ، ارتباط API ، امنیت و غیره.
اصول میکروسرویسها:
تک مسئولیتی: یکی از اصولی است که به عنوان بخشی از الگوی طراحی SOLID تعریف شده است. بیان میکند که یک Unit ، یا یک کلاس، یک متد یا یک میکروسرویس باید تنها یک مسئولیت را داشته باشد. هر میکروسرویس باید یک مسئولیت داشته باشد و یک عملکرد واحد را ارائه دهد. شما همچنین میتوانید بگویید تعداد میکروسرویسهایی که باید توسعه دهید، برابر با تعداد عملکردهای مورد نیاز شما است. پایگاه داده نیز غیرمتمرکز است و به طور کلی، هر میکروسرویس، پایگاه داده خاص خود را دارد.
بر اساس قابلیتهای تجاری ساخته شده است: در دنیای امروزی که فناوریهای زیادی وجود دارند، همیشه فناوریای وجود دارد که برای اجرای یک عملکرد خاص مناسبتر است. اما در برنامههای یکپارچه، این یک اشکال بزرگ بود؛ زیرا ما نمیتوانیم از فناوریهای مختلف برای هر عملکرد استفاده کنیم و از این رو، نیاز به مصالحه در زمینههای خاص داریم. یک میکروسرویس هرگز نباید خود را از پذیرش پشته فناوری مناسب یا ذخیرهسازی پایگاه داده پشتیبان که برای حل هدف تجاری مناسبتر است، محدود کند؛ بهعنوان مثال، هر میکروسرویس میتواند بر اساس نیازهای تجاری از فناوریهای متفاوتی استفاده کند.
طراحی برای مدیریت خطاها: میکروسرویسها باید با در نظر گرفتن مدیریت خطاها طراحی شوند. میکروسرویسها باید از مزیت این معماری استفاده کنند و پایین آمدن یک میکروسرویس نباید بر کل سیستم تأثیر بگذارد و سایر عملکردها باید در دسترس کاربر باقی بمانند. اما در برنامههای کاربردی سیستمهای یکپارچه که خطای یک ماژول منجر به سقوط کل برنامه میشود، اینگونه نبود.
مزایای میکروسرویس ها:
- مدیریت آن آسان است زیرا نسبتا کوچکتر است.
- اگر در یکی از میکروسرویسها، بروزرسانی وجود داشته باشد، باید فقط آن میکروسرویس را مجدداً منتشر کنیم.
- میکروسرویسها مستقل هستند و از این رو به طور مستقل منتشر میشوند. زمان راه اندازی و انتشار آنها نسبتاً کمتر است.
- برای یک توسعهدهنده جدید بسیار آسان است که وارد پروژه شود، زیرا او باید فقط یک میکروسرویس خاص را که عملکردی را که روی آن کار میکند، درک کند و نه کل سیستم را.
- اگر یک میکروسرویس خاص به دلیل استفاده بیش از حد کاربران از آن عملکرد، با بار زیادی مواجه است، ما باید فقط آن میکروسرویس را تنظیم کنیم. از این رو، معماری میکروسرویس از مقیاس بندی افقی پشتیبانی میکند.
- هر میکروسرویس بر اساس نیازهای تجاری میتواند از فناوریهای مختلفی استفاده کند.
- اگر یک میکروسرویس خاص به دلیل برخی باگها از کار بیفتد، بر روی سایر میکروسرویسها تأثیر نمیگذارد و کل سیستم دست نخورده باقی میماند و به ارائه سایر عملکردها به کاربران ادامه میدهد.
معایب میکروسرویس ها:
- پیچیده است و پیچیدگی آن با افزایش تعداد ریز سرویسها افزایش مییابد.
- نیاز به نیروهای متخصص
- استقرار مستقل میکروسرویسها پیچیدهاست.
- میکروسرویسها از نظر استفاده از شبکه پرهزینه هستند؛ زیرا نیاز به تعامل با یکدیگر دارند و همه این تماسهای راه دور منجر به تأخیر شبکه میشود.
- امنیت کمتر به دلیل ارتباط بین سرویسها
- اشکال زدایی دشوار است
به عنوان یک برنامه نویس به کدام گزینه بیشتر اهمیت می دهید؟
Senior Developer .Net Technologies Resume : ------------------------------------
احتمالا اکثر شما هم در آگهیهای استخدام برنامه نویس، با واژه Senior Developer یا برنامه نویس ارشد برخورد داشته اید. حال به راستی به چه کسی برنامه نویس ارشد گفته میشود. یا بهتره بگم که چه زمانی ما میتونیم خودمون را یک برنامه نویس ارشد بدونیم؟
از آنجا که تعریف مشخصی برای این واژهها در فرهنگ خاصی وجود ندارد و عموما هر کسی یک تعریف خاص با توجه به سلیقه خودش در این زمینه ارائه میدهد نمیتوان یک شرح واحد از این واژهها نظیر Senior Developer یا حتی Junior Developer ارائه داد. در نتیجه قصد دارم با توجه به تجربیات شخصی، این موارد رو تشریح کنم.
در خیلی موارد منظور از برنامه نویس ارشد، کسی است که:
- در حداقل یک یا دو زبان برنامه نویسی تجربه داشته باشد؛
- با تکنولوژیهای مهم و کارآمد ارائه شده در آن زبان آشنایی کامل داشته باشد؛
- توانایی استفاده از این تکنولوژیها را در جای مناسب پروژه دارا باشد؛
- با الگوهای برنامه نویسی (Design Pattern) آشنایی کامل داشته باشد؛
- بتواند به سایر اعضای تیم در حل مشکلات و باگهای برنامه کمک کند؛
- یک خطایاب قهار باشد(منظور این است با اکثر استثنائات و خطاهای متداول زبان و تکنولوژی که پروژه با آن پیاده سازی میشود آشنا باشد و بداند که چه زمان این خطا به وجود میآید و چگونه میتوان این موارد را برطرف کرد)؛
- باید با پیاده سازی سیستمهای سرویس گرا (SOA) جدای از تکنولوژی پیاده سازی آن آشنایی کامل داشته باشد؛
- باید با روشهای تست و خطایابی و ابزارهای توسعه و پیاده سازی آن آشنا بوده و توانایی استفاده از آنها را در پروژههای خود داشته باشد؛
- یک برنامه نویس ارشد باید در زمینه تخمین زمان تکمیل پروژه مهارت داشته باشد. باید بتواند مدت زمان لازم برای تکمیل یک Task را تخمین بزند و در همین مدت زمان، Task مربوطه را به صورت کامل پیاده سازی نماید.
- در خیلی موارد باید بتواند هماهنگی لازم را بین اعضای تیم برنامه نویسی ایجاد نماید؛
- و...
*ترتیب عبارات بالا دلیلی بر اولویت موارد ذکر شده نیست.
*منظور از آشنایی در عبارات بالا، یعنی تسلط و توانایی استفاده از آن با آگاهی تمام.
چه مدت زمان برای تبدیل شدن به یک برنامه نویس ارشد نیاز است؟
برای به دست آوردن مهارتها و تواناییهای یک برنامه نویس ارشد لازم است که حداقل 8 تا 10 سال تجربه برنامه نویسی در یک زبان را داشته باشید. البته این در مورد همگان صادق نیست . شاید کسی بتواند این راه را در کمتر از 8 سال طی نماید. این بستگی به تلاش و استعداد فرد دارد. اما تجربه بیشتر یعنی شرکت در پروژههای بیشتر و آمادگی بیشتر در حل مشکلات و مسائل مختلف در طی روند تکمیل پروژه. برای مثال در زمینه تخمین اجرای یک Task داشتن تجربه بیشتر خیلی به شما کمک خواهد کرد.
در پایان چهار ردیف یا رده مختلف را که بین برنامه نویسان رواج دارد ذکر میکنم.(از پایین به بالا)
Junior : عموما به کسی گفته میشود که 1 تا 3 سال تجربه برنامه نویسی دارد. معمولا کدهای نوشته شده توسط این افراد باید بررسی شود چون احتمال اشتباه در آن زیاد است. اکثر کدهای نوشته شده توسط این افراد به صورت dirty code است. راهنمایی هایی که به این افراد داده میشود شامل راهنمایی در زمینه ساختاری و الگوریتمی نیز میباشد.
Mid-Level : برنامه نویسان در این رده بین 4 تا 6 سال تجربه دارند. میتوانند به تنهایی نیز یک مشکل موجود در پروژه را حل نمایند. با مباحث مربوطه به طراحی کامپوننت آشنایی دارند و پروژه را بی نیاز از کامپوننت خواهند کرد. حتی در بعضی موارد میتوانند به تنهایی یک پروژه در سطح کوچک با متوسط را توسعه دهند.
Senior Developer : در بالا به صورت کامل شرح داده شد.
Luminary : به صورت معمول به کسی گفته میشود که تمام تواناییهای یک برنامه نویس ارشد را داراست و فقط تجربه برنامه نویسی آن قطعا از 10 سال بیشتر است.
از این واژه کمتر در ردههای برنامه نویسی استفاده میشود و بیشتر به همان واژه Senior Developer بسنده میکنند.
وبلاگها ، سایتها و مقالات ایرانی (داخل و خارج از ایران)
Visual Studio
ASP. Net
طراحی و توسعه وب
PHP
اسکیوال سرور
سی شارپ
عمومی دات نت
ویندوز
مسایل اجتماعی و انسانی برنامه نویسی
متفرقه
Debugger visualizers
از VS.Net 2005 به بعد، امکانات اشکال زدایی کدها به شدت بهبود یافته و یکی از امکانات جالبی که به آن اضافه شده است، Debugger visualizers میباشد، یعنی امکان مشاهدهی محتوای اشیاء در حین دیباگ. همچنین با استفاده از SDK ویژوال استودیو، برنامه نویسها میتوانند Debugger visualizers سفارشی خودشان را نیز تهیه کنند. در ادامه به تعدادی از این موارد اشاره خواهد شد:
- Xml Visualizer v.2 - site
- Data Debugger Visualizer - site
- WCF Visualizers Tool - site
- IL Visualizer - site
- DB Connection Visualizer - site
- LINQ to SQL Debug Visualizer - site
- Graphics Debugger Visualizer - site
- Bitmap Debugger Visualizer - site
- PowerShell Debug Visualizer - site
- WebVisualizers - site
- Sharepoint debug visualizer - site
- WPF Tree Debugger Visualizer - site
- GUID Debugger Visualizer - site
- WindowsIdentity Debugger Visualizer - site
- ControlTree visualizer - site
- Regular Expression Visualizers - site
- Improving Visual C++ Debugging - site
من برنامه نویس ویندوز هستم.البته نه خیلی حرفه ای ولی دوست دارم یادگیری خودم رو در این زمینه ادامه بدم.
به نظر شما مانور دادن روی برنامه های ویندوز و برنامه نویسی windows application اشتباهه و باید به سمت برنامه نویسی Web حرکت کنم؟
تعریف متدها در برنامه نویسی:
متدها جزء اولین چیزهایی هستند که در هنگام شروع برنامه نویسی در هر یک از زبانهای برنامه نویسی، برنامه نویس با آنها آشنا میشود. بنابراین متدها به عنوان اصلیترین Building Block ها در زبانهای برنامه نویسی دارای اهمیت بسیار زیادی میباشند. متدها اولین جاهایی هستند که ما میتوانیم کار خودمان را از آنها شروع کنیم و به سوی هدف خود حرکت کنیم.
همان طور که میدانید شما در هنگام کد نویسی یکسری عملکردها را با ارسال یکسری پارمترها به متدها و فراخوانی آنها، بر عهدهی یک متد خاص میگذارید. بعد از فراخوانی انتظار دارید که متد، یک نوع دادهی خاص را برگرداند یا اینکه انتظار ندارید هیچ مقداری را برگرداند. همچنین احتمال دارد در هنگام اجرای متدی، یکسری خطاها رخ دهند و برنامه نویس باید سعی کند همهی آنها را به درستی مدیریت کند. اما آیا به نظر شما مواردی که در مورد متدها دارای اهمیت میباشند، فقط اینها هستند؟
بسیاری از برنامه نویسان انتظاری که از متدها دارند فقط در همین حد میباشد و بیشتر از این درگیر هیچ مسئلهی دیگری نمیشوند. اما آیا فقط در نظر گرفتن این مسایل در رسیدن به یک کد خوش ساخت، قابل توسعه و بدون پیچیدگی کافی است؟
متدها علاوه بر ویژگیهای ذکر شدهی در بالا که بیشتر بر ویژگیهای ذاتی و عملکردی آن تمرکز داشت، باید داری یکسری ویژگیهای دیگر نیز باشند، متدها باید Clean ، Testable و Predictable باشند. هر کدام از ویژگیهای مذکور توسط این پارامترها تشریح میشوند.
در ذیل ویژگیهای مذکور در شکل بالا را تشریح خواهیم کرد.
Clear Purpose :
· یک متد یک کار را انجام میدهد و همچنین آن کار را نیز به خوبی انجام میدهد.
· متد به راحتی قابل درک میباشد.
· میزان خطاها را به شدت کاهش میدهد.
· دیباگ کردن را در صورت وجود هر خطایی سادهتر میکند.
· قابلیت توسعه را افزایش میدهد.
· نوشتن تست برای این نوع متدها به دلیل اینکه فقط بر روی یک هدف خاص تمرکز دارند ساده است.
Good Name :
· نام متد عمکرد آن را به روشنی بیان میکند
Focused Code :
· تمام کد نوشته شدهی در متد فقط بر روی یک هدف تمرکز دارند.
· خوانایی کد بالا است و میزان توضیحاتی که برای کد نوشته میشود در کمترین حد ممکن است.
· متد دارای تاثیرات ناخواستهای بر سایر قسمتهای نرم افزار نمیباشد. این مسئله به معنی است که این نوع متدها شامل کدهایی که کارهای ناخواسته ای را انجام میدهند نمیباشد. برای مثال متدی که برای واکشی اطلاعات مشتریان استفاده میشود هیچگونه عملیاتی را که برای ثبت اطلاعات مشتریان انجام میشود، انجام نمیدهد.
Short Length :
· تعداد خطوط کد مربوط به متد کم میباشد. این مسئله خود باعث کاهش باگهای احتمالی در یک متد میشود.
Automated Code Test :
· متد این قابلیت را دارد که توسط زیر ساختهای تست، تست شود که این مسئله خود باعث افزایش کیفیت کد میشود.
Predictable Result :
· متد دارای یک نتیجهی قابل پیش بینی میباشد.
در ادامه سعی میکنیم با ذکر یک مثال، مواردی را که ذکر شد بیشتر توضیح دهیم و دیدگاه کاربردی آن را بررسی کنیم.
مثالی از دنیای واقعی:
مثال زیر فرآیند مربوط به دریافت سفارش از مشتری را به صورت کدی محاورهای نمایش میدهد. در این مثال سعی شده مشکلات و راه حلهای پیشنهادی Defensive Code با تمرکز بر مواردی که در قسمت قبل ذکر شد به صورت کامل تشریح شود. اکثر ما به عنوان برنامه نویس، با مواردی مانند شکل ذیل مواجه شدهایم. در این حالت در هنگام طراحی نرم افزار برنامه نویس مستقیما وارد رویداد مربوط به کلیک دکمهی ثبت اطلاعات سفارش میشود و به صورت کاملا ناباورانه و با پشتکاری مثال زدنی شروع به کد زدن میکند. برنامه نویس تمامی منطق دریافت اطلاعات از کاربر و ثبت مشترک، ایجاد درخواست برای مشترک، مراحل دریافت کالا از انبار، پرداخت، ارسال ایمیل به مشتری و سایر عملیاتهای دیگر را در این متد و پشت سر هم مینویسد:
این روش کد نویسی روشی است که اکثر برنامه نویسان با آن آشنایی دارند. اولین مشکلی که این روش دارد این است که این کد Clean نمیباشد. قابلیت توسعه و نگهداری این کد بسیار پایین میباشد و به اصطلاح یک کد کاملا باگ خیز میباشد. حال نوبت این رسیده که این کد را از نظر پارامترهایی که در بالا ذکر شد بررسی کنیم.
Clear Purpose :
آیا این متد دارای یک هدف مشخص و معین است؟ بیایید بررسی کنیم، ایجاد مشتری، ایجاد سفارش، ارسال درخواست به انبار، انجام عملیات پرداخت و ارسال رسید. همهی این کارها توسط این متد انجام میشود. خودتان در مورد تبعات این روش کد نویسی قضاوت کنید.
Clear Name :
به نظر شما چگونه میتوان یک اسم مناسب برای این متد انتخاب کرد که عملکرد آن را به درستی بیان کند. هر متد به یک نام مناسب نیاز دارد که این مسئله خود قابلیت توسعه و نگهداری کد را افزایش میدهد. این نام میتواند اطلاعات کاملی را در مورد متد ارائه دهد و عملکرد کلی آن را بیان نماید. هدف متد باید از طریق نام متد بیان شود و هنگامیکه شما نتوانید برای متد مد نظر یک نام را انتخاب کنید، بنابراین این متد دارای هدفی مشخص نمیباشد.
Focused Code :
متد باید کاری را انجام دهد که نام آن بیان میکند و تمام کدهای متد باید حتما بر روی آن هدف تمرکز کنند.
Short Length :
متد باید دارای طول کمی باشد. برای مثال طول کد نباید از اندازهی صفحه نمایش بیشتر باشد. به عبارتی دیگر، کد متد نباید اسکرول بخورد. بنابراین باید سعی شود کدهای اضافی از متد حذف شوند تا با این کار پیچیدگی کد هم به کمترین میزان برسد.
Automated Code Test :
آیا این متد به وسیلهی Automated Code Test می تواند تست شود؟ چند نکته در مورد این کد وجود دارد که توانایی Automated Code Test را از این کد میگیرد. اولین مسئله این است که در این مثال منطق یا همان Business برنامه با UI تلفیق شدهاست. برای رفع این مشکل باید منطق برنامه را در یک پروژهی مجزا از نوع Class Library قرار داد. مسئلهی دیگر این است که این متد برای تست شدن بسیار طولانی میباشد و باید به یکسری اجزای کوچکتر و منطقیتر شکسته شود و هر متد باید یک هدف و عملکرد روشن را داشته باشد.
در قسمت بعدی راهکارهایی برای Refactor کردن کد بر اساس اصول ذکر شده ارائه خواهد شد.
بارگذاری یک یوزرکنترل با استفاده از جیکوئری
بله. یک trim را هم میتوانید اضافه کنید بعلاوه نکته حذف فاصله خالی بین تگها که در کاهش حجم نهایی مؤثر است.
@ناشناس
میشد این آرگومانهای مورد نظر رو به شکل یک رشته یک سطری هم در آورد (فرقی نمیکرد). اما با استفاده از این تابع شما میتونید یک شیء جاوا اسکریپتی را تبدیل به json کنید که از این لحاظ خوب یک قدم پیشرفت است و در خطایابی کدها کمک بزرگی است (رشته قابل خطایابی نیست).