آموزش هوش تجاری از ۰ تا ۱۰۰

۱۸ مطلب در بهمن ۱۴۰۱ ثبت شده است

  • ۰
  • ۰

به عنوان خلاصه و نکات کلیدی، موارد زیر مهمترین نتیجه گیری از این راهنما است.

  • مزایای استفاده از ظروف راه حل های مبتنی بر کانتینر باعث صرفه جویی در هزینه های مهم می شوند زیرا به کاهش مشکلات استقرار ناشی از وابستگی های ناموفق در محیط های تولید کمک می کنند. کانتینرها به طور قابل توجهی DevOps و عملیات تولید را بهبود می بخشند.

 

  • کانتینرها در همه جا حضور خواهند داشت. کانتینرهای مبتنی بر داکر در حال تبدیل شدن به استاندارد واقعی در صنعت هستند که توسط فروشندگان کلیدی در اکوسیستم‌های ویندوز و لینوکس مانند مایکروسافت، آمازون AWS، گوگل و IBM پشتیبانی می‌شوند. داکر احتمالاً به زودی هم در مراکز داده ابری و هم در مراکز داده در محل در همه جا حاضر خواهد شد.

 

  • کانتینرها به عنوان واحد استقرار. کانتینر داکر در حال تبدیل شدن به واحد استاندارد استقرار برای هر برنامه یا سرویس مبتنی بر سرور است.

 

  • میکروسرویس ها معماری میکروسرویس ها در حال تبدیل شدن به رویکرد ارجح برای برنامه های کاربردی توزیع شده و بزرگ یا پیچیده ماموریت حیاتی بر اساس بسیاری از زیرسیستم های مستقل در قالب خدمات مستقل است. در معماری مبتنی بر میکروسرویس، برنامه به عنوان مجموعه‌ای از سرویس‌ها ساخته می‌شود که به طور مستقل توسعه، آزمایش، نسخه‌سازی، استقرار و مقیاس‌بندی می‌شوند. هر سرویس می تواند شامل هر پایگاه داده مستقل مرتبط باشد.

 

  • طراحی دامنه محور و SOA. الگوهای معماری میکروسرویس ها از معماری سرویس گرا (SOA) و طراحی دامنه محور (DDD) ناشی می شوند. هنگامی که میکروسرویس هایی را برای محیط هایی با نیازها و قوانین تجاری در حال تحول طراحی و توسعه می دهید، مهم است که رویکردها و الگوهای DDD را در نظر بگیرید.

 

  • چالش های میکروسرویس ها میکروسرویس ها قابلیت های قدرتمند زیادی مانند استقرار مستقل، مرزهای زیرسیستم قوی و تنوع فناوری را ارائه می دهند. با این حال، آنها همچنین بسیاری از چالش‌های جدید مرتبط با توسعه برنامه‌های کاربردی توزیع‌شده، مانند مدل‌های داده تکه‌تکه و مستقل، ارتباط انعطاف‌پذیر بین میکروسرویس‌ها، سازگاری نهایی و پیچیدگی عملیاتی را که از تجمیع اطلاعات ثبت و نظارت از چندین میکروسرویس ناشی می‌شود، مطرح می‌کنند. این جنبه‌ها سطح پیچیدگی بسیار بالاتری را نسبت به کاربردهای سنتی یکپارچه معرفی می‌کنند. در نتیجه، تنها سناریوهای خاص برای کاربردهای مبتنی بر میکروسرویس مناسب هستند. اینها شامل برنامه های کاربردی بزرگ و پیچیده با زیرسیستم های چندگانه در حال تکامل است. در این موارد، ارزش سرمایه گذاری در معماری نرم افزاری پیچیده تر را دارد، زیرا چابکی طولانی مدت و نگهداری برنامه ها را بهتر می کند.

 

  • ظروف برای هر کاربرد کانتینرها برای میکروسرویس ها مناسب هستند، اما می توانند برای برنامه های یکپارچه مبتنی بر چارچوب سنتی دات نت، هنگام استفاده از کانتینرهای ویندوز نیز مفید باشند. مزایای استفاده از Docker، مانند حل بسیاری از مشکلات استقرار تا تولید و ارائه پیشرفته‌ترین محیط‌های Dev و Test، برای بسیاری از انواع مختلف برنامه‌ها اعمال می‌شود.

 

  • CLI در مقابل IDE. با ابزارهای مایکروسافت، می توانید برنامه های کاربردی دات نت را با استفاده از رویکرد دلخواه خود توسعه دهید. با استفاده از Docker CLI و Visual Studio Code می توانید با یک CLI و یک محیط مبتنی بر ویرایشگر توسعه دهید. یا می توانید از یک رویکرد متمرکز بر IDE با ویژوال استودیو و ویژگی های منحصر به فرد آن برای Docker استفاده کنید، مانند اشکال زدایی چند کانتینر.

 

  • برنامه های کاربردی ابری انعطاف پذیر در سیستم های مبتنی بر ابر و به طور کلی سیستم های توزیع شده، همیشه خطر شکست جزئی وجود دارد. از آنجایی که مشتریان و خدمات فرآیندهای جداگانه ای هستند (کانتینرها)، یک سرویس ممکن است نتواند به موقع به درخواست مشتری پاسخ دهد. به عنوان مثال، ممکن است یک سرویس به دلیل نقص جزئی یا تعمیر و نگهداری از کار بیفتد. ممکن است سرویس بیش از حد بارگذاری شود و به آرامی به درخواست ها پاسخ دهد. یا ممکن است برای مدت کوتاهی به دلیل مشکلات شبکه قابل دسترسی نباشد. بنابراین، یک برنامه مبتنی بر ابر باید آن شکست ها را بپذیرد و یک استراتژی برای پاسخ به این شکست ها داشته باشد. این استراتژی‌ها می‌توانند شامل سیاست‌های امتحان مجدد (ارسال مجدد پیام یا درخواست مجدد) و پیاده‌سازی الگوهای قطع کننده مدار برای جلوگیری از بار نمایی درخواست‌های مکرر باشند. اساساً، برنامه‌های مبتنی بر ابر باید مکانیسم‌های انعطاف‌پذیری داشته باشند - چه بر اساس زیرساخت‌های ابری یا سفارشی، مانند برنامه‌های سطح بالا که توسط ارکستراتورها یا اتوبوس‌های خدماتی ارائه می‌شوند.

 

  • امنیت. دنیای مدرن ما از کانتینرها و ریزسرویس ها می تواند آسیب پذیری های جدیدی را آشکار کند. راه‌های مختلفی برای پیاده‌سازی امنیت برنامه‌های کاربردی، بر اساس احراز هویت و مجوز وجود دارد. با این حال، امنیت کانتینر باید اجزای کلیدی دیگری را در نظر بگیرد که منجر به برنامه‌های کاربردی ذاتاً ایمن‌تر می‌شود. یک عنصر حیاتی در ساخت برنامه‌های ایمن‌تر داشتن یک راه امن برای برقراری ارتباط با برنامه‌ها و سیستم‌های دیگر است، چیزی که اغلب به اعتبار، رمزها، رمزهای عبور و موارد مشابه نیاز دارد که معمولاً به عنوان اسرار برنامه از آن یاد می‌شود. هر راه حل ایمن باید از بهترین شیوه های امنیتی پیروی کند، مانند رمزگذاری اسرار در حین حمل و نقل و در حالت استراحت، و جلوگیری از افشای اسرار زمانی که توسط برنامه نهایی مصرف می شود. این اسرار باید مانند زمانی که از Azure Key Vault استفاده می کنید، با خیال راحت ذخیره و نگهداری شوند.

 

  • ارکسترها. ارکسترهای مبتنی بر کانتینر، مانند سرویس Azure Kubernetes و Azure Service Fabric بخش کلیدی هر میکروسرویس و برنامه کاربردی مبتنی بر کانتینر هستند. این برنامه ها پیچیدگی بالا، نیازهای مقیاس پذیری را به همراه دارند و در حال تکامل دائمی هستند. این راهنما ارکسترها و نقش آنها را در راه حل های مبتنی بر میکروسرویس و کانتینر معرفی کرده است. اگر نیازهای برنامه شما را به سمت برنامه های پیچیده کانتینری سوق می دهد، جستجوی منابع اضافی برای یادگیری بیشتر در مورد ارکستراتورها مفید خواهد بود.
  • sahar saha sql
  • ۰
  • ۰

برای ارتباط با منابع محافظت شده و سایر سرویس ها، برنامه های ASP.NET Core معمولاً نیاز به استفاده از رشته های اتصال، رمزهای عبور یا سایر اعتبارنامه هایی دارند که حاوی اطلاعات حساس هستند. به این اطلاعات حساس راز می گویند. بهترین روش این است که اسرار را در کد منبع وارد نکنید و مطمئن شوید که اسرار در کنترل منبع ذخیره نمی شوند. در عوض، باید از مدل پیکربندی هسته ASP.NET برای خواندن اسرار از مکان های امن تر استفاده کنید.

شما باید اسرار دسترسی به منابع توسعه و مرحله بندی را از اسرار مورد استفاده برای دسترسی به منابع تولید جدا کنید، زیرا افراد مختلف نیاز به دسترسی به آن مجموعه های مختلف اسرار خواهند داشت. برای ذخیره اسرار مورد استفاده در طول توسعه، رویکردهای رایج ذخیره اسرار در متغیرهای محیطی یا با استفاده از ابزار ASP.NET Core Secret Manager است. برای ذخیره سازی ایمن تر در محیط های تولید، میکروسرویس ها می توانند اسرار را در Azure Key Vault ذخیره کنند.

 

ذخیره اسرار در متغیرهای محیطی
یکی از راه‌های حفظ اسرار از کد منبع این است که توسعه‌دهندگان رازهای مبتنی بر رشته را به عنوان متغیرهای محیطی در ماشین‌های توسعه خود تنظیم کنند. هنگامی که از متغیرهای محیطی برای ذخیره اسرار با نام‌های سلسله مراتبی استفاده می‌کنید، مانند آنهایی که در بخش‌های پیکربندی تودرتو هستند، باید متغیرها را به گونه‌ای نام‌گذاری کنید که سلسله مراتب کامل بخش‌های آن را که با دونقطه (:) مشخص شده است، نامگذاری کنید.

برای مثال، تنظیم یک متغیر محیط Logging:LogLevel:Default به مقدار Debug معادل یک مقدار پیکربندی از فایل JSON زیر خواهد بود:

 

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

 

برای دسترسی به این مقادیر از متغیرهای محیطی، برنامه فقط باید AddEnvironmentVariables را در ConfigurationBuilder خود هنگام ساخت یک شی IConfigurationRoot فراخوانی کند.

 

  توجه داشته باشید

متغیرهای محیطی معمولاً به صورت متن ساده ذخیره می شوند، بنابراین اگر ماشین یا فرآیند با متغیرهای محیطی به خطر بیفتد، مقادیر متغیر محیطی قابل مشاهده خواهند بود.

 

اسرار را با ASP.NET Core Secret Manager ذخیره کنید
ابزار ASP.NET Core Secret Manager روش دیگری برای حفظ اسرار از کد منبع در طول توسعه ارائه می دهد. برای استفاده از ابزار Secret Manager، بسته Microsoft.Extensions.Configuration.SecretManager را در فایل پروژه خود نصب کنید. هنگامی که این وابستگی وجود داشت و بازیابی شد، دستور dotnet user-secrets می‌تواند برای تنظیم مقدار اسرار از خط فرمان استفاده شود. این اسرار در یک فایل JSON در فهرست مشخصات کاربر (جزئیات بر اساس سیستم عامل متفاوت است) و به دور از کد منبع ذخیره می شود.

اسرار تنظیم شده توسط ابزار Secret Manager توسط ویژگی UserSecretsId پروژه که از رازها استفاده می کند سازماندهی می شود. بنابراین، همانطور که در قطعه زیر نشان داده شده است، باید حتماً ویژگی UserSecretId را در فایل پروژه خود تنظیم کنید. مقدار پیش فرض یک GUID است که توسط ویژوال استودیو اختصاص داده شده است، اما رشته واقعی تا زمانی که در رایانه شما منحصر به فرد باشد مهم نیست.

 

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

 

استفاده از اسرار ذخیره شده با Secret Manager در یک برنامه با فراخوانی AddUserSecrets<T> در نمونه ConfigurationBuilder انجام می شود تا اسرار برنامه در پیکربندی آن گنجانده شود. پارامتر عمومی T باید نوعی از اسمبلی باشد که UserSecretId روی آن اعمال شده است. معمولاً استفاده از AddUserSecrets<Startup> خوب است.

هنگام استفاده از متد CreateDefaultBuilder در Program.cs، AddUserSecrets<Startup>() در گزینه های پیش فرض محیط توسعه گنجانده شده است.

  • sahar saha sql
  • ۰
  • ۰

پس از احراز هویت، ASP.NET Core Web API باید مجوز دسترسی را صادر کند. این فرآیند به یک میکروسرویس اجازه می‌دهد تا API‌ها را برای برخی از کاربران احراز هویت شده، اما نه برای همه، در دسترس قرار دهد. مجوز می‌تواند بر اساس نقش‌های کاربران یا بر اساس خط‌مشی سفارشی انجام شود، که ممکن است شامل بازرسی ادعاها یا سایر روش‌های اکتشافی باشد.

محدود کردن دسترسی به یک مسیر ASP.NET Core MVC به آسانی اعمال یک ویژگی Authorize در متد اقدام (یا در کلاس کنترلر اگر همه اقدامات کنترل کننده نیاز به مجوز دارند) است، همانطور که در مثال زیر نشان داده شده است:

 

public class AccountController : Controller
{
    public ActionResult Login()
    {
    }

    [Authorize]
    public ActionResult Logout()
    {
    }
}

 

به طور پیش‌فرض، افزودن یک ویژگی Authorize بدون پارامتر، دسترسی به کاربران تأیید شده برای آن کنترل‌کننده یا عملکرد را محدود می‌کند. برای محدود کردن بیشتر یک API برای در دسترس بودن فقط برای کاربران خاص، ویژگی را می توان گسترش داد تا نقش ها یا خط مشی های مورد نیازی را که کاربران باید رعایت کنند، مشخص کند.

 

اجرای مجوز مبتنی بر نقش
ASP.NET Core Identity یک مفهوم داخلی از نقش ها دارد. علاوه بر کاربران، ASP.NET Core Identity اطلاعات مربوط به نقش‌های مختلف مورد استفاده توسط برنامه را ذخیره می‌کند و کاربرانی که به کدام نقش‌ها اختصاص داده شده‌اند را پیگیری می‌کند. این تخصیص‌ها را می‌توان به صورت برنامه‌ریزی با نوع RoleManager که نقش‌ها را در ذخیره‌سازی ماندگار به‌روزرسانی می‌کند، و نوع UserManager که می‌تواند نقش‌ها را به کاربران اعطا یا لغو کند، تغییر داد.

اگر با توکن‌های حامل JWT احراز هویت می‌کنید، میان‌افزار احراز هویت حامل ASP.NET Core JWT، نقش‌های کاربر را بر اساس ادعاهای نقش موجود در توکن پر می‌کند. برای محدود کردن دسترسی به یک کنش یا کنترلر MVC به کاربران در نقش‌های خاص، می‌توانید یک پارامتر Roles را در حاشیه‌نویسی (ویژگی) Authorize قرار دهید، همانطور که در قطعه کد زیر نشان داده شده است:

 

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

 

در این مثال، فقط کاربران در نقش‌های Administrator یا PowerUser می‌توانند به APIها در کنترل‌کننده ControlPanel (مانند اجرای اکشن SetTime) دسترسی داشته باشند. ShutDown API محدودتر است تا فقط به کاربرانی که در نقش Administrator هستند دسترسی داشته باشند.

برای اینکه یک کاربر در چندین نقش باشد، از چندین ویژگی Authorize استفاده می کنید، همانطور که در مثال زیر نشان داده شده است:

 

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

 

در این مثال، برای فراخوانی API1، کاربر باید:

  • در نقش Administrator یا PowerUser باشید و
  • در نقش RemoteEmployee باشید و
  • رضایت یک کنترل کننده سفارشی برای مجوز CustomPolicy.

 

اجرای مجوز مبتنی بر سیاست
قوانین مجوز سفارشی را می توان با استفاده از سیاست های مجوز نیز نوشت. این بخش یک نمای کلی ارائه می دهد. برای اطلاعات بیشتر، به کارگاه مجوز ASP.NET مراجعه کنید.

خط مشی های مجوز سفارشی در روش Startup.ConfigureServices با استفاده از روش service.AddAuthorization ثبت می شوند. این متد یک نماینده می گیرد که آرگومان AuthorizationOptions را پیکربندی می کند.

 

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

 

همانطور که در مثال نشان داده شده است، سیاست ها می توانند با انواع مختلفی از الزامات مرتبط باشند. پس از ثبت نام خط‌مشی‌ها، می‌توان آن‌ها را با ارسال نام خط‌مشی به‌عنوان آرگومان Policy از ویژگی Authorize، روی یک کنش یا کنترل‌کننده اعمال کرد (برای مثال، [Authorize(Policy="EmployeesOnly")] سیاست‌ها می‌توانند الزامات متعددی داشته باشند، نه فقط یکی (همانطور که در این مثال ها نشان داده شده است).

در مثال قبلی، اولین تماس AddPolicy فقط یک راه جایگزین برای مجوز دادن بر اساس نقش است. اگر [Authorize(Policy="AdministratorsOnly")] روی یک API اعمال شود، فقط کاربرانی که در نقش سرپرست هستند می توانند به آن دسترسی داشته باشند.

دومین فراخوان AddPolicy راه آسانی را نشان می‌دهد که یک ادعای خاص باید برای کاربر وجود داشته باشد. روش RequireClaim همچنین به صورت اختیاری مقادیر مورد انتظار را برای ادعا می گیرد. اگر مقادیر مشخص شده باشند، الزام تنها در صورتی برآورده می شود که کاربر هم ادعای نوع صحیح و هم یکی از مقادیر مشخص شده را داشته باشد. اگر از میان افزار احراز هویت حامل JWT استفاده می کنید، همه ویژگی های JWT به عنوان ادعای کاربر در دسترس خواهند بود.

جالب ترین سیاست نشان داده شده در اینجا در روش سوم AddPolicy است، زیرا از یک نیاز مجوز سفارشی استفاده می کند. با استفاده از الزامات مجوز سفارشی، می توانید کنترل زیادی بر نحوه اجرای مجوز داشته باشید. برای انجام این کار، باید این انواع را پیاده سازی کنید:

 

  • یک نوع Requirements که از IAuthorizationRequirement مشتق شده و حاوی فیلدهایی است که جزئیات مورد نیاز را مشخص می کند. در مثال، این یک فیلد سنی برای نوع نمونه MinimumAgeRequirement است.
  • کنترل‌کننده‌ای که AuthorizationHandler<TRequirement> را پیاده‌سازی می‌کند، که در آن T نوعی از IAuthorizationRequirement است که کنترل‌کننده می‌تواند برآورده کند. کنترل‌کننده باید متد HandleRequirementAsync را پیاده‌سازی کند، که بررسی می‌کند آیا یک زمینه مشخص که حاوی اطلاعاتی درباره کاربر است، نیاز را برآورده می‌کند یا خیر.

 

اگر کاربر الزامات را برآورده کند، یک فراخوانی به context.Succeed نشان می دهد که کاربر مجاز است. اگر چندین راه وجود داشته باشد که یک کاربر ممکن است یک نیاز مجوز را برآورده کند، می توان چندین کنترل کننده ایجاد کرد.

علاوه بر ثبت الزامات خط‌مشی سفارشی با تماس‌های AddPolicy، شما همچنین باید کنترل‌کننده‌های نیازمندی‌های سفارشی را از طریق Dependency Injection ثبت کنید (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).

 

  • sahar saha sql
  • ۰
  • ۰

جنبه های زیادی در مورد امنیت در میکروسرویس ها و برنامه های کاربردی وب وجود دارد که این موضوع می تواند به راحتی چندین کتاب مانند این را به خود اختصاص دهد. بنابراین، در این بخش، ما بر روی احراز هویت، مجوز، و اسرار برنامه تمرکز خواهیم کرد.

 

احراز هویت را در میکروسرویس ها و برنامه های وب دات نت اجرا کنید
اغلب لازم است که منابع و APIهای منتشر شده توسط یک سرویس به کاربران یا مشتریان معتمد خاصی محدود شوند. اولین قدم برای اتخاذ این نوع تصمیمات اعتماد در سطح API، احراز هویت است. احراز هویت فرآیند تأیید مطمئن هویت کاربر است.

در سناریوهای میکروسرویس، احراز هویت معمولاً به صورت مرکزی انجام می شود. اگر از یک API Gateway استفاده می کنید، دروازه مکان خوبی برای احراز هویت است. اگر از این روش استفاده می‌کنید، مطمئن شوید که نمی‌توان مستقیماً به میکروسرویس‌ها (بدون دروازه API) دسترسی پیدا کرد، مگر اینکه امنیت بیشتری برای تأیید اعتبار پیام‌ها وجود داشته باشد، چه پیام‌ها از دروازه می‌آیند یا نه.

زمانی که API Gateway احراز هویت را متمرکز می کند، هنگام ارسال درخواست ها به میکروسرویس ها، اطلاعات کاربر را اضافه می کند. اگر می‌توان مستقیماً به سرویس‌ها دسترسی داشت، یک سرویس احراز هویت مانند Azure Active Directory یا یک میکروسرویس احراز هویت اختصاصی که به عنوان یک سرویس رمز امنیتی (STS) عمل می‌کند می‌تواند برای احراز هویت کاربران استفاده شود. تصمیمات اعتماد بین سرویس ها با توکن های امنیتی یا کوکی ها به اشتراک گذاشته می شود. (این توکن ها را می توان در صورت نیاز با اجرای اشتراک کوکی بین برنامه های ASP.NET Core به اشتراک گذاشت.) 

 

هنگامی که میکروسرویس ها مستقیماً در دسترس قرار می گیرند، اعتماد، که شامل احراز هویت و مجوز می شود، توسط یک رمز امنیتی صادر شده توسط یک میکروسرویس اختصاصی، که بین میکروسرویس ها به اشتراک گذاشته شده است، مدیریت می شود.

 

با ASP.NET Core Identity احراز هویت
مکانیزم اصلی در ASP.NET Core برای شناسایی کاربران یک برنامه، سیستم عضویت ASP.NET Core Identity است. ASP.NET Core Identity اطلاعات کاربر (از جمله اطلاعات ورود به سیستم، نقش ها و ادعاها) را در یک فروشگاه داده که توسط توسعه دهنده پیکربندی شده است ذخیره می کند. به طور معمول، فروشگاه داده های ASP.NET Core Identity یک فروشگاه Entity Framework است که در بسته Microsoft.AspNetCore.Identity.EntityFrameworkCore ارائه شده است. با این حال، فروشگاه‌های سفارشی یا سایر بسته‌های شخص ثالث می‌توانند برای ذخیره اطلاعات هویتی در Azure Table Storage، CosmosDB یا مکان‌های دیگر استفاده شوند.

 

  نکته

ASP.NET Core 2.1 و نسخه های بعدی ASP.NET Core Identity را به عنوان کتابخانه کلاس Razor ارائه می کند، بنابراین مانند نسخه های قبلی، کدهای لازم را در پروژه خود مشاهده نخواهید کرد. برای جزئیات بیشتر در مورد نحوه سفارشی کردن کد Identity مطابق با نیازهای شما، Scaffold Identity را در پروژه های ASP.NET Core ببینید.

کد زیر از الگوی پروژه ASP.NET Core Web Application MVC 3.1 با احراز هویت حساب کاربری فردی انتخاب شده است. این نشان می دهد که چگونه می توان ASP.NET Core Identity را با استفاده از Entity Framework Core در روش Startup.ConfigureServices پیکربندی کرد.

 

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddRazorPages();
    //...
}

 

هنگامی که ASP.NET Core Identity پیکربندی شد، با افزودن app.UseAuthentication() و endpoints.MapRazorPages() همانطور که در کد زیر در روش Startup.Configure سرویس نشان داده شده است، آن را فعال می کنید:

 

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
    //...
}

 

مهم

خطوط در کد قبلی باید به ترتیبی که نشان داده شده باشد تا هویت به درستی کار کند.

 

استفاده از ASP.NET Core Identity چندین سناریو را فعال می کند:

  • اطلاعات کاربری جدید را با استفاده از نوع UserManager (userManager.CreateAsync) ایجاد کنید.
  • احراز هویت کاربران با استفاده از نوع SignInManager. می‌توانید از signInManager.SignInAsync برای ورود مستقیم به سیستم یا signInManager.PasswordSignInAsync برای تأیید صحیح بودن رمز عبور کاربر استفاده کنید و سپس وارد سیستم شوید.
  • یک کاربر را بر اساس اطلاعات ذخیره شده در یک کوکی (که توسط میان افزار ASP.NET Core Identity خوانده می شود) شناسایی کنید تا درخواست های بعدی از یک مرورگر شامل هویت و ادعاهای کاربر وارد شده به سیستم شود.

ASP.NET Core Identity از احراز هویت دو مرحله ای نیز پشتیبانی می کند.

برای سناریوهای احراز هویت که از یک ذخیره اطلاعات کاربر محلی استفاده می کنند و هویت بین درخواست ها با استفاده از کوکی ها حفظ می شود (همانطور که برای برنامه های وب MVC معمول است)، ASP.NET Core Identity یک راه حل توصیه شده است.

 

با ارائه دهندگان خارجی احراز هویت
ASP.NET Core از ارائه دهندگان احراز هویت خارجی نیز پشتیبانی می کند تا کاربران بتوانند از طریق جریان های OAuth 2.0 وارد شوند. این بدان معناست که کاربران می توانند با استفاده از فرآیندهای احراز هویت موجود از ارائه دهندگانی مانند مایکروسافت، گوگل، فیس بوک یا توییتر وارد سیستم شوند و این هویت ها را با هویت هسته ASP.NET در برنامه خود مرتبط کنند.

برای استفاده از احراز هویت خارجی، علاوه بر گنجاندن میان افزار احراز هویت همانطور که قبلاً ذکر شد، با استفاده از متد ()app.UseAuthentication، باید ارائه دهنده خارجی را نیز همانطور که در مثال زیر نشان داده شده است در Startup ثبت کنید:

 

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddAuthentication()
        .AddMicrosoftAccount(microsoftOptions =>
        {
            microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
            microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
        })
        .AddGoogle(googleOptions => { ... })
        .AddTwitter(twitterOptions => { ... })
        .AddFacebook(facebookOptions => { ... });
    //...
}

 

ارائه دهندگان محبوب احراز هویت خارجی و بسته های NuGet مرتبط با آنها درزیر نشان داده شده است:


Microsoft Microsoft.AspNetCore.Authentication.MicrosoftAccount
Google Microsoft.AspNetCore.Authentication.Google
فیس بوک Microsoft.AspNetCore.Authentication.Facebook
توییتر Microsoft.AspNetCore.Authentication.Twitterپ


در همه موارد، شما باید یک روند ثبت درخواست را تکمیل کنید که وابسته به فروشنده است و معمولاً شامل موارد زیر است:

  1. دریافت شناسه درخواست مشتری
  2. دریافت راز درخواست مشتری
  3. پیکربندی URL تغییر مسیر، که توسط میان افزار مجوز و ارائه دهنده ثبت شده انجام می شود
  4. به صورت اختیاری، پیکربندی URL خروج از سیستم برای مدیریت صحیح خروج از سیستم در یک سناریوی Single Sign On (SSO).

 

  نکته

تمام جزئیات توسط میان افزار مجوز و سرویس هایی که قبلا ذکر شد مدیریت می شود. بنابراین، هنگام ایجاد پروژه برنامه وب ASP.NET Core در ویژوال استودیو، علاوه بر ثبت ارائه دهندگان احراز هویت که قبلا ذکر شد، فقط باید گزینه تأیید هویت حساب کاربری فردی را انتخاب کنید.

 

احراز هویت با توکن های حامل
احراز هویت با ASP.NET Core Identity (یا Identity plus ارائه دهندگان احراز هویت خارجی) برای بسیاری از سناریوهای برنامه وب که در آنها ذخیره اطلاعات کاربر در یک کوکی مناسب است، به خوبی کار می کند. با این حال، در سناریوهای دیگر، کوکی‌ها ابزاری طبیعی برای تداوم و انتقال داده‌ها نیستند.

برای مثال، در ASP.NET Core Web API که نقاط پایانی RESTful را نشان می‌دهد که ممکن است توسط برنامه‌های یک صفحه (SPA)، توسط کلاینت‌های بومی یا حتی سایر APIهای وب قابل دسترسی باشند، معمولاً می‌خواهید به جای آن از تأیید اعتبار توکن حامل استفاده کنید. این نوع برنامه‌ها با کوکی‌ها کار نمی‌کنند، اما می‌توانند به راحتی توکن حامل را بازیابی کنند و آن را در هدر مجوز درخواست‌های بعدی قرار دهند. برای فعال کردن احراز هویت توکن، ASP.NET Core از چندین گزینه برای استفاده از OAuth 2.0 و OpenID Connect پشتیبانی می کند.

 

با یک OpenID Connect یا OAuth 2.0 Identity ارائه دهنده احراز هویت
اگر اطلاعات کاربر در Azure Active Directory یا راه حل هویت دیگری که از OpenID Connect یا OAuth 2.0 پشتیبانی می کند ذخیره شده است، می توانید از بسته Microsoft.AspNetCore.Authentication.OpenIdConnect برای احراز هویت با استفاده از گردش کار OpenID Connect استفاده کنید. برای مثال، برای احراز هویت به میکروسرویس Identity.Api در eShopOnContainers، یک برنامه وب ASP.NET Core می‌تواند از میان‌افزار آن بسته استفاده کند، همانطور که در مثال ساده‌شده زیر در Startup.cs نشان داده شده است:

 

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");
    var callBackUrl = Configuration.GetValue<string>("CallBackUrl");
    var sessionCookieLifetime = Configuration.GetValue("SessionCookieLifetimeMinutes", 60);

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddCookie(setup => setup.ExpireTimeSpan = TimeSpan.FromMinutes(sessionCookieLifetime))
    .AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.Authority = identityUrl.ToString();
        options.SignedOutRedirectUri = callBackUrl.ToString();
        options.ClientId = useLoadTest ? "mvctest" : "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.RequireHttpsMetadata = false;
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("orders");
        options.Scope.Add("basket");
        options.Scope.Add("marketing");
        options.Scope.Add("locations");
        options.Scope.Add("webshoppingagg");
        options.Scope.Add("orders.signalrhub");
    });
}

 

هنگامی که از این گردش کار استفاده می کنید، به میان افزار ASP.NET Core Identity نیازی نیست، زیرا تمام ذخیره سازی اطلاعات کاربر و احراز هویت توسط سرویس Identity مدیریت می شود.

 

توکن های امنیتی را از یک سرویس ASP.NET Core صادر کنید
اگر ترجیح می‌دهید به جای استفاده از یک ارائه‌دهنده هویت خارجی، توکن‌های امنیتی برای کاربران محلی ASP.NET Core Identity صادر کنید، می‌توانید از چند کتابخانه خوب شخص ثالث بهره ببرید.

IdentityServer4 و OpenIddict ارائه دهندگان OpenID Connect هستند که به راحتی با ASP.NET Core Identity ادغام می شوند تا به شما امکان می دهند توکن های امنیتی را از یک سرویس ASP.NET Core صادر کنید. اسناد IdentityServer4 دستورالعمل های عمیقی برای استفاده از کتابخانه دارد. با این حال، مراحل اساسی استفاده از IdentityServer4 برای صدور توکن به شرح زیر است.

  1. شما app.UseIdentityServer را در روش Startup.Configure فراخوانی می کنید تا IdentityServer4 را به خط لوله پردازش درخواست HTTP برنامه اضافه کنید. این به کتابخانه اجازه می‌دهد تا درخواست‌ها را برای نقاط پایانی OpenID Connect و OAuth2 مانند /connect/token ارائه کند.
  2. شما IdentityServer4 را در Startup.ConfigureServices با برقراری تماس با services.AddIdentityServer پیکربندی می کنید.
  3. سرور هویت را با تنظیم داده های زیر پیکربندی می کنید:
  • اعتبار مورد استفاده برای امضا
  • منابع هویت و API که کاربران ممکن است درخواست دسترسی به آنها را داشته باشند:

منابع API نشان دهنده داده ها یا عملکردهای محافظت شده است که کاربر می تواند با یک نشانه دسترسی به آنها دسترسی داشته باشد. نمونه ای از یک منبع API یک وب API (یا مجموعه ای از API ها) است که نیاز به مجوز دارد.

منابع هویتی نشان دهنده اطلاعات (ادعاهایی) است که برای شناسایی کاربر به مشتری داده می شود. این ادعاها ممکن است شامل نام کاربری، آدرس ایمیل و غیره باشد.

  • مشتریانی که برای درخواست توکن به هم متصل می شوند.
  • مکانیسم ذخیره سازی اطلاعات کاربر، مانند ASP.NET Core Identity یا جایگزین.

 

وقتی مشتریان و منابعی را برای استفاده از IdentityServer4 مشخص می‌کنید، می‌توانید یک مجموعه IEnumerable<T> از نوع مناسب را به روش‌هایی ارسال کنید که کلاینت یا منابع ذخیره‌سازی را در حافظه می‌گیرند. یا برای سناریوهای پیچیده تر، می توانید انواع مشتری یا ارائه دهنده منابع را از طریق Dependency Injection ارائه دهید.

یک پیکربندی نمونه برای IdentityServer4 برای استفاده از منابع درون حافظه و کلاینت های ارائه شده توسط یک نوع سفارشی IClientStore ممکن است مانند مثال زیر باشد:

 

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //...
    services.AddSingleton<IClientStore, CustomClientStore>();
    services.AddIdentityServer()
        .AddSigningCredential("CN=sts")
        .AddInMemoryApiResources(MyApiResourceProvider.GetAllResources())
        .AddAspNetIdentity<ApplicationUser>();
    //...
}

 

توکن های امنیتی را مصرف کنید
احراز هویت در برابر نقطه پایانی OpenID Connect یا صدور توکن‌های امنیتی خود، برخی از سناریوها را پوشش می‌دهد. اما در مورد سرویسی که به سادگی نیاز به محدود کردن دسترسی به آن دسته از کاربرانی دارد که دارای نشانه‌های امنیتی معتبری هستند که توسط یک سرویس دیگر ارائه شده‌اند، چطور؟

برای آن سناریو، میان‌افزار احراز هویت که توکن‌های JWT را مدیریت می‌کند در بسته Microsoft.AspNetCore.Authentication.JwtBearer موجود است. JWT مخفف "JSON Web Token" است و یک قالب رمز امنیتی رایج (تعریف شده توسط RFC 7519) برای برقراری ارتباط ادعاهای امنیتی است. یک مثال ساده از نحوه استفاده از میان افزار برای مصرف چنین توکن هایی ممکن است شبیه این قطعه کد باشد که از ریزسرویس Ordering.Api eShopOnContainers گرفته شده است.

 

// Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    // Configure the pipeline to use authentication
    app.UseAuthentication();
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
    });
}

public void ConfigureServices(IServiceCollection services)
{
    var identityUrl = Configuration.GetValue<string>("IdentityUrl");

    // Add Authentication services

    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;

    }).AddJwtBearer(options =>
    {
        options.Authority = identityUrl;
        options.RequireHttpsMetadata = false;
        options.Audience = "orders";
    });
}

 

پارامترهای این کاربرد عبارتند از:

  • مخاطب نشان دهنده گیرنده توکن ورودی یا منبعی است که توکن به آن دسترسی می دهد. اگر مقدار مشخص شده در این پارامتر با پارامتر موجود در توکن مطابقت نداشته باشد، توکن رد می شود.
  • Authority آدرس سرور احراز هویت صادرکننده رمز است. میان‌افزار احراز هویت حامل JWT از این URI برای دریافت کلید عمومی استفاده می‌کند که می‌تواند برای تأیید اعتبار امضای توکن استفاده شود. میان افزار همچنین تأیید می کند که پارامتر iss در توکن با این URI مطابقت دارد.

پارامتر دیگری، RequireHttpsMetadata، برای اهداف آزمایشی مفید است. شما این پارامتر را روی false قرار می دهید تا بتوانید در محیط هایی که گواهینامه ندارید تست کنید. در استقرارهای دنیای واقعی، توکن های حامل JWT همیشه باید فقط از طریق HTTPS ارسال شوند.

با نصب این میان افزار، توکن های JWT به طور خودکار از سرصفحه های مجوز استخراج می شوند. سپس آنها را از فهرست خارج می کنند، تأیید می کنند (با استفاده از مقادیر موجود در پارامترهای Audience و Authority)، و به عنوان اطلاعات کاربر ذخیره می شوند تا بعداً توسط اقدامات MVC یا فیلترهای مجوز ارجاع داده شوند.

میان‌افزار احراز هویت حامل JWT همچنین می‌تواند از سناریوهای پیشرفته‌تری مانند استفاده از گواهی محلی برای تأیید اعتبار یک توکن در صورت در دسترس نبودن مجوز پشتیبانی کند. برای این سناریو، می توانید یک شی TokenValidationParameters را در شی JwtBearerOptions تعیین کنید.

 

  • sahar saha sql
  • ۰
  • ۰

نظارت بر سلامت می‌تواند اطلاعاتی در زمان واقعی در مورد وضعیت ظروف و ریزسرویس‌های شما فراهم کند. نظارت بر سلامت برای جنبه‌های مختلف میکروسرویس‌های عملیاتی حیاتی است و به‌ویژه زمانی مهم است که ارکستراتورها به‌روزرسانی‌های جزئی برنامه را در مراحل انجام دهند، همانطور که توضیح خواهیم داد.

برنامه‌های کاربردی مبتنی بر میکروسرویس‌ها اغلب از ضربان قلب یا بررسی‌های سلامتی استفاده می‌کنند تا مانیتورهای عملکرد، زمان‌بندی‌کننده‌ها و سازمان‌دهندگان خود را قادر به پیگیری تعداد زیادی از خدمات کنند. اگر سرویس‌ها نتوانند نوعی سیگنال «من زنده‌ام» را ارسال کنند، چه بر اساس تقاضا یا بر اساس برنامه، برنامه شما ممکن است در هنگام استقرار به‌روزرسانی‌ها با خطراتی مواجه شود، یا ممکن است خیلی دیر خرابی‌ها را تشخیص دهد و نتواند خرابی‌های آبشاری را متوقف کند. می تواند منجر به قطعی های عمده شود.

در مدل معمولی، سرویس‌ها گزارش‌هایی درباره وضعیت خود ارسال می‌کنند و این اطلاعات برای ارائه یک دید کلی از وضعیت سلامت برنامه شما جمع‌آوری می‌شوند. اگر از یک ارکستراتور استفاده می کنید، می توانید اطلاعات سلامتی را در اختیار گروه ارکستراتور خود قرار دهید تا خوشه بتواند مطابق با آن عمل کند. اگر روی گزارش‌دهی سلامت با کیفیت بالا که برای برنامه شما سفارشی شده است سرمایه‌گذاری می‌کنید، می‌توانید مشکلات برنامه در حال اجرا خود را خیلی راحت‌تر شناسایی و برطرف کنید.

 

بررسی های سلامت را در خدمات ASP.NET Core اجرا کنید
هنگام توسعه یک میکروسرویس یا برنامه وب ASP.NET Core، می توانید از ویژگی داخلی بررسی سلامتی که در ASP .NET Core 2.2 (Microsoft.Extensions.Diagnostics.HealthChecks) منتشر شده است استفاده کنید. مانند بسیاری از ویژگی‌های ASP.NET Core، بررسی‌های سلامت با مجموعه‌ای از خدمات و میان‌افزار همراه است.

استفاده از سرویس‌های بررسی سلامت و میان‌افزار آسان است و قابلیت‌هایی را ارائه می‌کند که به شما امکان می‌دهد اگر منبع خارجی مورد نیاز برای برنامه شما (مانند پایگاه داده SQL Server یا API راه دور) به درستی کار می‌کند، اعتبارسنجی کنید. هنگامی که از این ویژگی استفاده می کنید، همانطور که بعدا توضیح خواهیم داد، همچنین می توانید تصمیم بگیرید که سالم بودن منبع چیست.

برای استفاده موثر از این ویژگی، ابتدا باید سرویس ها را در میکروسرویس های خود پیکربندی کنید. دوم، شما به یک برنامه کاربردی front-end نیاز دارید که گزارش های سلامتی را درخواست کند. این برنامه جلویی می‌تواند یک برنامه گزارش‌دهی سفارشی باشد، یا می‌تواند خود یک ارکستراتور باشد که می‌تواند مطابق با وضعیت سلامت واکنش نشان دهد.

 

از ویژگی HealthChecks در ریزسرویس های ASP.NET خود استفاده کنید
در این بخش، نحوه پیاده سازی ویژگی HealthChecks را در یک نمونه برنامه ASP.NET Core 6.0 Web API در هنگام استفاده از بسته Microsoft.Extensions.Diagnostics.HealthChecks یاد خواهید گرفت. پیاده سازی این ویژگی در میکروسرویس های بزرگ مانند eShopOnContainers در بخش بعدی توضیح داده شده است.

برای شروع، باید مشخص کنید که چه چیزی یک وضعیت سالم برای هر میکروسرویس است. در برنامه نمونه، ما تعریف می کنیم که میکروسرویس در صورتی سالم است که API آن از طریق HTTP قابل دسترسی باشد و پایگاه داده SQL Server مربوط به آن نیز موجود باشد.

در NET 6، با API های داخلی، می توانید سرویس ها را پیکربندی کنید، یک بررسی سلامت برای میکروسرویس و پایگاه داده SQL Server وابسته به آن اضافه کنید:

 

// Startup.cs from .NET 6 Web API sample
//
public void ConfigureServices(IServiceCollection services)
{
    //...
    // Registers required services for health checks
    services.AddHealthChecks()
        // Add a health check for a SQL Server database
        .AddCheck(
            "OrderingDB-check",
            new SqlConnectionHealthCheck(Configuration["ConnectionString"]),
            HealthStatus.Unhealthy,
            new string[] { "orderingdb" });
}

در کد قبلی، متد services.AddHealthChecks() یک چک HTTP اولیه را پیکربندی می‌کند که کد وضعیت 200 را با "سالم" برمی‌گرداند. علاوه بر این، متد افزونه AddCheck() یک SqlConnectionHealthCheck سفارشی را پیکربندی می کند که سلامت پایگاه داده SQL مربوطه را بررسی می کند.

متد AddCheck() یک بررسی سلامت جدید با یک نام مشخص و اجرای نوع IHealthCheck اضافه می کند. با استفاده از روش AddCheck می‌توانید چندین بررسی سلامت اضافه کنید، بنابراین یک میکروسرویس تا زمانی که همه چک‌هایش سالم نباشند، وضعیت «سالم» را ارائه نمی‌کنند.

SqlConnectionHealthCheck یک کلاس سفارشی است که IHealthCheck را پیاده سازی می کند، که یک رشته اتصال را به عنوان پارامتر سازنده می گیرد و یک کوئری ساده برای بررسی موفقیت آمیز بودن اتصال به پایگاه داده SQL اجرا می کند. اگر کوئری با موفقیت اجرا شود، HealthCheckResult.Healthy را برمی‌گرداند و وضعیت FailureStatus را با استثنای واقعی زمانی که شکست می‌خورد، برمی‌گرداند.

 

// Sample SQL Connection Health Check
public class SqlConnectionHealthCheck : IHealthCheck
{
    private const string DefaultTestQuery = "Select 1";

    public string ConnectionString { get; }

    public string TestQuery { get; }

    public SqlConnectionHealthCheck(string connectionString)
        : this(connectionString, testQuery: DefaultTestQuery)
    {
    }

    public SqlConnectionHealthCheck(string connectionString, string testQuery)
    {
        ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
        TestQuery = testQuery;
    }

    public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            try
            {
                await connection.OpenAsync(cancellationToken);

                if (TestQuery != null)
                {
                    var command = connection.CreateCommand();
                    command.CommandText = TestQuery;

                    await command.ExecuteNonQueryAsync(cancellationToken);
                }
            }
            catch (DbException ex)
            {
                return new HealthCheckResult(status: context.Registration.FailureStatus, exception: ex);
            }
        }

        return HealthCheckResult.Healthy();
    }
}

 

توجه داشته باشید که در کد قبلی Select 1 کوئری است که برای بررسی سلامت پایگاه داده استفاده می شود. برای نظارت بر در دسترس بودن میکروسرویس‌های شما، ارکسترهایی مانند Kubernetes به طور دوره‌ای با ارسال درخواست‌هایی برای آزمایش میکروسرویس‌ها، بررسی‌های سلامتی را انجام می‌دهند. این مهم است که جستجوهای پایگاه داده خود را کارآمد نگه دارید تا این عملیات سریع باشد و منجر به استفاده بیشتر از منابع نشود.

در نهایت، یک میان افزار اضافه کنید که به مسیر url /hc پاسخ می دهد:

 

// Startup.cs from .NET 6 Web Api sample
//
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    app.UseEndpoints(endpoints =>
    {
        //...
        endpoints.MapHealthChecks("/hc");
        //...
    });
    //…
}

 

هنگامی که نقطه پایانی <yourmicroservice>/hc فراخوانی می شود، تمام بررسی های سلامتی که در متد AddHealthChecks() در کلاس Startup پیکربندی شده اند را اجرا می کند و نتیجه را نشان می دهد.

 

اجرای HealthChecks در eShopOnContainers
میکروسرویس ها در eShopOnContainers برای انجام وظایف خود به چندین سرویس متکی هستند. به عنوان مثال، ریزسرویس Catalog.API از eShopOnContainers به بسیاری از خدمات مانند Azure Blob Storage، SQL Server و RabbitMQ بستگی دارد. بنابراین، چندین بررسی سلامت با استفاده از روش AddCheck() اضافه شده است. برای هر سرویس وابسته، یک پیاده سازی سفارشی IHealthCheck که وضعیت سلامت مربوطه آن را تعریف می کند باید اضافه شود.

پروژه منبع باز AspNetCore.Diagnostics.HealthChecks این مشکل را با ارائه پیاده سازی های بررسی سلامت سفارشی برای هر یک از این سرویس های سازمانی که بر روی .NET 6 ساخته شده اند، حل می کند. به پروژه اضافه شد. eShopOnContainers به طور گسترده از آنها در تمام ریزسرویس های خود استفاده می کند.

 

در کد زیر، اجرای بررسی سلامت برای هر سرویس وابسته اضافه شده و سپس میان افزار پیکربندی شده است:

// Startup.cs from Catalog.api microservice
//
public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration)
{
    var accountName = configuration.GetValue<string>("AzureStorageAccountName");
    var accountKey = configuration.GetValue<string>("AzureStorageAccountKey");

    var hcBuilder = services.AddHealthChecks();

    hcBuilder
        .AddSqlServer(
            configuration["ConnectionString"],
            name: "CatalogDB-check",
            tags: new string[] { "catalogdb" });

    if (!string.IsNullOrEmpty(accountName) && !string.IsNullOrEmpty(accountKey))
    {
        hcBuilder
            .AddAzureBlobStorage(
                $"DefaultEndpointsProtocol=https;AccountName={accountName};AccountKey={accountKey};EndpointSuffix=core.windows.net",
                name: "catalog-storage-check",
                tags: new string[] { "catalogstorage" });
    }
    if (configuration.GetValue<bool>("AzureServiceBusEnabled"))
    {
        hcBuilder
            .AddAzureServiceBusTopic(
                configuration["EventBusConnection"],
                topicName: "eshop_event_bus",
                name: "catalog-servicebus-check",
                tags: new string[] { "servicebus" });
    }
    else
    {
        hcBuilder
            .AddRabbitMQ(
                $"amqp://{configuration["EventBusConnection"]}",
                name: "catalog-rabbitmqbus-check",
                tags: new string[] { "rabbitmqbus" });
    }

    return services;
}

 

در نهایت، میان افزار HealthCheck را برای گوش دادن به نقطه پایانی “/hc” اضافه کنید:

// HealthCheck middleware
app.UseHealthChecks("/hc", new HealthCheckOptions()
{
    Predicate = _ => true,
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

 

از میکروسرویس های خود پرس و جو کنید تا وضعیت سلامتی آنها را گزارش کنید
هنگامی که بررسی های سلامت را همانطور که در این مقاله توضیح داده شده پیکربندی کرده اید و میکروسرویس را در Docker اجرا می کنید، می توانید مستقیماً از یک مرورگر سالم بودن آن را بررسی کنید. همانطور که در شکل 8-8 نشان داده شده است، باید پورت کانتینر را در میزبان Docker منتشر کنید، بنابراین می توانید از طریق IP میزبان خارجی داکر یا از طریق host.docker.internal به کانتینر دسترسی داشته باشید.

 

 ریزسرویس Catalog.API (که روی پورت 5101 اجرا می‌شود) سالم است و وضعیت HTTP 200 و اطلاعات وضعیت را در JSON برمی‌گرداند. این سرویس همچنین سلامت وابستگی پایگاه داده SQL Server و RabbitMQ خود را بررسی کرد، بنابراین بررسی سلامت خود را سالم گزارش کرد.

 

از سگ های نگهبان استفاده کنید
Watchdog یک سرویس جداگانه است که می‌تواند سلامتی را تماشا کند و سرویس‌ها را بارگذاری کند، و سلامت میکروسرویس‌ها را با پرس و جو در کتابخانه HealthChecks که قبلاً معرفی شد، گزارش کند. این می تواند به جلوگیری از خطاهایی که بر اساس نمای یک سرویس شناسایی نمی شوند کمک کند. Watchdogs همچنین مکان خوبی برای میزبانی کد است که می تواند اقدامات اصلاحی را برای شرایط شناخته شده بدون تعامل کاربر انجام دهد.

نمونه eShopOnContainers حاوی یک صفحه وب است که نمونه گزارش های بررسی سلامت را نمایش می دهد، این ساده ترین نگهبانی است که می توانید داشته باشید زیرا فقط وضعیت میکروسرویس ها و برنامه های کاربردی وب را در eShopOnContainers نشان می دهد. معمولاً یک نگهبان زمانی که وضعیت های ناسالم را تشخیص می دهد اقداماتی را انجام می دهد.

خوشبختانه، AspNetCore.Diagnostics.HealthChecks همچنین بسته NuGet AspNetCore.HealthChecks.UI را ارائه می دهد که می تواند برای نمایش نتایج بررسی سلامت از URI های پیکربندی شده استفاده شود.

 

به طور خلاصه، این سرویس ناظر، نقطه پایانی "/hc" هر میکروسرویس را پرس و جو می کند. این همه بررسی های بهداشتی تعریف شده در آن را انجام می دهد و بسته به همه آن بررسی ها وضعیت سلامت کلی را برمی گرداند. HealthChecksUI با چند ورودی پیکربندی و دو خط کد که باید به Startup.cs سرویس Watchdog اضافه شود، آسان است.

نمونه فایل پیکربندی برای رابط کاربری بررسی سلامت:

// Configuration
{
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "Ordering HTTP Check",
        "Uri": "http://host.docker.internal:5102/hc"
      },
      {
        "Name": "Ordering HTTP Background Check",
        "Uri": "http://host.docker.internal:5111/hc"
      },
      //...
    ]}
}

 

فایل Startup.cs که HealthChecksUI را اضافه می کند:

// Startup.cs from WebStatus(Watch Dog) service
//
public void ConfigureServices(IServiceCollection services)
{
    //…
    // Registers required services for health checks
    services.AddHealthChecksUI();
}
//…
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //…
    app.UseHealthChecksUI(config => config.UIPath = "/hc-ui");
    //…
}

 

بررسی های بهداشتی هنگام استفاده از ارکستر
برای نظارت بر در دسترس بودن میکروسرویس‌های خود، ارکسترهایی مانند Kubernetes و Service Fabric به طور دوره‌ای با ارسال درخواست‌هایی برای آزمایش میکروسرویس‌ها، بررسی‌های سلامتی را انجام می‌دهند. هنگامی که یک ارکستر تشخیص می دهد که یک سرویس/کانتینر ناسالم است، درخواست مسیریابی به آن نمونه را متوقف می کند. همچنین معمولاً یک نمونه جدید از آن ظرف ایجاد می کند.

به عنوان مثال، اکثر ارکسترها می‌توانند از بررسی‌های سلامتی برای مدیریت استقرار بدون توقف استفاده کنند. تنها زمانی که وضعیت سرویس/کانتینر به سالم تغییر کند، ارکستراتور شروع به مسیریابی ترافیک به نمونه‌های سرویس/کانتینر می‌کند.

نظارت بر سلامت به ویژه زمانی مهم است که یک ارکستر برنامه ارتقاء برنامه را انجام دهد. برخی از ارکستراتورها (مانند Azure Service Fabric) خدمات را در مراحل به روز می کنند - برای مثال، ممکن است یک پنجم سطح کلاستر را برای هر ارتقاء برنامه به روز کنند. مجموعه ای از گره هایی که همزمان ارتقا می یابند به عنوان دامنه ارتقاء نامیده می شوند. پس از ارتقاء هر دامنه ارتقاء و در دسترس بودن آن برای کاربران، آن دامنه ارتقاء دهنده باید قبل از اینکه استقرار به دامنه ارتقاء بعدی منتقل شود، بررسی های سلامت را انجام دهد.

یکی دیگر از جنبه های سلامت خدمات، گزارش معیارها از خدمات است. این یک قابلیت پیشرفته از مدل سلامتی برخی ارکسترها مانند Service Fabric است. معیارها هنگام استفاده از یک ارکستر مهم هستند زیرا برای متعادل کردن استفاده از منابع استفاده می شوند. معیارها همچنین می توانند نشانگر سلامت سیستم باشند. برای مثال، ممکن است برنامه‌ای داشته باشید که ریزسرویس‌های زیادی دارد و هر نمونه یک معیار درخواست در ثانیه (RPS) را گزارش می‌کند. اگر یک سرویس از منابع بیشتری (حافظه، پردازنده و غیره) نسبت به سرویس دیگر استفاده می‌کند، ارکستراتور می‌تواند نمونه‌های سرویس را در خوشه جابجا کند تا سعی کند استفاده از منابع را حفظ کند.

توجه داشته باشید که Azure Service Fabric مدل مانیتورینگ سلامت خود را ارائه می‌کند که از بررسی‌های ساده سلامت پیشرفته‌تر است.

 

نظارت پیشرفته: تجسم، تجزیه و تحلیل و هشدارها
بخش پایانی نظارت، تجسم جریان رویداد، گزارش عملکرد سرویس و هشدار در هنگام شناسایی مشکل است. برای این جنبه از نظارت می توانید از راه حل های مختلفی استفاده کنید.

می‌توانید از برنامه‌های سفارشی ساده استفاده کنید که وضعیت خدمات شما را نشان می‌دهند، مانند صفحه سفارشی که هنگام توضیح AspNetCore.Diagnostics.HealthChecks نشان داده شده است. یا می توانید از ابزارهای پیشرفته تری مانند Azure Monitor برای افزایش هشدارها بر اساس جریان رویدادها استفاده کنید.

در نهایت، اگر تمام جریان‌های رویداد را ذخیره می‌کنید، می‌توانید از Microsoft Power BI یا راه‌حل‌های دیگری مانند Kibana یا Splunk برای تجسم داده‌ها استفاده کنید.

  • sahar saha sql
  • ۰
  • ۰

برای مقابله با شکست های جزئی، از یکی از استراتژی هایی که در اینجا توضیح داده شده است استفاده کنید.

از ارتباطات ناهمزمان (به عنوان مثال، ارتباطات مبتنی بر پیام) در میکروسرویس های داخلی استفاده کنید. بسیار توصیه می‌شود که زنجیره‌های طولانی تماس‌های HTTP همزمان در میکروسرویس‌های داخلی ایجاد نکنید، زیرا این طراحی نادرست در نهایت به دلیل اصلی قطعی‌های بد می‌شود. برعکس، به‌جز ارتباطات فرانت‌اند بین برنامه‌های سرویس گیرنده و سطح اول میکروسرویس‌ها یا دروازه‌های API ریز، توصیه می‌شود پس از گذشتن از چرخه درخواست/پاسخ اولیه، فقط از ارتباطات ناهمزمان (مبتنی بر پیام) استفاده کنید. میکروسرویس های داخلی سازگاری نهایی و معماری های رویداد محور به به حداقل رساندن اثرات امواج کمک می کند. این رویکردها سطح بالاتری از استقلال میکروسرویس را اعمال می‌کنند و بنابراین از مشکلی که در اینجا ذکر شد جلوگیری می‌کنند.

از تلاش های مجدد با عقب نشینی نمایی استفاده کنید. این تکنیک به جلوگیری از خرابی های کوتاه و متناوب با انجام چندین بار تماس مجدد کمک می کند، در صورتی که سرویس فقط برای مدت کوتاهی در دسترس نبود. این ممکن است به دلیل مشکلات شبکه متناوب یا زمانی که یک میکروسرویس/کانتینر به گره دیگری در یک خوشه منتقل می‌شود رخ دهد. با این حال، اگر این تلاش‌های مجدد به‌درستی با کلیدهای مدار طراحی نشده باشند، می‌تواند اثرات امواج را تشدید کند و در نهایت حتی باعث انکار سرویس (DoS) شود.

روی زمان‌بندی شبکه کار کنید. به طور کلی، کلاینت‌ها باید طوری طراحی شوند که به‌طور نامحدود مسدود نشوند و همیشه در زمان انتظار برای پاسخ از زمان‌بندی استفاده کنند. استفاده از تایم اوت تضمین می کند که منابع هرگز به طور نامحدود بسته نمی شوند.

از الگوی Circuit Breaker استفاده کنید. در این رویکرد، فرآیند مشتری تعداد درخواست های ناموفق را ردیابی می کند. اگر میزان خطا از حد تنظیم شده بیشتر شود، یک "مدار شکن" فعال می شود تا تلاش های بعدی بلافاصله با شکست مواجه شوند. (اگر تعداد زیادی از درخواست‌ها با شکست مواجه شوند، نشان می‌دهد که سرویس در دسترس نیست و ارسال درخواست‌ها بی‌معنی است.) پس از یک بازه زمانی، مشتری باید دوباره تلاش کند و در صورت موفقیت‌آمیز بودن درخواست‌های جدید، قطع کننده مدار را ببندد.

موارد جایگزین ارائه کنید. در این رویکرد، فرآیند کلاینت منطق بازگشتی را زمانی که یک درخواست با شکست مواجه می‌شود، انجام می‌دهد، مانند برگرداندن داده‌های کش یا یک مقدار پیش‌فرض. این یک رویکرد مناسب برای پرس و جو است و برای به روز رسانی یا دستورات پیچیده تر است.

تعداد درخواست های در صف را محدود کنید. مشتریان همچنین باید برای تعداد درخواست‌های معوقی که یک میکروسرویس مشتری می‌تواند به یک سرویس خاص ارسال کند، یک حد بالایی اعمال کنند. اگر به حد مجاز رسیده باشد، احتمالاً درخواست های اضافی بیهوده است و این تلاش ها باید فوراً با شکست مواجه شوند. از نظر پیاده سازی، سیاست جداسازی دیواره Polly را می توان برای برآورده کردن این نیاز مورد استفاده قرار داد. این رویکرد اساساً یک دریچه گاز موازی سازی با SemaphoreSlim به عنوان پیاده سازی است. همچنین اجازه یک "صف" در خارج از دیوار را می دهد. حتی قبل از اجرا نیز می‌توانید بار اضافی را به طور فعال دفع کنید (به عنوان مثال، زیرا ظرفیت کامل در نظر گرفته می‌شود). این باعث می شود که پاسخ آن به سناریوهای خرابی خاص سریعتر از یک قطع کننده مدار باشد، زیرا مدار شکن منتظر خرابی ها است. شیء BulkheadPolicy در Polly نشان می‌دهد که قسمت و صف چقدر پر است، و رویدادهایی را در سرریز ارائه می‌دهد، بنابراین می‌توان از آن برای ایجاد مقیاس افقی خودکار استفاده کرد.

  • sahar saha sql
  • ۰
  • ۰

در سیستم‌های توزیع‌شده مانند برنامه‌های کاربردی مبتنی بر میکروسرویس، خطر خرابی جزئی همیشه وجود دارد. به عنوان مثال، یک میکروسرویس/کانتینر ممکن است از کار بیفتد یا برای مدت کوتاهی در دسترس نباشد، یا یک ماشین مجازی یا سرور ممکن است از کار بیفتد. از آنجایی که مشتریان و خدمات فرآیندهای جداگانه ای هستند، یک سرویس ممکن است نتواند به موقع به درخواست مشتری پاسخ دهد. ممکن است این سرویس بیش از حد بارگیری شده باشد و به درخواست ها بسیار کند پاسخ دهد یا به دلیل مشکلات شبکه برای مدت کوتاهی قابل دسترسی نباشد.

برای مثال، صفحه جزئیات سفارش را از برنامه نمونه eShopOnContainers در نظر بگیرید. اگر زمانی که کاربر سعی می‌کند سفارشی را ارسال کند، میکروسرویس سفارش‌دهنده پاسخگو نباشد، اجرای نامناسب فرآیند مشتری (برنامه وب MVC) - برای مثال، اگر کد مشتری از RPCهای همزمان بدون مهلت زمانی استفاده کند - رشته‌های در انتظار را به طور نامحدود مسدود می‌کند. برای یک پاسخ علاوه بر ایجاد یک تجربه کاربری بد، هر انتظاری که پاسخگو نیست، یک رشته را مصرف یا مسدود می کند، و رشته ها در برنامه های بسیار مقیاس پذیر بسیار ارزشمند هستند. اگر تعداد موضوعات مسدود شده زیادی وجود داشته باشد، در نهایت زمان اجرای برنامه ممکن است بدون رشته تمام شود. در آن صورت، برنامه به جای اینکه تا حدی پاسخگو نباشد، می تواند به صورت سراسری پاسخگو نباشد.

در یک برنامه کاربردی بزرگ مبتنی بر میکروسرویس، هر گونه خرابی جزئی را می توان تقویت کرد، به خصوص اگر بیشتر تعامل میکروسرویس های داخلی بر اساس تماس های HTTP همزمان (که یک ضد الگو در نظر گرفته می شود) باشد. به سیستمی فکر کنید که روزانه میلیون ها تماس دریافتی دریافت می کند. اگر سیستم شما طراحی بدی دارد که مبتنی بر زنجیره‌های طولانی تماس‌های HTTP همزمان است، این تماس‌های ورودی ممکن است منجر به میلیون‌ها تماس خروجی بیشتر شود (فرض کنید نسبت 1:4) به ده‌ها میکروسرویس داخلی به عنوان وابستگی همزمان.

خرابی متناوب در یک سیستم توزیع شده و مبتنی بر ابر تضمین شده است، حتی اگر هر وابستگی به خودی خود در دسترس بودن عالی باشد. این یک واقعیت است که باید در نظر بگیرید.

اگر تکنیک هایی را برای اطمینان از تحمل خطا طراحی و اجرا نکنید، حتی خرابی های کوچک نیز می توانند تقویت شوند. به عنوان مثال، 50 وابستگی هر کدام با 99.99٪ در دسترس بودن، به دلیل این اثر موج دار، منجر به چندین ساعت توقف در هر ماه می شود. هنگامی که یک وابستگی میکروسرویس در حین رسیدگی به حجم بالایی از درخواست‌ها با شکست مواجه می‌شود، این شکست می‌تواند به سرعت تمام رشته‌های درخواست موجود در هر سرویس را اشباع کند و کل برنامه را از کار بیندازد.

 

برای به حداقل رساندن این مشکل، در بخش ادغام میکروسرویس ناهمزمان، استقلال میکروسرویس را اعمال می‌کند، این راهنما شما را تشویق می‌کند که از ارتباطات ناهمزمان در میان میکروسرویس‌های داخلی استفاده کنید.

علاوه بر این، ضروری است که میکروسرویس‌ها و برنامه‌های سرویس گیرنده خود را طوری طراحی کنید که خرابی‌های جزئی را مدیریت کنید—یعنی ساخت میکروسرویس‌ها و برنامه‌های مشتری انعطاف‌پذیر.

  • sahar saha sql
  • ۰
  • ۰

میکروسرویس و برنامه‌های مبتنی بر ابر شما باید شکست‌های جزئی را که مطمئناً در نهایت اتفاق می‌افتند، بپذیرند. شما باید برنامه خود را طوری طراحی کنید که در برابر آن شکست های جزئی مقاوم باشد.

تاب آوری توانایی بازیابی از شکست ها و ادامه عملکرد است. این در مورد اجتناب از شکست نیست، بلکه پذیرش این واقعیت است که خرابی ها اتفاق می افتد و به آنها پاسخ می دهیم به گونه ای که از خرابی یا از دست دادن داده ها جلوگیری می کند. هدف انعطاف‌پذیری این است که برنامه پس از شکست به حالت کاملاً کارآمد برگردد.

طراحی و استقرار یک اپلیکیشن مبتنی بر میکروسرویس به اندازه کافی چالش برانگیز است. اما شما همچنین باید برنامه خود را در محیطی اجرا کنید که نوعی شکست قطعی است. بنابراین، برنامه شما باید انعطاف پذیر باشد. باید طوری طراحی شود که با خرابی های جزئی، مانند قطع شدن شبکه یا خرابی گره ها یا ماشین های مجازی در فضای ابری مقابله کند. حتی میکروسرویس ها (کانتینرها) که به یک گره متفاوت در یک خوشه منتقل می شوند می توانند باعث خرابی های کوتاه متناوب در برنامه شوند.

بسیاری از مؤلفه های فردی برنامه شما باید ویژگی های نظارت بر سلامت را نیز در خود داشته باشند. با پیروی از دستورالعمل‌های این فصل، می‌توانید برنامه‌ای ایجاد کنید که به‌رغم خرابی‌های گذرا یا سکسکه‌های معمولی که در استقرارهای پیچیده و مبتنی بر ابر رخ می‌دهد، به‌راحتی کار کند.

 

  مهم

eShopOnContainer تا زمان انتشار 3.0.0 از کتابخانه Polly برای پیاده سازی انعطاف پذیری با استفاده از Typed Clients استفاده می کرد.

با شروع نسخه 3.0.0، انعطاف‌پذیری تماس‌های HTTP با استفاده از یک شبکه Linkerd پیاده‌سازی می‌شود، که تلاش‌های مجدد را به صورت شفاف و قابل تنظیم، در یک خوشه Kubernetes، بدون نیاز به رسیدگی به این نگرانی‌ها در کد، انجام می‌دهد.

کتابخانه Polly همچنان برای افزودن انعطاف پذیری به اتصالات پایگاه داده، به ویژه هنگام راه اندازی سرویس ها استفاده می شود.

 

  هشدار

تمام نمونه کدها و تصاویر موجود در این بخش قبل از استفاده از Linkerd معتبر بودند و برای نشان دادن کد واقعی فعلی به روز نمی شوند. بنابراین آنها در زمینه این بخش معنا پیدا می کنند.

  • sahar saha sql
  • ۰
  • ۰

اصطلاح محاسبه به مدل میزبانی برای منابع محاسباتی که برنامه شما روی آن اجرا می شود اشاره دارد. برای معماری میکروسرویس، دو رویکرد به ویژه محبوب هستند:

  • ارکستراتور خدماتی که سرویس های در حال اجرا بر روی گره های اختصاصی (VM) را مدیریت می کند.
  • یک معماری بدون سرور با استفاده از توابع به عنوان یک سرویس (FaaS).

 

در حالی که اینها تنها گزینه ها نیستند، اما هر دو رویکردهای اثبات شده برای ساخت میکروسرویس ها هستند. یک برنامه کاربردی ممکن است شامل هر دو رویکرد باشد.

 

ارکسترهای خدمات
یک ارکستر وظایف مربوط به استقرار و مدیریت مجموعه ای از خدمات را انجام می دهد. این وظایف شامل قرار دادن سرویس‌ها بر روی گره‌ها، نظارت بر سلامت سرویس‌ها، راه‌اندازی مجدد سرویس‌های ناسالم، متعادل‌سازی بار ترافیک شبکه در بین نمونه‌های سرویس، کشف سرویس، مقیاس‌بندی تعداد نمونه‌های یک سرویس، و اعمال به‌روزرسانی‌های پیکربندی است. ارکسترهای معروف عبارتند از Kubernetes، Service Fabric، DC/OS، و Docker Swarm.

 

در پلتفرم Azure، گزینه های زیر را در نظر بگیرید:

  • سرویس Azure Kubernetes (AKS) یک سرویس Kubernetes مدیریت شده است. AKS Kubernetes را فراهم می کند و نقاط پایانی Kubernetes API را در معرض دید قرار می دهد، اما صفحه کنترل Kubernetes را میزبانی و مدیریت می کند، ارتقاهای خودکار، وصله خودکار، مقیاس خودکار و سایر وظایف مدیریتی را انجام می دهد. شما می توانید AKS را به عنوان "API های Kubernetes به عنوان یک سرویس" در نظر بگیرید.
  • Azure Container Apps یک سرویس مدیریت شده است که بر روی Kubernetes ساخته شده است که پیچیدگی های هماهنگ سازی کانتینر و سایر وظایف مدیریتی را خلاصه می کند. Container Apps استقرار و مدیریت برنامه های کاربردی و میکروسرویس های کانتینری را در یک محیط بدون سرور ساده می کند و در عین حال ویژگی های Kubernetes را ارائه می دهد.
  • Service Fabric یک پلت فرم سیستم های توزیع شده برای بسته بندی، استقرار و مدیریت میکروسرویس ها است. میکروسرویس‌ها را می‌توان به‌عنوان کانتینر، به‌عنوان فایل‌های اجرایی باینری یا به‌عنوان خدمات قابل اطمینان در Service Fabric مستقر کرد. با استفاده از مدل برنامه نویسی Reliable Services، سرویس ها می توانند مستقیماً از API های برنامه نویسی Service Fabric برای پرس و جو از سیستم، گزارش سلامت، دریافت اعلان های مربوط به پیکربندی و تغییرات کد و کشف سایر خدمات استفاده کنند. یک تمایز کلیدی با Service Fabric تمرکز قوی آن بر ایجاد سرویس‌های دولتی با استفاده از مجموعه‌های قابل اعتماد است.
  • گزینه های دیگری مانند Docker Enterprise Edition و Mesosphere DC/OS می توانند در محیط IaaS در Azure اجرا شوند. شما می توانید قالب های استقرار را در Azure Marketplace بیابید.

 

ظروف
گاهی اوقات مردم در مورد کانتینرها و میکروسرویس ها طوری صحبت می کنند که انگار همان چیز هستند. در حالی که این درست نیست - شما برای ساخت میکروسرویس به کانتینر نیاز ندارید - کانتینرها دارای مزایایی هستند که به ویژه به میکروسرویس ها مربوط می شود، مانند:

  • قابل حمل بودن یک Container Image یک بسته مستقل است که بدون نیاز به نصب کتابخانه‌ها یا وابستگی‌های دیگر اجرا می‌شود. این امر به کارگیری آنها را آسان می کند. کانتینرها را می‌توان به سرعت راه‌اندازی و متوقف کرد، بنابراین می‌توانید نمونه‌های جدیدی را برای مدیریت بار بیشتر یا بازیابی از خرابی گره‌ها بچرخانید.
  • تراکم. کانتینرها در مقایسه با اجرای یک ماشین مجازی سبک وزن هستند، زیرا آنها منابع سیستم عامل را به اشتراک می گذارند. این امکان بسته بندی چندین کانتینر را در یک گره واحد فراهم می کند، که به ویژه زمانی مفید است که برنامه شامل بسیاری از خدمات کوچک باشد.
  • جداسازی منابع شما می توانید مقدار حافظه و CPU را که برای یک کانتینر در دسترس است محدود کنید، که می تواند به اطمینان حاصل شود که یک فرآیند فرار منابع میزبان را تمام نمی کند.

 

بدون سرور (به عنوان یک سرویس عمل می کند)
با معماری بدون سرور، شما ماشین های مجازی یا زیرساخت شبکه مجازی را مدیریت نمی کنید. در عوض، شما کد را مستقر می‌کنید و سرویس میزبانی، قرار دادن آن کد را روی یک ماشین مجازی و اجرای آن انجام می‌دهد. این رویکرد به نفع توابع دانه‌ای کوچک است که با استفاده از محرک‌های مبتنی بر رویداد هماهنگ می‌شوند. برای مثال، پیامی که در صف قرار می‌گیرد، ممکن است تابعی را راه‌اندازی کند که از صف می‌خواند و پیام را پردازش می‌کند.

Azure Functions یک سرویس محاسباتی بدون سرور است که از راه‌اندازهای عملکرد مختلف، از جمله درخواست‌های HTTP، صف‌های سرویس اتوبوس و رویدادهای Event Hubs پشتیبانی می‌کند. برای فهرست کامل، به مفاهیم محرک‌ها و اتصالات توابع Azure مراجعه کنید. همچنین Azure Event Grid را در نظر بگیرید، که یک سرویس مسیریابی رویداد مدیریت شده در Azure است.

 

ارکستراتور یا بدون سرور؟
در اینجا چند فاکتور برای انتخاب بین رویکرد ارکستراتور و رویکرد بدون سرور وجود دارد.

قابلیت مدیریت یک برنامه بدون سرور به راحتی قابل مدیریت است، زیرا پلتفرم تمام منابع محاسباتی را برای شما مدیریت می کند. در حالی که یک ارکستراتور برخی از جنبه‌های مدیریت و پیکربندی یک خوشه را انتزاعی می‌کند، VMهای زیربنایی را کاملاً پنهان نمی‌کند. با یک ارکستراتور، باید به مسائلی مانند تعادل بار، استفاده از CPU و حافظه و شبکه فکر کنید.

انعطاف پذیری و کنترل. یک ارکستراتور کنترل زیادی بر پیکربندی و مدیریت خدمات و خوشه به شما می دهد. مبادله پیچیدگی اضافی است. با معماری بدون سرور، شما درجاتی از کنترل را رها می کنید زیرا این جزئیات انتزاعی هستند.

قابل حمل بودن همه ارکسترهای لیست شده در اینجا (Kubernetes، DC/OS، Docker Swarm و Service Fabric) می‌توانند در محل یا در چندین ابر عمومی اجرا شوند.

یکپارچه سازی برنامه به دلیل نیاز به هماهنگی، استقرار و مدیریت بسیاری از عملکردهای مستقل کوچک، ساختن یک برنامه پیچیده با استفاده از معماری بدون سرور می تواند چالش برانگیز باشد. یکی از گزینه ها در Azure استفاده از Azure Logic Apps برای هماهنگ کردن مجموعه ای از توابع Azure است.

هزینه. با یک ارکستراتور، شما برای ماشین های مجازی که در کلاستر اجرا می شوند، پرداخت می کنید. با یک برنامه بدون سرور، شما فقط برای منابع محاسباتی واقعی مصرف شده پرداخت می کنید. در هر دو مورد، باید هزینه هر گونه خدمات اضافی مانند ذخیره سازی، پایگاه داده و خدمات پیام رسانی را در نظر بگیرید.

مقیاس پذیری. Azure Functions به طور خودکار برای پاسخگویی به تقاضا، بر اساس تعداد رویدادهای دریافتی، مقیاس می‌شود. با یک ارکستراتور، می توانید با افزایش تعداد نمونه های سرویس در حال اجرا در خوشه، مقیاس را کاهش دهید. همچنین می‌توانید با افزودن ماشین‌های مجازی اضافی به خوشه مقیاس‌بندی کنید.

پیاده سازی مرجع ما در درجه اول از Kubernetes استفاده می کند، اما ما از توابع Azure برای یک سرویس، یعنی سرویس تاریخچه تحویل، استفاده کردیم. Azure Functions برای این سرویس خاص مناسب بود، زیرا حجم کاری رویداد محور است. با استفاده از تریگر Event Hubs برای فراخوانی عملکرد، سرویس به حداقل مقدار کد نیاز داشت. همچنین، سرویس تاریخچه تحویل بخشی از گردش کار اصلی نیست، بنابراین اجرای آن در خارج از خوشه Kubernetes بر تأخیر انتها به انتها عملیات آغاز شده توسط کاربر تأثیر نمی گذارد.

 

  • sahar saha sql
  • ۰
  • ۰

این ماژول برای تکمیل نیاز به جعبه شنی دارد. یک سندباکس به شما امکان دسترسی به منابع رایگان را می دهد. هزینه اشتراک شخصی شما پرداخت نمی شود. سندباکس فقط برای تکمیل آموزش در Microsoft Learn می‌تواند استفاده شود. استفاده به هر دلیل دیگری ممنوع است و ممکن است منجر به از دست دادن دائمی دسترسی به جعبه شنی شود.
مایکروسافت این تجربه آزمایشگاهی و محتوای مرتبط را برای اهداف آموزشی ارائه می دهد. تمام اطلاعات ارائه شده متعلق به مایکروسافت است و صرفاً برای یادگیری محصولات و خدمات تحت پوشش در این ماژول Microsoft Learn در نظر گرفته شده است.

اکنون که Fabrikam کاربرد آنها را تجزیه و تحلیل کرده است، آنها آماده هستند تا فرآیند بازسازی را آغاز کنند تا خدمات را از معماری یکپارچه خود به میکروسرویس ها منتقل کنند. بیایید برنامه را تغییر دهیم تا سرویس پردازش بسته به یک میکروسرویس منتقل شود.

 

برنامه را دوباره فاکتور کنید
قبل از استقرار برنامه به روز شده، بیایید نگاهی به نحوه به روز رسانی آن بیندازیم. اپلیکیشن یکپارچه سرویسی برای پردازش بسته ها دارد، PackageProcessor.cs. پس از تجزیه و تحلیل عملکرد برنامه، این سرویس به عنوان یک گلوگاه عملکرد شناسایی شد. همانطور که مشتریان تقاضا برای تحویل پهپادها را افزایش می دهند، این سرویس در حالی که برنامه ریزی و تدارکات برای تحویل هواپیماهای بدون سرنشین را انجام می دهد، به شدت بارگیری می شود. این سرویس به طور کامل توسط یک تیم اختصاصی مدیریت می شود. انتقال این سرویس به یک میکروسرویس به عملکرد کمک می کند و چابکی توسعه را بهبود می بخشد.

 

تحویل پهپاد قبل
عملکرد اصلی پردازش بسته توسط کلاس PackageProcessor در فایل PackageProcessor.cs مدیریت می شود. در این مثال، کارهایی را انجام می دهد که نیاز به منابع زیادی دارند. یک سناریوی واقعی ممکن است شامل محاسبه زمان تحویل و مسیرهای تحویل و به‌روزرسانی منابع داده با این اطلاعات باشد.

public class PackageProcessor : IPackageProcessor
    {
        public Task<PackageGen> CreatePackageAsync(PackageInfo packageInfo)
        {
            //Uses common data store e.g. SQL Azure tables
            Utility.DoWork(100);
            return Task.FromResult(new PackageGen { Id = packageInfo.PackageId });
        }
    }

 

میکروسرویس بر روی یک تابع Azure مستقر خواهد شد. کد آن را می توان در PackageServiceFunction.cs یافت و حاوی کد زیر است.

 

public static class PackageServiceFunction
    {
        [FunctionName("PackageServiceFunction")]
        public static Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "put", Route = "packages/{id}")] HttpRequest req,
            string id, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            //Uses common data store e.g. SQL Azure tables
            Utility.DoWork(100);
            return Task.FromResult((IActionResult)new CreatedResult("http://example.com", null));
        }
    }

 

با قرار دادن این کد در توابع Azure، این سرویس می تواند به طور مستقل با افزایش بار کاربر مقیاس شود. می‌توانید سرویس‌های کد برنامه باقیمانده را برای بقیه برنامه بهینه نگه دارید. با ورود درخواست های بیشتر برای تحویل پهپادها به سیستم، خدمات بسته کاهش می یابد.

حالا بیایید برنامه را مجدداً مستقر کنیم. ابتدا، ما سرویس بازسازی شده خود را بر روی توابع Azure مستقر می کنیم. سپس، برنامه refactored را در App Service مستقر می کنیم و آن را به تابع اشاره می کنیم.

 

برنامه کاربردی را اجرا کنید

  • برای تنظیم متغیرهای محیطی که به سرویس‌های ما اشاره می‌کنند، دستور زیر را اجرا کنید.

APPSERVICENAME="$(az webapp list \
                    --resource-group [sandbox resource group] \
                    --query '[].name' \
                    --output tsv)"
FUNCTIONAPPNAME="$(az functionapp list \
                    --resource-group [sandbox resource group] \
                    --query '[].name' \
                    --output tsv)"

 

  • بیایید کد برنامه کاربردی را برای برنامه کاربردی بسازیم و فشرده کنیم.

cd ~/mslearn-microservices-architecture/src/after
dotnet build ./PackageService/PackageService.csproj -c Release
cd PackageService/bin/Release/netcoreapp2.2
zip -r PackageService.zip .

 

  • دستور زیر را اجرا کنید تا کد را به برنامه تابع فشار دهید.

az functionapp deployment source config-zip \
    --resource-group [sandbox resource group] \
    --name $FUNCTIONAPPNAME \
    --src PackageService.zip

 

برنامه به روز رسانی Drone Delivery را مستقر کنید

اکنون که سرویس ما روی توابع Azure اجرا می شود، باید برنامه پهپاد خود را به آن برنامه کاربردی اشاره کنیم.

  • ابتدا باید کد دسترسی برنامه تابع را دریافت کنیم تا بتوانیم با موفقیت آن را از برنامه فراخوانی کنیم. برای بازیابی این کد دستورات زیر را اجرا کنید. نام و کد برنامه عملکرد را برای استفاده در مراحل بعدی نمایش می دهید.

 

RESOURCEGROUPID=$(az group show \
                    --resource-group [sandbox resource group] \
                    --query id \
                    --output tsv)
FUNCTIONCODE=$(az rest \
                    --method post \
                    --query default \
                    --output tsv \
                    --uri "https://management.azure.com$RESOURCEGROUPID/providers/Microsoft.Web/sites/$FUNCTIONAPPNAME/functions/PackageServiceFunction/listKeys?api-version=2018-02-01")
echo "FunctionName - $FUNCTIONAPPNAME"
echo "FunctionCode - $FUNCTIONCODE"

 

  • در Azure Cloud Shell، دستورات زیر را برای باز کردن appsettings.json در ویرایشگر کد اجرا کنید.

 

cd ~/mslearn-microservices-architecture/src/after
code ./DroneDelivery-after/appsettings.json

 

  • در ویرایشگر کد، مقادیر PackageServiceUri و PackageServiceFunctionCode را جایگزین کنید. در PackageServiceUri، <FunctionName> را با نام برنامه تابع خود جایگزین کنید.

در PackageServiceFunctionCode، <FunctionCode> را با کد تابعی که بازیابی کردید جایگزین کنید. فایل appsettings.json شما باید شبیه به این باشد:

 

{
    "Logging": {
    "LogLevel": {
        "Default": "Warning"
    }
    },
    "AllowedHosts": "*",
    "PackageServiceUri": "https://packageservicefunction-abc.azurewebsites.net/api/packages/",
    "PackageServiceFunctionCode": "SvrbiyhjXJUdTPXrkcUtY6bQaUf7OXQjWvnM0Gq63hFUhbH2vn6qYA=="
}

 

  • برای ذخیره فایل Ctrl+S و سپس Ctrl+Q را فشار دهید تا ویرایشگر کد بسته شود.
  • دستور زیر را برای استقرار برنامه به روز شده در App Service اجرا کنید.

zip -r DroneDelivery-after.zip . -x \*/obj/\* \*/bin/\*
az webapp deployment source config-zip \
    --resource-group [sandbox resource group] \
    --name $APPSERVICENAME \
    --src DroneDelivery-after.zip

 

  • با باز استقرار سایت، صفحه خود را رفرش کنید و باید ببینید که به روز شده است.

 

عملکرد معماری جدید را تست کنید
اکنون که سرویس محدود به منابع را به یک میکروسرویس که روی توابع Azure اجرا می‌شود، منتقل کرده‌ایم، بیایید ببینیم این تغییر چگونه بر عملکرد برنامه تأثیر می‌گذارد.

در صفحه اصلی وب سایت خود، Send Requests را انتخاب کنید. این اقدام درخواست‌هایی را از برنامه یکپارچه شما به میکروسرویسی که روی یک تابع Azure اجرا می‌شود ارسال می‌کند.

اولین تلاش ممکن است نتایج مشابهی را برای کاربرد یکپارچه ارائه دهد. صفحه را بازخوانی کنید و در صورت درخواست دوباره درخواست را ارسال کنید. این مرحله را چندین بار انجام دهید و در عرض 1 ثانیه 100 پیام ارسال می شود.

هنگام راه اندازی برنامه عملکرد، تلاش اولیه کندتر بود. پس از راه اندازی و اجرا، زمان پاسخ به طور قابل توجهی بهتر از زمانی بود که این کد در معماری یکپارچه اجرا می شد.

این قطعه از معماری اکنون می تواند تقریباً بی نهایت بزرگ شود در حالی که هنوز همان عملکرد را ارائه می دهد. با انتقال این کد برنامه به یک میکروسرویس، عملکرد را 5 تا 10 برابر بهبود بخشیده ایم. از آنجایی که فابریکام یک تیم توسعه اختصاصی برای این سرویس دارد، آنها می توانند روی این میکروسرویس نیز تکرار کنند و به مزایای افزایش چابکی و انتشار ویژگی ها پی ببرند.

 

 

  • sahar saha sql