Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

O le logging o se meafaigaluega taua tele mo le atinaʻeina, ae pe a fatuina ni faʻasalalauga tufatufaina, e avea ma maʻa e manaʻomia ona tuʻu saʻo i le faavae o lau talosaga, a leai o le lavelave o le atinaʻeina o microservices o le a vave ona afaina.

.Net Core 3 ua faʻaopoopoina se mea sili mafai ona fa'asalalauina fa'amaopoopo fa'asalalauga i ulutala HTTP, o lea afai o au talosaga e faʻaoga saʻo HTTP valaau mo fesoʻotaʻiga vaʻavaʻai, ona mafai lea ona e faʻaogaina lenei gaioiga i fafo atu o le pusa. Ae peitaʻi, afai o lau faʻataʻitaʻiga pito i tua e aofia ai fegalegaleaiga e ala i se fefaʻatauaʻiga feʻau (RabbitMQ, Kafka, ma isi), ona e manaʻomia pea ona e popole e uiga i le pasiina o le fesoʻotaʻiga e ala i nei feʻau oe lava ia.

I totonu o lenei tusiga o le a matou faia se talosaga web-api faigofie ma faʻapipiʻi faʻamaumauga, lea o le a

  • fa'atumauina le feso'ota'iga pito i tua i le va o ogalaau o auaunaga tuto'atasi ina ia faigofie ona e va'ai i gaioiga uma na mafua mai i se talosaga patino mai le kalani.

  • ia i ai se nofoaga e tasi e ulufale ai ma auʻiliʻiliga talafeagai, ina ia mafai e le Lagolago ona faʻaogaina le meafaigaluega faʻapipiʻi, lea e mafai ona faʻaaogaina ai fesili e pei o le "Na ou maua se mea sese i le talosaga ma se ID talosaga ma faapena"

Muamua, e manaʻomia ona tatou filifili i se tagata e tuʻuina atu laʻau mo la tatou talosaga. O le manaʻoga autu mo le faʻapipiʻiina o faʻaonaponei o le fausaga, i.e. e le tatau ona tatou galulue i feau tusitusia mafolafola, ae o mea faitino. Faʻafetai i ia ogalaau, e faigofie ona tatou fausia ni manatu oa tatou feʻau mai vaaiga eseese ma faʻatautaia auʻiliʻiliga.

Mo la matou talosaga o le a matou faʻaogaina le Serilog package, lea e sili ona lelei le lagolago mo le faʻatulagaina o faʻamaumauga ma se faiga faʻaopoopo faʻaopoopo. O le a ou misia laasaga autu o le setiina (e mafai ona e mauaina se numera tele o tala i luga o lenei autu) ma faia le manatu e faapea.

  • Serilog ua uma ona fa'apipi'i ma o le fa'amaufa'ailoga e le mafai ona tu'uina atu mo lau tu'uina fa'alagolago

  • o lona fa'atulagaina e aofia ai le fa'atamaoaigaina o fe'au fa'atasi ai ma uiga fa'asinomaga (Enrich.FromLogContext)

O le isi la'asaga o le filifili lea po'o fea le fa'aputuga o le fa'aputuina o ogalaau e lafo ai fe'au mai Serilog i. Masalo o le avanoa sili ona taatele avanoa avanoa i aso nei o le ELK stack (Elasticsearch, Logstash ma Kibana), o lea seʻi o tatou ave. Ina ia faia lenei mea, o le a matou faʻaaogaina le ofo mai Logz.IO - pe a uma ona lesitala mo se fuafuaga e leai se totogi, o loʻo ia i matou le malosi uma o le Lucene search engine i o matou lima.

Pau lava le mea e tatau ona matou faia o le faʻaopoopoina o le afifi i la matou poloketi Serilog.Sinks.Logzio

Install-Package Serilog.Sinks.Logzio

Ma fa'aopoopo le fa'atamaoaiga talafeagai i le fa'atulagaina o la tatou logger, fafaga i se fa'ailoga avanoa

LoggerConfiguration loggerConfig = new LoggerConfiguration();
loggerConfig.WriteTo.Logzio(secrets.LogzioToken, 10, TimeSpan.FromSeconds(10), null, LogEventLevel.Debug);

E ala i le faʻalauiloaina o le talosaga, o le a mafai ona matou matauina a matou feʻau e le gata i le faʻamafanafanaga, ae faʻapea foi i Kibana.

Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

Faʻaaliga

Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

I totonu o se auaunaga-ituaiga talosaga, e mafai ona tatou vaʻaia ni fesoʻotaʻiga autu se lua mo ana fegalegaleaiga ma le lalolagi i fafo, seʻi o tatou faʻailogaina i latou e tuʻu saʻo ma faʻalava. Ole feso'ota'iga tu'usa'o ole API i luga ole laiga lea e o'o mai ai vala'au mai le talosaga a le kalani. Fa'asaga i luga ole fe'au fefa'ataua'iga e fa'aoga e fa'afesuia'i fa'amatalaga ma isi au'aunaga i totonu.

Se'i o tatou iloiloina la'asaga o le fa'aofiina o feso'ota'iga i luga o feso'ota'iga ta'itasi.

Fa'atasi i talosaga HTTP

Ina ia maua le tele o faʻamatalaga e mafai, matou te manaʻomia le faʻatupuina o se faʻamatalaga faʻamaonia e latalata i le amataga o le gaioiga, i.e. i luga o le faitotoa po'o sa'o i luga ole kalani (telefoni po'o le upega tafailagi). Talu ai o aso nei o loʻo matou feagai ma se talosaga pito i tua, o le a matou faʻaalia i luga o le manaʻoga mo le faʻauluuluga "X-Correlation-ID" i talosaga uma ile API web.

Fa'aopoopoina o se afifi CorrelationID, o lana galuega o le ave lea o le tau mai le ulutala tatou te manaʻomia

Install-Package CorrelationID

Se'i o tatou fa'aopoopoina ile laina ole faiga ole talosaga

public class Startup
{
    public void Configure(IApplicationBuilder application)
    {
        application
	    .UseCorrelationId(new CorrelationIdOptions
        {
            Header = "X-Correlation-ID",
            IncludeInResponse = false,
            UpdateTraceIdentifier = false,
            UseGuidForCorrelationId = false
        });
    }
}

O lenei o le a matou faʻaaogaina e fai ai se faʻamamaga faigofie:

public sealed class ApiRequestFilter : ActionFilterAttribute
{
    public ApiRequestFilter(IApiRequestTracker apiRequestTracker, ICorrelationContextAccessor correlationContextAccessor)
    {
        _correlationContextAccessor = correlationContextAccessor ?? throw new ArgumentNullException(nameof(correlationContextAccessor));
    }
    
    private readonly ICorrelationContextAccessor _correlationContextAccessor;
    
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        if (!Guid.TryParse(_correlationContextAccessor.CorrelationContext.CorrelationId, out Guid correlationId))
        {
            context.Result = new BadRequestResult();
            return;
        }
    
        await next.Invoke();
    }
    
    public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        await next.Invoke();
    }
}

Ma faʻaopoopo i le pule

[Route("[controller]")]
[ApiController]
[ServiceFilter(typeof(ApiRequestFilter))]
public class CarsController : ControllerBase
{

}

O se taunuuga, o le a faʻaalia e le pule le 400 Lega le talosaga mo talosaga uma e aunoa ma se ulutala ma le faʻamatalaga talafeagai.

A maeʻa ona matou mauaina se faʻamatalaga mai le kalani, e tatau ona matou faʻaopoopoina i le faʻasologa o tala, o le a matou faia se faʻailoga faʻapipiʻi mo lenei:

public class CorrelationIdContextLogger
{
    public CorrelationIdContextLogger(RequestDelegate next)
    {
        _next = next ?? throw new ArgumentNullException(nameof(next));
    }
    
    readonly RequestDelegate _next;
    
    public async Task InvokeAsync(HttpContext httpContext, ILogger<CorrelationIdContextLogger> logger, ICorrelationContextAccessor correlationContextAccessor)
    {
        if (Guid.TryParse(correlationContextAccessor.CorrelationContext.CorrelationId, out Guid correlationId))
        {
            using (logger.BeginScopeWith(("CorrelationId", correlationId)))
            {
                await _next(context);
            }
        }
        else
        {
            await _next(context);
        }
    }
}

I la matou talosaga, matou te faʻaogaina le ILogger masani mai le Microsoft.Extensions.Logging.Abstractions package, o lea o le a matou faʻaopoopoina le tau e faʻaaoga ai se faʻaopoopoga faigofie i ai.

public static IDisposable BeginScopeWith(this ILogger logger, params (string key, object value)[] keys)
{
    return logger.BeginScope(keys.ToDictionary(x => x.key, x => x.value));
}

Matou te faʻaopoopoina se faʻapipiʻi i le pipeline o le talosaga ma maua le taunuuga manaʻomia.

public class Startup
{
    public void Configure(IApplicationBuilder application)
    {
        application.UseMiddleware<CorrelationIdContextLogger>();
    }
}

Ole taimi nei o gaioiga uma e fa'atupuina ile talosaga ile matou API web o lo'o iai se fa'asinomaga fa'amaopoopo lea e faigofie ona feso'ota'i.

Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

Fa'atasi i fe'au fai fefa'ataua'iga

O le isi laasaga o le faʻatulagaina o le faʻasalalau ma le mauaina o le faʻamaonia o fesoʻotaʻiga e ala i le fefaʻatauaʻiga feʻau. I la matou faʻataʻitaʻiga, matou te faʻaogaina RabbitMQ, ma ave le MassTransit faʻavae e fai ma tagata o tausia. Toe fo'i, se'i o tatou fa'ase'e le seti muamua o le galulue ma MassTransit ma alu sa'o i le fa'atulagaina o la'au.

I le amataga, e mafai ona matou aofia ai ogalaau a MassTransit lava ia; mo lenei mea o le a matou faʻaopoopoina se afifi i la matou talosaga MassTransit.SerilogIntegration

Install-Package MassTransit.SerilogIntegration

I le maeʻa ai o le faʻapipiʻiina o le logger i MassTransit faʻatulagaina, o le a mafai ona matou vaʻai i ogalaau faʻavae.

services
    .AddSingleton(provider =>
        {
            return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.UseSerilog();
            });
        });

Tuu le matou talosaga e tali atu i se talosaga POST e ala i le auina atu o se mea na tupu i SomethingDoneMessage ma le tau "faia". O le konekarate mo sea feʻau e mafai ona faʻamatalaina e faapea:

namespace MbMessages
{
    public interface ISomethingDoneMessageV1
    {
        string Value { get; }
    }
}

O fe'au a MassTransit ose teutusi o lo'o fa'apipi'i ai fe'au fai pisinisi. E pei o lenei le teutusi:

{
  "messageId": "59020000-5dba-0015-10b8-08d77ec28593",
  "requestId": "59020000-5dba-0015-5674-08d77ec28592",
  "conversationId": "59020000-5dba-0015-bca8-08d77ec28594",
  "destinationAddress": "rabbitmq://bear.rmq.cloudamqp.com/aelzlsta/ya.servicetemplate.receiveendpoint",
  "headers": {},
  "messageType": [
    "urn:message:MbMessages:ISomethingDoneMessageV1"
  ],
  "message": {
    "value": "done"
  }
}

O le feʻau o loʻo faʻaalia ai vaega o auaunaga e manaʻomia mo le faʻaogaina o le faʻavae lava ia, ae o loʻo ia i matou le tomai e faʻaopoopo a matou lava meatotino faʻaopoopo i lenei teutusi. E le gata i lea, o MassTransit o loʻo i ai meafaigaluega faʻapipiʻi mo le galue i nisi o fanua e filifili ai, o le mea e sili ona manaia o le faʻamatalaga faʻamaonia CorrelationId.

Sei o tatou faʻaopoopoina le CorrelatedBy interface i le konekarate feʻau:

namespace MbMessages
{
    public interface ISomethingDoneMessageV1 : CorrelatedBy<Guid>
    {
        string Value { get; }
    }
}

Sei o tatou faʻatinoina ma tuʻuina atu se tau i le CorrelationId meatotino pe a fatuina se feʻau:

internal class SomethingDoneMessageV1 : ISomethingDoneMessageV1
{
    internal SomethingDoneMessageV1(Guid correlationId, string value)
    {
        CorrelationId = correlationId;
        Value = value;
    }
    
    public Guid CorrelationId { get; private set; }
    public string Value { get; private set; }
}

Afai tatou te vaʻavaʻai i le feʻau faʻafouina, o le a tatou iloa ai o le faʻamatalaga faʻamaonia ua avea e le gata o se vaega o la tatou feʻau, ae o se vaega foi o le teutusi - o lenei faʻamatalaga o le a faʻaaogaina nei i faʻamaumauga uma a MassTransit, o lona uiga o le a sili atu ona faigofie. mo i matou e feagai ma faʻafitauli i le tulaga o fefaʻatauaʻiga feʻau.

{
  "messageId": "59020000-5dba-0015-10b8-08d77ec28593",
  "requestId": "59020000-5dba-0015-5674-08d77ec28592",
  "conversationId": "59020000-5dba-0015-bca8-08d77ec28594",
  "correlationId": "c7ff562a-b639-415b-9add-c9e524a727cc",
  "destinationAddress": "rabbitmq://bear.rmq.cloudamqp.com/aelzlsta/ya.servicetemplate.receiveendpoint",
  "headers": {},
  "messageType": [
    "urn:message:MbMessages:ISomethingDoneMessageV1"
  ],
  "message": {
    "correlationId": "c7ff562a-b639-415b-9add-c9e524a727cc",
    "value": "Hello"
  }
}

Pau lava le mea e tatau ona matou faia o le faʻatulagaina o le faʻapipiʻiina o nei mea tau auaunaga o le feʻau; mo lenei mea o le a matou faʻaopoopoina se afifi i le poloketi Serilog.Enrichers.MassTransitMessage. E fa'aopoopo e le afifi se faamama i le MassTransit message processing pipeline e fa'aputu ai le fa'amatalaga fe'au i luga o se fa'aputuga o filo-safe. E faitau e Serilog le tala mai le fa'aputuga ma fa'aopoopo nei meatotino fa'aopoopo i a tatou mea ogalaau.

Install-Package Serilog.Enrichers.MassTransitMessage

I MassTransit matou te tuʻuina se faamama

services
    .AddSingleton(provider =>
        {
            return Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.UseSerilog();
                cfg.UseSerilogMessagePropertiesEnricher();
            });
        });

Ma i le Serilog configuration matou te faʻaopoopoina se faʻatamaoaigaina

Log.Logger = new LoggerConfiguration()
    .Enrich.FromMassTransitMessage()
    .CreateLogger();

Talu ai ona o le talosaga e mauaina le feʻau mai le RabbitMQ queue e mafai ona maua uma meatotino o le teutusi MassTransit, e mafai ona matou faʻaogaina le faʻamaoniga faʻamaonia i totonu o le faʻaaogaina o talosaga, faʻapea foʻi ma le pasi atili i luga o le filifili telefoni.

O le i'uga, na amata ona i ai a matou ogalaau le CorrelationId e le gata i totonu o le tasi auaunaga, ae fa'apea fo'i pe a fegalegaleai ma isi talosaga.

Tatala i totonu o se siosiomaga .Net microservice i le faatinoga

O le mea lea, o le fa'ai'uga o le faiga o fa'amaumauga i .Net talosaga e mafai ai ona matou fa'amaopoopo fa'amaufa'ailoga mai 'au'aunaga fa'apitoa 'ese'ese e aunoa ma ni fa'afitauli - e o'o lava ia i latou o lo'o galulue e ala i se faife'au fe'au. Ma faʻatasi ai ma le fesoasoani a Elasticsearch, e mafai ona vave faʻavasegaina ogalaau e ala i le fausiaina o dashboards matou te manaʻomia i Kibana (o se faʻataʻitaʻiga o loʻo faʻaalia i le ata mo le pou).

O le mea moni, o le taina i totonu o lenei fomu o le a le aofia ai fegalegaleaiga faigata i le va o au 'auʻaunaga ma isi faiga i fafo, ae o le faʻatuina o sea faʻatonuga i le amataga lava o le atinaʻeina o le poloketi o se tasi lea o mea e te faʻafetai ai ia te oe lava nai lo le tasi.

E mafai ona e malamalama i le source code o le faiga e maua i le poloketi: github.com/a-postx/YA.ServiceTemplate

puna: www.habr.com

Faʻatau talimalo faʻatuatuaina mo nofoaga ma DDoS puipuiga, VPS VDS servers 🔥 Fa'atau le 'upega tafa'ilagi talimalo fa'atuatuaina ma le puipuiga DDoS, 'au'aunaga VPS VDS | ProHoster