Flexible, fester und beweglicher Service Discovery
-
05-09-2019 - |
Frage
Ich bin auf der Suche nach einer Möglichkeit für Kunden in einem LAN ohne Konfiguration alle Instanzen von meiner Server-Anwendung zu finden. Statt selbst etwas hacken, würde Ich mag eine bestehende Lösung verwenden. Ich persönlich brauche es in Python zu tun, aber ich würde glücklich über Lösungen in einer anderen Sprache zu hören.
Also, warum bin ich nicht mit avahi oder OpenSLP oder eine andere Zeroconf / SLP Lösung? Nun, es gibt ein paar zusätzliche Kriterien, und ich habe den Eindruck, keine der oben genannten Systeme passt sie.
Ich bin auf der Suche nach einer Lösung, die:
- Flexible . Es darf nicht Superuser-Rechte erfordern, das heißt nur Ports> 1024.
- Solid . Es muss mehrere Dienste des gleichen und unterschiedlichen Diensttyp auf einer einzigen Maschine ermöglichen und weiterhin die Dienste der Werbung, auch wenn die Instanz, die die Anzeige-Server stoppt oder Abstürze gestartet.
- Mobile . Es muss fast überall, oder zumindest auf * BSD, Debian / gentoo / RedHat / SuSe Linux, Mac OS X, Solaris und Windows NT ausgeführt werden.
- Licht . Idealerweise würde ein Python-Skript die ganze Lösung. Ich bin nicht im Geringsten daran interessiert, die automatischen Adresskonfiguration oder so ähnlich, obwohl ich begrudgingly eine Lösung akzeptieren würde, dass ich viele Features hat nicht brauchen. Darüber hinaus jede einmalige Einrichtung ist ein streng no-no.
Ich erwarte, dass so etwas wie folgt aus:
def registerService(service): # (type, port)
if listen(multicast, someport):
if fork() == child:
services = [service]
for q in queriesToMe():
if q == DISCOVERY:
answer(filter(q.criteria, services))
elif q == ADVERTISE and q.sender == "localhost":
services.append(q.service)
else:
advertiseAt("localhost", service)
Lösung
Ich schrieb eine Anwendung / Bibliothek (derzeit Python und CLI-Schnittstelle), die alle diese critera entspricht. Es heißt minusconf . Es stellte sich heraus Forking nicht einmal notwendig ist.
Andere Tipps
Für Knoten Entdeckung in einem LAN habe ich Verdreht und UDP-Multicast verwendet. Hoffe, es hilft Ihnen auch.
Link zu der verdrehten Dokumentation, die erklären, wie es zu tun: https://twistedmatrix.com/documents/current/core/howto/udp .html # AUTO3
Hier ist eine grundlegende Implementierung eines Server / Client-basierte im Code der verdreht. Es beantwortet sich, wenn Sie einmal laufen, aber alle Prüfcodes und zusätzliche Funktionen wurden entfernt, um es einfacher zu machen zu lesen.
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
class MulticastPingPong(DatagramProtocol):
MULTICAST_ADDR = ('228.0.0.5', 8005)
CMD_PING = "PING"
CMD_PONG = "PONG"
def startProtocol(self):
"""
Called after protocol has started listening.
"""
# Set the TTL>1 so multicast will cross router hops:
self.transport.setTTL(5)
# Join a specific multicast group:
self.transport.joinGroup(self.MULTICAST_ADDR[0])
self.send_alive()
def send_alive(self):
"""
Sends a multicast signal asking for clients.
The receivers will reply if they want to be found.
"""
self.transport.write(self.CMD_PING, self.MULTICAST_ADDR)
def datagramReceived(self, datagram, address):
print "Datagram %s received from %s" % (repr(datagram), repr(address))
if datagram.startswith(self.CMD_PING):
# someone publishes itself, we reply that we are here
self.transport.write(self.CMD_PONG, address)
elif datagram.startswith(self.CMD_PONG):
# someone reply to our publish message
print "Got client: ", address[0], address[1]
if __name__ == '__main__':
reactor.listenMulticast(8005, MulticastPingPong(), listenMultiple=True)
reactor.run()
Ich nehme an, Sie Kontrolle über die Client-Anwendungen haben, nicht nur die Server-Anwendung, wobei in diesem Fall Pyro gut funktionieren könnte für Sie.
Flexibel:. verwendet nicht privilegierte Ports
Solid: Es ist seit vielen Jahren gut gepflegt
.Portable:. reiner Python und auch auf mehreren Plattformen getestet
Licht: Ich denke, Pyro Licht ist für das, was Sie bekommen. Vielleicht Skript fragt nach einer Python ist unrealistisch für einen Netzwerk-Namensdienst?
Auch wenn Sie eigentlich nicht das „Remote-Objekt“ Paradigma des Pyro verwenden mögen, können Sie noch in der Lage sein, nur seinen Namensdienst zu verwenden.