ViennaNET: ένα σύνολο βιβλιοθηκών για το backend

Γεια σε όλους!

Είμαστε μια κοινότητα προγραμματιστών .NET στη Raiffeisenbank και θέλουμε να μιλήσουμε για ένα σύνολο βιβλιοθηκών υποδομής που βασίζονται στο .NET Core για γρήγορη δημιουργία μικροϋπηρεσιών με ένα ενιαίο οικοσύστημα. Το έφεραν στο Open Source!

ViennaNET: ένα σύνολο βιβλιοθηκών για το backend

Μια μικρή ιστορία

Μια φορά κι έναν καιρό είχαμε ένα μεγάλο μονολιθικό έργο, το οποίο σταδιακά μετατράπηκε σε ένα σύνολο μικροϋπηρεσιών (μπορείτε να διαβάσετε για τα χαρακτηριστικά αυτής της διαδικασίας στο Αυτό το άρθρο). Στην πορεία, αντιμετωπίσαμε το πρόβλημα ότι κατά τη δημιουργία νέων μικροϋπηρεσιών, έπρεπε συχνά να αντιγράψουμε διάφορες λύσεις υποδομής - όπως εγκατάσταση καταγραφής, εργασία με βάση δεδομένων, WCF κ.λπ. Μια ομάδα εργάστηκε σε αυτό το έργο και όλοι ήταν ήδη συνηθισμένοι σε κάποια καθιερωμένη προσέγγιση για την εργασία με τις υποδομές. Επομένως, διαχωρίσαμε τον κοινό κώδικα σε ξεχωριστό αποθετήριο, τυλίξαμε τις συλλεγόμενες βιβλιοθήκες σε πακέτα Nuget και τις τοποθετήσαμε στο εσωτερικό μας αποθετήριο Nuget.

Ο χρόνος πέρασε, το έργο κατακερματίστηκε σταδιακά και υπήρχε η επιθυμία να δημιουργηθούν νέες μονάδες πελάτη σε ένα σύγχρονο πλαίσιο JS και να εκτελεστούν στο πρόγραμμα περιήγησης. Ξεκινήσαμε να μετακινούμαστε από το WCF/SOAP στο REST/HTTP, επομένως χρειαζόμασταν νέες βιβλιοθήκες για να ξεκινήσουμε γρήγορα υπηρεσίες που βασίζονται στο AspNet WebApi. Η πρώτη έκδοση στο .Net Framework 4.5 φτιάχτηκε από τον αρχιτέκτονά μας σχεδόν γονατιστός στον ελεύθερο χρόνο του, αλλά εκτός του κουτιού επέτρεψε την έναρξη μιας υπηρεσίας με τρεις γραμμές στο Program.cs που περιείχαν εξουσιοδότηση (NTLM), καταγραφή, Swagger, IoC/DI με βάση το Castle Windsor, προσαρμοσμένα προγράμματα-πελάτες HTTP που προωθούν διάφορες κεφαλίδες για να παρέχουν καταγραφή από άκρο σε άκρο σε ολόκληρο το έργο. Και όλο αυτό το πράγμα θα μπορούσε να ρυθμιστεί περαιτέρω απευθείας στο αρχείο διαμόρφωσης υπηρεσίας.

Ωστόσο, δεν ήταν όλα ομαλά: αυτή η βιβλιοθήκη αποδείχθηκε εξαιρετικά άκαμπτη όσον αφορά την εισαγωγή νέων ενοτήτων. Για παράδειγμα, εάν χρειαζόταν να προσθέσετε κάποιο ειδικό ενδιάμεσο λογισμικό, έπρεπε να δημιουργήσετε ένα νέο συγκρότημα και να κληρονομήσετε από τη βασική κλάση που εκτελεί την υπηρεσία, κάτι που ήταν εξαιρετικά άβολο. Ευτυχώς, δεν υπήρχαν πολλές τέτοιες περιπτώσεις.

Η εποχή των Docker και Kubernetes

Ήρθε η ώρα που έφτασε σε εμάς το κύμα των Docker και Kubernetes, το οποίο παρακολουθήσαμε στενά: τελικά, ήταν μια εξαιρετική ευκαιρία να αρχίσουμε να προχωράμε περαιτέρω στις τεχνολογίες, στο .Net Core. Αυτό σημαίνει ότι θα χρειαστούμε μια νέα υποδομή για την εκτέλεση υπηρεσιών: ορισμένες βιβλιοθήκες έχουν μετεγκατασταθεί από το .Net Framework στο .Net Standard και στο .Net Core πρακτικά χωρίς αλλαγές, ορισμένες με μικρές βελτιώσεις. Αλλά πάνω από όλα ήθελα να επεξεργαστώ ξανά τη λειτουργικότητα που σχετίζεται με την εκκίνηση υπηρεσιών στο AspNet Core.

Το πρώτο πράγμα που σκεφτήκαμε ήταν μια ιδέα που θα αφαιρούσε το κύριο μειονέκτημα της προηγούμενης έκδοσης: έλλειψη ευελιξίας. Ως εκ τούτου, αποφασίστηκε να γίνει ολόκληρο το σύστημα της βιβλιοθήκης όσο το δυνατόν πιο ανεξάρτητο και αρθρωτό και να συγκεντρωθούν οι απαραίτητες υπηρεσίες για τη λειτουργικότητα ως κατασκευαστής.

Ο κύριος στόχος είναι να δημιουργηθεί μια ενοποιημένη προσέγγιση που περιγράφει τον τρόπο αλληλεπίδρασης με βάσεις δεδομένων, λεωφορεία και άλλες υπηρεσίες. Προσπαθήσαμε να κάνουμε τις ενσωματώσεις γρήγορες και ανώδυνες και οι προγραμματιστές μπορούσαν να επικεντρωθούν στη σύνταξη επιχειρηματικής λογικής και όχι στην υποδομή - είναι ήδη έτοιμο. Ένα κοινό αποθετήριο συμβάλλει στη βελτίωση της εμπειρίας αλληλεπίδρασης εντός των ομάδων: όταν χρησιμοποιούνται πολύ παρόμοιες εσωτερικές υποδομές, είναι ευκολότερο να συμμετάσχετε στη διαδικασία ανάπτυξης μιας άλλης ομάδας και να ανταλλάξετε εμπειρογνωμοσύνη.

Και γιατί χρειαζόμαστε ανοιχτό κώδικα;

Θέλουμε να δείξουμε την ωριμότητα της τεχνογνωσίας μας και να λάβουμε σχόλια υψηλής ποιότητας: ένα άτομο εκτός τράπεζας θα μπορεί να φέρει κάτι από τον εαυτό του. Μας ενδιαφέρει επίσης η ανάπτυξη πρακτικών για την εργασία με microservices και DDD στο .NET στον κλάδο· ίσως κάποιος θα θελήσει να αναλάβει ορισμένα μέρη του πλαισίου.

Στην πραγματικότητα, ViennaNET

Τώρα ας ρίξουμε μια πιο προσεκτική ματιά. Ο πλήρης πηγαίος κώδικας δημοσιεύεται εδώ.

ViennaNET.WebApi.*

Αυτό το σύνολο βιβλιοθηκών αποτελείται από το "root" ViennaNET.WebApi, που περιέχει την κλάση builder για την υπηρεσία CompanyHostBuilder και ένα σύνολο διαμορφωτών ViennaNET.WebApi.Configurators.*, καθένα από τα οποία σας επιτρέπει να προσθέσετε και να διαμορφώσετε ορισμένες λειτουργίες στο δημιουργημένο υπηρεσία. Μεταξύ των διαμορφωτών μπορείτε να βρείτε συνδέσεις για καταγραφή, διαγνωστικά, είδη ελέγχου ταυτότητας και εξουσιοδότησης, swagger κ.λπ.

Το ViennaNET.WebApi.Runners.* περιέχει επίσης προρυθμισμένα προγράμματα δημιουργίας υπηρεσιών. Αυτά τα πακέτα σάς επιτρέπουν να μην θυμάστε κάθε φορά που δημιουργείτε μια νέα υπηρεσία την οποία πρέπει να συνδέονται οι διαμορφωτές. Ωστόσο, δεν περιορίζουν τη λειτουργικότητα του προγράμματος δημιουργίας υπηρεσιών με κανέναν τρόπο.

ViennaNET.Mediator.*

Βιβλιοθήκες που σας επιτρέπουν να δημιουργήσετε έναν εσωτερικό ενδιάμεσο δίαυλο για εντολές και αιτήματα σε μια υπηρεσία. Αυτή η προσέγγιση σάς επιτρέπει να μειώσετε τον αριθμό των ενέσεων DI σε μία, για παράδειγμα, σε ελεγκτές. Λόγω αυτού, μπορείτε να προσθέσετε διάφορους διακοσμητές στα αιτήματα, γεγονός που ενοποιεί την επεξεργασία τους και μειώνει την ποσότητα του κώδικα.

ViennaNET.Επικύρωση

Ένα συγκρότημα που περιέχει ένα σύνολο κλάσεων για τη δημιουργία κανόνων επικύρωσης και ακολουθιών από αυτές. Είναι πολύ βολικό για την εφαρμογή επικύρωσης τομέα, καθώς σας επιτρέπει να περιγράφετε κάθε επιχειρηματική συνθήκη με τη μορφή ενός απλού και ξεχωριστού κανόνα.

ViennaNET.Redis

Μια βιβλιοθήκη με περιτυλίγματα για βολική εργασία με το Redis ως προσωρινή μνήμη στη μνήμη.

ViennaNET.Προδιαγραφές

Ένα συγκρότημα που περιέχει κλάσεις που υλοποιούν το πρότυπο Specification.

Δεν είναι μόνο αυτό στο σετ μας. Μπορείτε να δείτε τα υπόλοιπα στο αποθετήριο GitHub. Σχεδιάζουμε να κυκλοφορήσουμε σύντομα τις βιβλιοθήκες μας για εργασία με βάσεις δεδομένων στο OpenSource.

Σας ευχαριστούμε για την προσοχή σας, περιμένουμε τα σχόλιά σας και τα αιτήματά σας.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο