Wọle si agbegbe .Net microservice ni iṣe

Wọle si agbegbe .Net microservice ni iṣe

Wọle jẹ ohun elo oluṣeto ti o ṣe pataki pupọ, ṣugbọn nigbati o ba ṣẹda awọn ọna ṣiṣe ti a pin, o di okuta ti o nilo lati gbe kalẹ sinu ipilẹ ohun elo rẹ, bibẹẹkọ idiju ti awọn iṣẹ ṣiṣe microservices ti o dagbasoke yoo yarayara gba owo rẹ.

.Net mojuto 3 ti fi kun a nla agbara lati atagba ipo ibamu ni awọn akọle HTTP, Nitorina ti awọn ohun elo rẹ ba lo awọn ipe HTTP taara fun ibaraẹnisọrọ laarin iṣẹ, lẹhinna o le lo anfani ti iṣẹ-jade-ti-apoti. Bibẹẹkọ, ti faaji ifẹhinti rẹ ba pẹlu ibaraenisepo nipasẹ alagbata ifiranṣẹ kan (RabbitMQ, Kafka, bbl), lẹhinna o tun nilo lati ṣe aniyan nipa gbigbe ipo ibamu nipasẹ awọn ifiranṣẹ wọnyi funrararẹ.

Ninu nkan yii a yoo mu ohun elo wẹẹbu-api ti o rọrun ati ṣeto gedu, eyiti yoo

  • ṣetọju ibamu ipari-si-opin laarin awọn akọọlẹ ti awọn iṣẹ ominira ki o le ni irọrun wo gbogbo awọn iṣe ti o ṣẹlẹ nipasẹ ibeere kan pato lati ọdọ alabara

  • ni aaye titẹsi ẹyọkan pẹlu itupalẹ irọrun, ki paapaa Atilẹyin le lo ọpa iwọle, eyiti awọn ibeere bii “Mo ni aṣiṣe ninu ohun elo pẹlu iru ati iru ID ibeere” le ṣee lo

Ni akọkọ, a nilo lati pinnu lori olupese gedu fun ohun elo wa. Ibeere akọkọ fun gedu ode oni jẹ eto, i.e. a ko yẹ ki o ṣiṣẹ pẹlu alapin ọrọ awọn ifiranṣẹ, ṣugbọn pẹlu ohun. Ṣeun si iru awọn akọọlẹ bẹ, a le ni irọrun kọ awọn iwo ti awọn ifiranṣẹ wa lati awọn iwo oriṣiriṣi ati ṣe awọn itupalẹ.

Fun ohun elo wa a yoo lo package Serilog, eyiti o ni atilẹyin to dara julọ fun gedu eto ati eto afikun ọlọrọ. Emi yoo foju awọn igbesẹ ipilẹ ti ṣeto rẹ (o le wa nọmba nla ti awọn nkan lori koko yii) ati ṣe arosinu pe

  • Serilog ti wa ni tunto tẹlẹ ati pe o jẹ olutaja aiyipada fun olupese abẹrẹ igbẹkẹle rẹ

  • Iṣeto ni pẹlu imudara awọn ifiranṣẹ pẹlu awọn ohun-ini ọrọ-ọrọ (Enrich.FromLogContext)

Igbesẹ ti n tẹle ni lati yan iru eto ikojọpọ log aarin lati firanṣẹ awọn ifiranṣẹ lati Serilog si. Boya aṣayan orisun ṣiṣi ti o wọpọ julọ loni ni akopọ ELK (Elasticsearch, Logstash ati Kibana), nitorinaa jẹ ki a mu. Lati ṣe eyi, a yoo lo awọn ìfilọ lati Logz.IO - lẹhin iforukọsilẹ fun ero ọfẹ, a ni gbogbo agbara ẹrọ wiwa Lucene ni ọwọ wa.

Gbogbo ohun ti a ni lati ṣe ni ṣafikun package si iṣẹ akanṣe wa Serilog.Sinks.Logzio

Install-Package Serilog.Sinks.Logzio

Ki o si fi awọn ti o baamu enricher si awọn iṣeto ni ti wa logger, ono a wiwọle àmi

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

Nipa ifilọlẹ ohun elo, a yoo ni anfani lati ṣe akiyesi awọn ifiranṣẹ wa kii ṣe ninu console nikan, ṣugbọn tun ni Kibana.

Wọle si agbegbe .Net microservice ni iṣe

Awọn ọna

Wọle si agbegbe .Net microservice ni iṣe

Ninu ohun elo iru iṣẹ kan, a le ṣe iyatọ awọn atọkun akọkọ meji fun ibaraenisepo rẹ pẹlu agbaye ita, jẹ ki a ṣe apẹrẹ wọn bi inaro ati petele. Ni wiwo inaro jẹ API wẹẹbu nipasẹ eyiti awọn ipe lati ohun elo alabara de. Petele jẹ alagbata ifiranṣẹ ti o lo lati ṣe paṣipaarọ data pẹlu awọn iṣẹ inu miiran.

Jẹ ki ká ro awọn ipele ti ni lenu wo ibamu lori kọọkan ninu awọn wọnyi atọkun.

Ibamu ninu awọn ibeere HTTP

Lati gba alaye pupọ bi o ti ṣee ṣe, a nilo lati ṣe idamọ ibamu bi o ti ṣee ṣe si ibẹrẹ iṣẹ naa, ie. lori ẹnu-ọna tabi taara lori alabara (alagbeka tabi wẹẹbu). Niwọn bi o ti jẹ pe loni a n ṣe pẹlu ohun elo ẹhin, a yoo kan tọka lori rẹ ibeere fun akọsori “X-Correlation-ID” dandan ni gbogbo awọn ibeere si API wẹẹbu.

Fifi a package CorrelationID, ẹniti iṣẹ rẹ ni lati gba iye lati akọsori ti a nilo

Install-Package CorrelationID

Jẹ ki a ṣafikun si opo gigun ti epo ti n ṣiṣẹ

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

Bayi a yoo lo lati ṣẹda àlẹmọ iṣe ti o rọrun:

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();
    }
}

Ki o si fi si awọn oludari

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

}

Bi abajade, oluṣakoso yoo ṣe afihan ibeere buburu 400 fun gbogbo awọn ibeere laisi akọsori pẹlu idamo ti o baamu.

Lẹhin ti a bẹrẹ lati gba idamọ kan lati ọdọ alabara, a gbọdọ ṣafikun si aaye gedu, a yoo ṣe Layer fring fun eyi:

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);
        }
    }
}

Ninu ohun elo wa, a lo boṣewa ILogger lati Microsoft.Extensions.Logging.Abstractions package, nitorinaa a yoo ṣafikun iye naa nipa lilo itẹsiwaju ti o rọrun si rẹ.

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

A ṣafikun ipele kan si opo gigun ti n ṣatunṣe ibeere ati gba abajade ti o fẹ.

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

Ni bayi gbogbo awọn iṣẹ ṣiṣe ti o jẹ ipilẹṣẹ nipasẹ awọn ibeere si API wẹẹbu wa ni idamọ ibaramu nipasẹ eyiti wọn le sopọ ni irọrun.

Wọle si agbegbe .Net microservice ni iṣe

Ibamu ninu awọn ifiranṣẹ alagbata

Igbesẹ t’okan ni lati ṣeto gbigbe ati gbigba idanimọ ibamu nipasẹ alagbata ifiranṣẹ. Ninu apẹẹrẹ wa, a yoo lo RabbitMQ, ati mu ilana MassTransit bi alabara. Lẹẹkansi, jẹ ki a foju iṣeto akọkọ ti ṣiṣẹ pẹlu MassTransit ki o lọ taara si iṣeto gedu.

Lati bẹrẹ pẹlu, a le pẹlu awọn akọọlẹ ti MassTransit funrararẹ; fun eyi a yoo ṣafikun package kan si ohun elo wa MassTransit.SerilogIntegration

Install-Package MassTransit.SerilogIntegration

Bayi lẹhin fifi logger si awọn eto MassTransit, a yoo ni anfani lati wo awọn ilana ilana.

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

Jẹ ki ohun elo wa dahun si ibeere POST nipa fifiranṣẹ iṣẹlẹ SomethingDoneMessage pẹlu iye “ṣe”. Iwe adehun fun iru ifiranṣẹ le jẹ apejuwe bi atẹle:

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

Awọn ifiranṣẹ MassTransit jẹ apoowe ni pataki ninu eyiti awọn ifiranṣẹ alagbata ti wa ni pipade. Awọn apoowe wulẹ nkankan bi yi:

{
  "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"
  }
}

Ifiranṣẹ naa fihan awọn aaye iṣẹ ti o ṣe pataki fun iṣẹ ti ilana funrararẹ, ṣugbọn a ni agbara lati ṣafikun awọn ohun-ini afikun tiwa si apoowe yii. Pẹlupẹlu, MassTransit ni awọn irinṣẹ ti a ṣe sinu fun ṣiṣẹ pẹlu diẹ ninu awọn aaye iyan, eyiti o nifẹ julọ ninu eyiti o jẹ idamọ CorrelationId.

Jẹ ki a ṣafikun wiwo CorrelatedBy si adehun ifiranṣẹ naa:

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

Jẹ ki a ṣe imuse ki o fi iye kan si ohun-ini CorrelationId nigba ṣiṣẹda ifiranṣẹ kan:

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; }
}

Ti a ba wo ifiranṣẹ ti a ṣe imudojuiwọn, a yoo rii pe idanimọ ibamu ti di kii ṣe apakan ti ifiranṣẹ wa nikan, ṣugbọn tun jẹ apakan ti apoowe - idamo yii yoo tun ṣee lo ni gbogbo awọn akọọlẹ MassTransit, eyiti o tumọ si pe yoo rọrun pupọ. fun wa lati koju awọn iṣoro ni ipele alagbata ifiranṣẹ.

{
  "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"
  }
}

Gbogbo ohun ti a ni lati ṣe ni tunto gedu ti awọn ohun-ini iṣẹ wọnyi ti ifiranṣẹ naa; fun eyi a yoo ṣafikun package kan si iṣẹ akanṣe naa Serilog.Enrichers.MassTransitMessage. Package naa ṣafikun àlẹmọ kan si opo gigun ti iṣakoso ifiranṣẹ MassTransit ti o ṣe akopọ ọrọ-ọrọ ifiranṣẹ sori akopọ-ailewu okun kan. Serilog ka ọrọ-ọrọ lati akopọ ati ṣafikun awọn ohun-ini afikun wọnyi si awọn nkan log wa.

Install-Package Serilog.Enrichers.MassTransitMessage

Ni MassTransit a fi àlẹmọ kan sii

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

Ati ni Serilog iṣeto ni a fi ohun enricher

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

Niwọn igba ti ohun elo ti o gba ifiranṣẹ lati ori isinyi RabbitMQ ni iraye si gbogbo awọn ohun-ini ti apoowe MassTransit, a le lo idamọ isọdọkan abajade laarin ohun elo jijẹ, bi daradara bi kọja siwaju pẹlu pq ipe.

Bi abajade, awọn akọọlẹ wa bẹrẹ lati ni CorrelationId kii ṣe laarin iṣẹ kan nikan, ṣugbọn tun nigba ibaraenisepo pẹlu awọn ohun elo miiran.

Wọle si agbegbe .Net microservice ni iṣe

Nitorinaa, eto iwọle ti o ni abajade ninu awọn ohun elo Net jẹ ki a ṣe atunṣe awọn akọọlẹ lati awọn iṣẹ microservices ti o yatọ patapata laisi awọn iṣoro eyikeyi - paapaa awọn ti o ṣiṣẹ nipasẹ alagbata ifiranṣẹ kan. Ati pẹlu iranlọwọ ti Elasticsearch, a le yarayara ati irọrun ṣe itupalẹ awọn akọọlẹ nipa kikọ awọn dasibodu ti a nilo ni Kibana (apẹẹrẹ kan ti han ninu aworan fun ifiweranṣẹ).

Nitoribẹẹ, wíwọlé ni fọọmu yii kii yoo bo awọn ibaraenisepo eka laarin awọn iṣẹ rẹ ati ọpọlọpọ awọn eto ita, ṣugbọn iṣeto iru aṣẹ ni ibẹrẹ ibẹrẹ ti idagbasoke iṣẹ akanṣe jẹ ọkan ninu awọn nkan wọnyi fun eyiti iwọ yoo dupẹ lọwọ ararẹ diẹ sii ju ẹẹkan lọ.

O le loye koodu orisun ti eto abajade ninu iṣẹ akanṣe: github.com/a-postx/YA.ServiceTemplate

orisun: www.habr.com

Ra alejo gbigba igbẹkẹle fun awọn aaye pẹlu aabo DDoS, awọn olupin VPS VDS 🔥 Ra gbigbalejo oju opo wẹẹbu ti o gbẹkẹle pẹlu aabo DDoS, awọn olupin VPS VDS | ProHoster