Ich habe also eine App, die sich aus einer API und einem Windows-Dienst (umschlossen von Topshelf) zusammensetzt, die ständig auf Ereignisse mit RabbitMQ wartet und Daten nach Bedarf verarbeitet.
Für Bildung und Spaß versuche ich, dies in ein äquivalentes Setup umzuwandeln, das auf .NET Core und Unix laufen würde (z.B. in einem Docker-Container auf AWS)
Was wäre der beste Weg, etwas zu implementieren, das einem Windows-Dienst wie diesem (für immer laufenden Hintergrundprozess) mit .NET Core entspricht, wenn ich es plattformübergreifend behalten möchte?
Der Windows-Dienst selbst ist eine Konsolenanwendung, die den Schnittstellenregeln und -protokollen des Windows Service Control Manager entspricht. Sie können dasselbe auf beiden Plattformen erreichen, indem Sie die .net-Core-Konsolenanwendung als Host verwenden. Sie müssen einige zusätzliche Konfigurationsschritte ausführen, damit sie sich mehr wie ein echter Service / Daemon verhält.
z. Für Linux können Sie SystemD verwenden. Sie müssen eine SystemD-Konfigurationsdatei mit etwas wie diesem zuerst erstellen:
%Vor%Und konfigurieren Sie dann SystemD, um es auf Ihre Dienstkonfiguration aufmerksam zu machen
%Vor%Für Windows sollten Sie meistens dasselbe machen, aber mit einem anderen Toolset. Sie müssen einen Service-Manager eines Drittanbieters verwenden, um eine enge Bindung von Windows zu vermeiden. Z.B. Sie können NSSM verwenden. Und hier ist der schöne Artikel mit Beispielen dazu - .Net Core-Konsolenanwendung als Windows-Dienst .
Btw Sie können immer noch eine normale Windows-Service-Setup nur als Host in einem Fall von Windows verwenden. Und schreiben Sie einen anderen Host für Ihre Unix-Umgebungen (Konsolen-App-Host). Beide können die Geschäftslogik teilen und nur die Art, wie sie auf Systemereignisse reagieren, wird sich unterscheiden.
Ich hoffe, es hilft.
Tags und Links cross-platform .net-core unix daemon