ViennaNET: seata de leabharlannan airson an backend. Pàirt 2

Tha coimhearsnachd leasaiche Raiffeisenbank .NET a’ leantainn air adhart a’ dèanamh lèirmheas goirid air susbaint ViennaNET. Mu ciamar agus carson a thàinig sinn gu seo, faodaidh tu a’ chiad phàirt a leughadh.

San artaigil seo, thèid sinn tro leabharlannan nach deach a mheas fhathast airson a bhith ag obair le gnothaichean sgaoilte, ciudhaichean agus stòran-dàta, a lorgar nar stòr-dàta GitHub (tha stòran an seo), agus Pacaidean Nuget an seo.

ViennaNET: seata de leabharlannan airson an backend. Pàirt 2

ViennaNET.Sagas

Nuair a thionndaidheas pròiseact gu ailtireachd DDD agus microservice, an uairsin nuair a thèid loidsig gnìomhachais a sgaoileadh thairis air diofar sheirbheisean, bidh duilgheadas ag èirigh co-cheangailte ris an fheum air uidheamachd malairt sgaoilte a chuir an gnìomh, leis gu bheil mòran shuidheachaidhean gu tric a’ toirt buaidh air grunn raointean aig an aon àm. Gheibh thu eòlas nas mionaidiche air innealan mar sin, mar eisimpleir, anns an leabhar "Microservices Patterns", Chris Richardson.

Anns na pròiseactan againn, tha sinn air inneal sìmplidh ach feumail a chuir an gnìomh: saga, no an àite saga stèidhichte air orchestration. Tha a bhrìgh mar a leanas: tha suidheachadh gnìomhachais sònraichte ann far am feumar gnìomhachd a dhèanamh ann an sreath ann an diofar sheirbheisean, agus ma dh’ èiricheas duilgheadas sam bith aig ìre sam bith, feumar fios a chuir chun a h-uile ceum roimhe seo, far a bheil e riatanach. air a thoirt seachad. Mar sin, aig deireadh an t-saga, ge bith dè an soirbheachadh, gheibh sinn dàta cunbhalach anns gach raon.

Tha ar buileachadh fhathast air a dhèanamh na chruth bunaiteach agus chan eil e ceangailte ri cleachdadh dhòighean sam bith airson eadar-obrachadh le seirbheisean eile. Chan eil e duilich a chleachdadh: dìreach dèan sliochd den chlas eas-chruthach bunaiteach SagaBase<T>, far a bheil T an clas co-theacsa agad anns an urrainn dhut an dàta tùsail a tha riatanach airson an saga obrachadh, a bharrachd air cuid de thoraidhean eadar-mheadhanach. Thèid an t-eisimpleir co-theacsa troimhe gu gach ceum aig àm cur gu bàs. Tha Saga fhèin na chlas gun stàit, agus mar sin faodar an eisimpleir a chuir ann an DI mar Singleton gus na h-eisimeileachd riatanach fhaighinn.

Sanas eisimpleir:

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

Call eisimpleir:

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

Faodar làn eisimpleirean de bhuileachadh eadar-dhealaichte fhaicinn an seo agus ann an co-thional le deuchainnean.

ViennaNET.Orm.*

Seata de leabharlannan airson a bhith ag obair le diofar stòran-dàta tro Nhibernate. Bidh sinn a’ cleachdadh an dòigh-obrach DB-First a’ cleachdadh Liquibase, agus mar sin chan eil ann ach comas-gnìomh airson obrachadh le dàta ann an stòr-dàta deiseil.

ViennaNET.Orm.Seedwork и ViennaNET.Orm - prìomh cho-chruinneachaidhean anns a bheil eadar-aghaidh bunaiteach agus na gnìomhan aca, fa leth. Bheir sinn sùil nas mionaidiche air an t-susbaint aca.

eadar-aghaidh IEntityFactoryService agus a bhuileachadh EntityFactoryService Is e seo am prìomh àite tòiseachaidh airson a bhith ag obair leis an stòr-dàta, leis gu bheil an Aonad Obrach, stòran airson obrachadh le buidhnean sònraichte, a bharrachd air luchd-tiomnaidh òrdughan agus ceistean SQL dìreach air an cruthachadh an seo. Aig amannan tha e goireasach comasan clas a chuingealachadh airson a bhith ag obair le stòr-dàta, mar eisimpleir, gus comas dìreach dàta a leughadh. Airson leithid de chùisean IEntityFactoryService tha sinnsear - eadar-aghaidh IEntityRepositoryFactory, a tha a-mhàin a 'foillseachadh dòigh airson cruthachadh stòran.

Gus faighinn chun stòr-dàta gu dìreach, thathas a’ cleachdadh inneal an t-solaraiche. Tha a bhuileachadh fhèin aig gach DBMS a bhios sinn a’ cleachdadh nar sgiobaidhean: ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql.

Aig an aon àm, faodar grunn sholaraichean a chlàradh ann an aon iarrtas aig an aon àm, a leigeas, mar eisimpleir, taobh a-staigh frèam aon seirbheis, gun chosgais sam bith airson am bun-structar atharrachadh, imrich ceum air cheum a dhèanamh bho aon DBMS gu fear eile. Tha an dòigh airson an ceangal riatanach a thaghadh agus, mar sin, an solaraiche airson clas eintiteas sònraichte (far a bheil mapadh gu clàran stòr-dàta air a sgrìobhadh) air a chuir an gnìomh le bhith a’ clàradh an eintiteas anns a’ chlas BoundedContext (anns a bheil dòigh airson buidhnean fearainn a chlàradh) no an neach a thig às a dhèidh. ApplicationContext (tha dòighean ann airson aonadan tagraidh a chlàradh, iarrtasan dìreach agus òrdughan), far a bheilear a’ gabhail ris an aithnichear ceangail bhon rèiteachadh mar argamaid:

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

Eisimpleir Co-theacsa Iarrtais:

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

Mura h-eil an ID ceangail air a shònrachadh, thèid an ceangal leis an ainm “default” a chleachdadh.

Tha mapadh dìreach de bhuidhnean gu clàran stòr-dàta air a bhuileachadh a’ cleachdadh innealan àbhaisteach NHibernate. Faodaidh tu an tuairisgeul a chleachdadh an dà chuid tro fhaidhlichean xml agus tro chlasaichean. Airson sgrìobhadh goireasach de stòran-stub ann an deuchainnean Aonaid, tha leabharlann ann ViennaNET.TestUtils.Orm.

Gheibhear eisimpleirean slàn de bhith a’ cleachdadh ViennaNET.Orm.* an seo.

ViennaNET.Messaging.*

Seata de leabharlannan airson a bhith ag obair le ciudha.

Gus obrachadh le ciudhaichean, chaidh an aon dòigh-obrach a thaghadh agus a chaidh a dhèanamh le diofar DBMSn, is e sin, an dòigh aonaichte as àirde a thaobh a bhith ag obair leis an leabharlann, ge bith dè am manaidsear ciudha a chaidh a chleachdadh. Leabharlann ViennaNET.Messaging gu cinnteach an urra ris an aonachadh seo, agus ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue и ViennaNET.Messaging.KafkaQueue cuir an gnìomh inneal-atharrachaidh airson IBM MQ, RabbitMQ agus Kafka, fa leth.

Nuair a bhios tu ag obair le ciudha, tha dà phròiseas ann: faighinn teachdaireachd agus a chuir.

Beachdaich air faighinn. Tha 2 roghainn an seo: airson èisteachd leantainneach agus airson aon teachdaireachd fhaighinn. Gus èisteachd ris a’ chiudha gu cunbhalach, feumaidh tu an toiseach cunntas a thoirt air a’ chlas pròiseasar a fhuair thu IMessageProcessor, a bhios an urra ri bhith a’ làimhseachadh an teachdaireachd a thig a-steach. An ath rud, feumaidh e a bhith “ceangailte” ri ciudha sònraichte; thèid seo a dhèanamh tro chlàradh a-steach IQueueReactorFactory a’ comharrachadh aithnichear ciudha bhon rèiteachadh:

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

Пример запуска прослушивания:

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

An uairsin, nuair a thòisicheas an t-seirbheis agus an dòigh air a ghairm gus tòiseachadh air èisteachd, thèid a h-uile teachdaireachd bhon ciudha ainmichte chun phròiseasar co-fhreagarrach.

Gus aon teachdaireachd fhaighinn ann an eadar-aghaidh factaraidh IMessagingComponentFactory tha dòigh-obrach ann CreateMessageReceivera chruthaicheas neach-faighinn a’ feitheamh ri teachdaireachd bhon ciudha a chaidh a shònrachadh dha:

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

Airson teachdaireachd a chuir feumaidh tu an aon rud a chleachdadh IMessagingComponentFactory agus cruthaich neach-cuiridh teachdaireachd:

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

Tha trì roghainnean deiseil ann airson teachdaireachd a chuir a-steach agus a dhì-chlàradh: dìreach teacsa, XML agus JSON, ach ma tha sin riatanach, is urrainn dhut na gnìomhan eadar-aghaidh agad fhèin a dhèanamh gu furasta IMessageSerializer и IMessageDeserializer.

Tha sinn air feuchainn ri comasan sònraichte gach manaidsear ciudha a ghlèidheadh, m.e. ViennaNET.Messaging.MQSeriesQueue a’ leigeil leat chan e a-mhàin teacsa a chuir, ach cuideachd teachdaireachdan byte, agus ViennaNET.Messaging.RabbitMQQueue a’ toirt taic do shlighean agus ciudha air-itealaich. Bidh an inneal-atharrachaidh againn airson RabbitMQ cuideachd a’ cur an gnìomh beagan semblance de RPC: bidh sinn a’ cur teachdaireachd agus a’ feitheamh ri freagairt bho ciudha sealach sònraichte, a tha air a chruthachadh dìreach airson aon teachdaireachd freagairt.

an seo eisimpleir de bhith a’ cleachdadh ciudha le nuances ceangail bunaiteach.

ViennaNET.CallContext

Bidh sinn a’ cleachdadh ciudhaichean chan ann a-mhàin airson amalachadh eadar diofar shiostaman, ach cuideachd airson conaltradh eadar microservices den aon iarrtas, mar eisimpleir, taobh a-staigh saga. Dh’ adhbhraich seo gu robh feum air dàta taice leithid logadh a-steach an neach-cleachdaidh, aithnichear iarrtas airson logadh deireadh-gu-deireadh, seòladh IP tùsail agus dàta ceadachaidh a chuir a-steach còmhla ris an teachdaireachd. Gus cur air adhart an dàta seo a chuir an gnìomh, leasaich sinn leabharlann ViennaNET.CallContext, a leigeas leat dàta a stòradh bho iarrtas a 'dol a-steach don t-seirbheis. Anns a’ chùis seo, chan eil e gu diofar ciamar a chaidh an t-iarrtas a dhèanamh, tro ciudha no tro Http. An uairsin, mus cuir thu an t-iarrtas no an teachdaireachd a-mach, thèid dàta a thoirt bhon cho-theacsa agus a chuir anns na cinn. Mar sin, bidh an ath sheirbheis a 'faighinn an dàta taiceil agus ga riaghladh san aon dòigh.

Tapadh leibh airson ur n-aire, tha sinn a 'coimhead air adhart ri ur beachdan agus tarraing iarrtasan!

Source: www.habr.com

Cuir beachd ann