ViennaNET: seti yemaraibhurari eiyo backend. Chikamu 2

Raiffeisenbank .NET developer community inoenderera mberi nekuongorora muchidimbu zviri mukati ViennaNET. Nezve kuti sei uye sei tauya kune izvi, unogona kuverenga chikamu chekutanga.

Muchinyorwa chino, tichapfuura-achiri-ku-kutariswa-maraibhurari ekushanda neakagoverwa kutengeserana, mitsetse uye dhatabhesi, izvo zvinogona kuwanikwa mune yedu GitHub repository (masosi ari pano), a Nuget mapakeji pano.

ViennaNET: seti yemaraibhurari eiyo backend. Chikamu 2

ViennaNET.Sagas

Kana purojekiti ichichinjira kuDDD uye microservice architecture, zvino kana bhizinesi repfungwa richigoverwa mumasevhisi akasiyana, dambudziko rinomuka rine chekuita nekudikanwa kwekushandisa yakagoverwa transaction mechanism, nekuti akawanda mamiriro anowanzo kukanganisa akati wandei madomasi kamwechete. Iwe unogona kujairana nemaitiro akadaro mune zvakadzama, semuenzaniso, mubhuku rinonzi "Microservices Patterns", Chris Richardson.

Mumapurojekiti edu, takashandisa nzira iri nyore asi inobatsira: saga, kana kuti orchestration-based saga. Chimiro chayo ndeichi: pane imwe bhizinesi mamiriro ezvinhu umo zvakakosha kuita sequentially kuita mashandiro mumasevhisi akasiyana, uye kana paine matambudziko amuka pane chero nhanho, zvinodikanwa kudaidza iyo yekudzoreredza maitiro kune ese apfuura matanho, apo akapa. Nokudaro, pamagumo e saga, pasinei nekubudirira, tinogamuchira data inowirirana mumatunhu ose.

Kuita kwedu kuchiri kuitwa muchimiro chayo chekutanga uye hakuna kusungirirwa nekushandiswa kwechero nzira dzekudyidzana nemamwe masevhisi. Hazvina kuoma kushandisa: ingoita muzukuru weiyo base abstract class SagaBase<T>, apo T ndiyo kirasi yako yemamiriro maunogona kuchengeta iyo yekutanga data inodiwa kuti saga ishande, pamwe nemimwe mibairo yepakati. Chiitiko chemukati chichapfuudzwa kumatanho ese panguva yekuurayiwa. Saga pachayo ikirasi isina nyika, saka muenzaniso unogona kuiswa muDI seSingleton kuti uwane zvinodiwa.

Muenzaniso ad:

public class ExampleSaga : SagaBase<ExampleContext>
{
  public ExampleSaga()
  {
    Step("Step 1")
      .WithAction(c => ...)
      .WithCompensation(c => ...);
	
    AsyncStep("Step 2")
      .WithAction(async c => ...);
  }
}

Muenzaniso kufona:

var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);

Mienzaniso yakazara yekushandiswa kwakasiyana inogona kutariswa pano uye paungano na miedzo.

ViennaNET.Orm.*

Seti yemaraibhurari ekushanda neakasiyana dhatabhesi kuburikidza neNhibernate. Isu tinoshandisa iyo DB-Yekutanga nzira tichishandisa Liquibase, saka pane chete basa rekushanda nedata mudhatabhesi rakagadzirirwa.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - magungano makuru ane basic interfaces uye mashandisirwo awo, zvichiteerana. Ngatitarisei zviri mukati mavo zvakadzama.

inowanikwa IEntityFactoryService uye kuitwa kwayo EntityFactoryService ndiyo nzvimbo huru yekutanga yekushanda nedhatabhesi, sezvo iyo Unit yeBasa, marepositori ekushanda nemamwe masangano, pamwe nevaiti vemirairo uye yakananga SQL mibvunzo inogadzirwa pano. Dzimwe nguva zviri nyore kudzikamisa kugona kwekirasi yekushanda nedhatabhesi, semuenzaniso, kupa kugona kuverenga chete data. Zvenyaya dzakadai IEntityFactoryService pane madzitateguru - interface IEntityRepositoryFactory, iyo inongozivisa nzira yekugadzira marepositori.

Kuti uwane zvakananga dhatabhesi, iyo mupi nzira inoshandiswa. Imwe neimwe DBMS yatinoshandisa muzvikwata zvedu ine yayo kuita kwayo: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Panguva imwecheteyo, vapeji vanoverengeka vanogona kunyoreswa mune imwe application panguva imwe chete, iyo inobvumira, semuenzaniso, mukati mehurongwa hwesevhisi imwe, pasina chero mutengo wekugadzirisa zvivakwa, kuita nhanho-nhanho kutama kubva. imwe DBMS kune imwe. Iyo nzira yekusarudza chinongedzo chinodiwa uye, nekudaro, mupi wechimwe kirasi kirasi (iyo inonyorerwa mepu kune dhatabhesi matafura) inoitwa kuburikidza nekunyoresa mubatanidzwa muBoundedContext kirasi (ine nzira yekunyoresa domain entities) kana mutsivi wayo. ApplicationContext (ine nzira dzekunyoresa masangano ekunyorera, zvikumbiro zvakananga uye mirairo), uko chinongedzo chekubatanidza kubva mukugadziriswa chinogamuchirwa senharo:

"db": [
  {
    "nick": "mssql_connection",
    "dbServerType": "MSSQL",
    "ConnectionString": "...",
    "useCallContext": true
  },
  {
    "nick": "oracle_connection",
    "dbServerType": "Oracle",
    "ConnectionString": "..."
  }
],

Muenzaniso ApplicationContext:

internal sealed class DbContext : ApplicationContext
{
  public DbContext()
  {
    AddEntity<SomeEntity>("mssql_connection");
    AddEntity<MigratedSomeEntity>("oracle_connection");
    AddEntity<AnotherEntity>("oracle_connection");
  }
}

Kana iyo ID yekubatanidza isina kutaurwa, ipapo kubatana kunonzi "default" kuchashandiswa.

Yakananga mepu yemasangano kumatafura edatabase inoshandiswa uchishandisa yakajairwa NHibernate maturusi. Unogona kushandisa tsananguro zvese kuburikidza ne xml mafaera uye nemakirasi. Pakunyora kuri nyore kwe stub repositories mu Unit bvunzo, kune raibhurari ViennaNET.TestUtils.Orm.

Mienzaniso yakazara yekushandisa ViennaNET.Orm.* inogona kuwanikwa pano.

ViennaNET.Messaging.*

Seti yemaraibhurari ekushanda nemitsara.

Kuti ushande nemitsara, nzira imwechete yakasarudzwa semaDBMS akasiyana-siyana, kureva, iyo nzira yepamusoro inogoneka yakabatana maererano nekushanda neraibhurari, zvisinei nekuti maneja wemutsetse anoshandiswa. Library ViennaNET.Messaging ndiye ane mhosva yekubatana uku, uye ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue ine adapta mashandisirwo eBMM MQ, RabbitMQ uye Kafka, zvichiteerana.

Paunenge uchishanda nemitsara, pane maitiro maviri: kugamuchira meseji nekuitumira.

Funga kugamuchira. Pane 2 sarudzo pano: yekuramba uchiteerera uye yekugamuchira meseji imwechete. Kuti ugare uchiteerera kumutsara, unofanirwa kutanga watsanangura iyo processor kirasi yakagarwa nhaka kubva IMessageProcessor, iyo ichava nebasa rekugadzirisa meseji inouya. Tevere, inofanirwa "kubatanidzwa" kune chaiyo mutsara; izvi zvinoitwa kuburikidza nekunyoresa mukati IQueueReactorFactory kuratidza mutsara identifier kubva pakumisikidzwa:

"messaging": {
    "ApplicationName": "MyApplication"
},
"rabbitmq": {
    "queues": [
      {
        "id": "myQueue",
        "queuename": "lalala",
        ...
      }
    ]
},

Muenzaniso wekutanga kuteerera:

_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();

Zvino, kana sevhisi yatanga uye nzira inodanwa kuti utange kuterera, mameseji ese kubva pamutsetse wakatarwa anoenda kune inoenderana processor.

Kugamuchira meseji imwe chete mufekitori interface IMessagingComponentFactory pane nzira CreateMessageReceiveriyo ichagadzira mugamuchiri akamirira meseji kubva pamutsetse wakatarwa kwairi:

using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
    var message = receiver.Receive();
}

Kutumira meseji unofanira kushandisa zvakafanana IMessagingComponentFactory uye gadzira anotumira meseji:

using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
    sender.SendMessage(new MyMessage { Value = ...});
}

Pane matatu akagadzirira-akagadzirwa sarudzo dzekuisa uye kudzinga meseji: ingori mameseji, XML uye JSON, asi kana zvichidikanwa, unogona nyore kugadzira yako yega interface mashandisirwo. IMessageSerializer и IMessageDeserializer.

Takaedza kuchengetedza kugona kwakasiyana kwemaneja wega wega wemutsetse, semuenzaniso. ViennaNET.Messaging.MQSeriesQueue inobvumidza iwe kutumira kwete mameseji chete, asiwo mameseji e-byte, uye ViennaNET.Messaging.RabbitMQQueue inotsigira nzira uye pa-the-fly queuing. Yedu adapta yekuputira yeRabbitMQ zvakare inoshandisa imwe semblance yeRPC: isu tinotumira meseji uye tomirira mhinduro kubva kune yakakosha yenguva mutsara, iyo inogadzirwa chete kune imwechete mhinduro meseji.

pano muenzaniso wekushandisa mitsetse ine basic connection nuances.

ViennaNET.CallContext

Isu tinoshandisa mitsara kwete chete yekubatanidza pakati peakasiyana masisitimu, asiwo yekukurukurirana pakati pemicroservices yechishandiso chimwe chete, semuenzaniso, mukati mesaga. Izvi zvakakonzera kudikanwa kwekufambisa pamwe chete nemharidzo yakadai sedhigirii data senge rekushandisa mushandisi, kukumbira chiziviso chekupedzisira-kusvika-kumagumo kutema, kwakabva IP kero uye mvumo data. Kuti tiite kutumirwa kwedata iri, takagadzira raibhurari ViennaNET.CallContext, iyo inokubvumira kuchengetedza data kubva pakukumbira kupinda mubasa. Muchiitiko ichi, kuti chikumbiro chakaitwa sei, kuburikidza nemutsara kana kuburikidza neHttp, hazvina basa. Zvino, usati watumira chikumbiro chinobuda kana meseji, data inotorwa kubva pane iyo mamiriro uye yakaiswa mumusoro. Nokudaro, sevhisi inotevera inogamuchira data yekubatsira uye inoibata nenzira imwecheteyo.

Ndatenda nekutarisisa kwako, tinotarisira kune zvaunotaura uye kudhonza zvikumbiro!

Source: www.habr.com

Voeg