Durch das vorherige Teilen haben wir einige Kerneinrichtungen der Microservice -Architektur über diese Komponenten erfahren. Durch diese Komponenten können wir ein einfaches Microservice -Architektursystem erstellen. Erstellen Sie beispielsweise ein gut verfügbares Service -Registrierungszentrum über Spring Cloud Eureka und realisieren Sie die Registrierung und Entdeckung von Service.
Lastausgleich mit Federwolkenband oder Tendenz; Service-Fehler-toleranter Schutz mit Spring Cloud Hytrix, um Ausbreitungsfehler zu vermeiden. Nachdem der Microservice erstellt wurde, werden wir dem externen System definitiv eine einheitliche Rastful -API -Service -Schnittstelle zur Verfügung stellen.
Wenn das externe System jedoch unsere erholsame API aufruft, wie bestimmen Sie, welchen Service es für die erforderlichen spezifischen Funktionen bereitstellt? Dies beinhaltet die Wartung von Routing -Regeln und Service -Instanzlisten.
Dies führt heute unseren Protagonisten vor - Spring Cloud Zuul, eine API -Gateway -Komponente, die auf Netflix Zuul -Implementierung basiert. Es kann zwei Hauptprobleme lösen:
Ok, schauen wir uns an, wie Sie diesen Gateway -Service implementieren.
1. Erstellen Sie ein Gateway und konfigurieren Sie Routing
Hier müssen wir noch die vorherigen Hello-Service- und Trip-Consumer-Dienste nutzen. Früher betrachteten wir Feign-Consumer als Service-Verbraucher, vergessen Sie jedoch nicht, dass jeder Service im Eureka-System sowohl ein Dienstleister als auch ein Dienstleistungsverbraucher ist. Daher ist Feign-Consumer auch ein Dienstleister, und Schnittstellen wie http: // localhost: 9001/Feign-Consumer, die es bietet.
Als nächstes erstellen wir einen Gateway -Service mit der Codestruktur wie folgt:
Schritte zur Implementierung von Code Implementierung:
Erstellen Sie einen neuen API-Gateway von Maven Project
Ändern Sie die POM -Datei
<project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>api-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <SupructId> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Parent </artifactId> <version> 1.5.1.Release </Version> </parent> <Eigenschaften> <Javaversion> 1.8 </javaversion> </</</</<! <gruppeId> org.springFramework.cloud </GroupId> <artifactId> Spring-Cloud-Abhängigkeiten </artifactId> <version> camden.sr6 </Version> <Typs> pom </type> <scope> import </scope> </abhängig> </abhängig> </abhängig u. abhängig> <! Spring-Boot-Starter-Actuator/Spring-Boot-Starter-Hystrix/Spring-Boot-Starter-Ribbon-> <Depopentcy> <gruppe> org.springframework
Erstellen Sie eine neue Startup -Klasse
/*** @EnableZuulProxy aktivieren Zuable Zuuls API -Gateway -Service -Funktion**/@enableZuulProxy@SpringCloudApplicationPublic Class Gatewayapp {public static void main (String [] args) {SpringApplication.run (Gatewayapp.class, Args); }}Erstellen Sie eine neue Anwendung. Properties
server.port = 5555Spring.Application.name = api-Gateway#zur Konfiguration der Routing-Regeln hinzufügen#Konfigurieren Sie über Zuul.routes. <route> .Path und Zuul.Routes. <route> .url. <route> ist der Name der Route und kann willkürlich angegeben werden, aber die Routennamen einer Reihe von Pfaden und URLs sollten das gleiche#wie im folgenden Beispiel sein: Alle erfüllen/api-a/** Zugriff auf Regeln werden an die Adresse von // localhost: 9001#, in dem wir zugreifen, wenn wir auf Http: // localhost: ap. Microservice -Schnittstelle von http: // localhost: 9001/Hallo Zuul.routes.api-a.path =/api-a/** Zuul.routes.api-a.url = http: // localhost: 9001zu
Testen Sie, Eureka, Hello-Service, Teme-Consumer und den neu hinzugefügten Api-Gateway-Service und besuchen Sie dann http: // localhost: 5555/api-a/Feign-Consumumer
Erfolgreich abgerufen auf die Serviceschnittstelle von Feign-Consumer-Feign-Consonsumer.
Die obigen Schritte implementieren die Konfiguration des herkömmlichen Routings. Diese Konfiguration hat einen großen Nachteil, der darin besteht, dass eine manuelle Konfiguration der Routing -Regeln in der Datei application.Properties erforderlich ist. Wenn es viele Dienste gibt, ist die Wartungs -Arbeitsbelastung sehr groß. Um die Wartungskosten zu senken, gibt es eine weitere Route - Service -orientierte Route.
2. Service-orientiertes Routing
Spring Cloud Zuul und Eureka integrieren, wir können den Routenpfad nicht bestimmte URLs, sondern bestimmte Dienste, und die Service -URLs werden automatisch vom Eureka -Service -Erkennungsmechanismus verwaltet. Diese Art der Route ist eine Service-orientierte Route. Die spezifische Codekonfiguration lautet wie folgt:
Ändern Sie POM -Dateien und führen Sie Eureka -Abhängigkeiten ein
<!-Eureka-Abhängigkeiten einführen-> <Depopentcy> <gruppe> org.springframework.cloud </Groupid> <artifactid> Spring-Cloud-Starter-Eureka </artifactid> </abhängig>
Ändern Sie die Konfigurationsdatei application.Properties
server.port = 5555Spring.Application.name = api-gatewayzuul.routes.api-a.path =/api-a/**# Hier verwenden wir ServiceID anstelle von URL und verwenden den Dienstnamen anstelle von IP+Portnummer Zuul.routes.api-a.serviceid = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Hinweis: Zuul.Routes.api-a.url = Hello-Service kann auch Funktionen implementieren, es kann jedoch keinen normalen Lastausgleich und fehlertoleranten Schutz ausführen.
Testen Sie, besuchen Sie http: // localhost: 5555/api-a/hello
Der Zugang war erfolgreich.
3.. Standardregeln für das Service -Routing
In serviceorientierten Routen ist dies möglich, da der Name <route> willkürlich ist:
Zuul.routes.hello-service.path =/Hallo-Service/** Zuul.routes.hello-service.serviceid = Hallo-Service
<route> Name ist der Dienstname. In der Tat nennen wir es in den tatsächlichen Anwendungen oft so. Wenn es solche Regeln gibt, kann Zuul uns standardmäßig bei der Implementierung solcher Funktionen helfen und die Schwierigkeiten der Konfiguration weiter speichern.
Lassen Sie uns ein Experiment durchführen und die Konfigurationsdatei ändern in:
server.port = 5555spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Dann Überprüfung der Seite Zugriff
Der Zugang war erfolgreich.
Standardmäßig werden die Dienste auf Eureka jedoch von Zuul weitergeleitet, sodass Dienste, die wir nicht für die Außenwelt offen sein möchten, extern auf die Außenwelt zugreifen möchten. Zu diesem Zeitpunkt können wir Regeln konfigurieren, die keine automatische Routing-Erstellung von Zuul.Innored-Services erfordern. Wenn Zuul.Innored-Services =*, werden alle Dienste nicht automatisch Routing-Regeln erstellt. Zu diesem Zeitpunkt muss die relevante Routing -Konfiguration über die vorherige Konfiguration durchgeführt werden.
=============ieben
Es wurde schon so viel gesagt, dass sich alle um ein Problem drehen: Routing -Regeln und Probleme mit der Serviceinstanz. Wie löst ich also das zweite Problem (Überprüfen Sie das Redundanzproblem)?
4. Anforderungsfilterung
Um Client -Anfragen im API -Gateway zu überprüfen, können wir Filter verwenden, um Anfragen abzufangen und zu filtern. Die Implementierungsmethode ist relativ einfach. Sie müssen nur die Zulfilter -Abstract -Klasse erben und seine vier Methoden implementieren.
Api-gateway ändern:
Filterklasse hinzugefügt
/*** Erben von Zuulfilter und Implementierung seiner 4 Schnittstellen** Für Anforderungsfilterung**/öffentliche Klasse AccessFilter erweitert Zuulfilter {logger logger = loggerfactory.getLogger (AccessFilter.class); / * * Sollte filter festlegen, ob der Filter ausgeführt werden muss * In der tatsächlichen Verwendung können wir diese Funktion verwenden, um den effektiven Bereich des Filters anzugeben } /** Spezifische Logik des Filters** Hier bitten wir Zuul, über ctx.setsendzusponse (false) zu fordern und den zurückgegebenen Fehlercode über ctx.setResponSestatusCode (401)** / @Override öffentliche Objekt Run () {) {) {) {) {) context = forders text = fordercontextextextextextextextextextextext (); HttpServletRequest request = context.getRequest (); Object AccessToken = Request.GetParameter ("AccessToken"); logger.info ("{} Anfrage an {}", request.getMethod (), request.getRequesturl (). toString ()); if (accessToken == null) {context.setsendzuResponse (false); context.setResponSestatuscode (401); } return null; } /* filterType gibt den Filtertyp zurück* Es bestimmt, in welchem Lebenszyklus der Filter ausgeführt wird. Dies ist als Pre definiert, was bedeutet, dass die Anforderung vor dem Routed ausgeführt wird. * * PRE: Filter vor Anforderung Ausführung * Route: Verarbeiten Sie die Anforderung und Route * Post: Filter nach Abschluss der Anfrage ausgeführt. * Fehler: Filter ausgeführt, wenn ein Fehler auftritt } / * * Filterorder gibt die Reihenfolge der Ausführung des Filters zurück * * Wenn die Anforderung mehrere Filter in einer Stufe aufweist, muss er einmal auf dem Rückgabewert der Methode ausgeführt werden * * / @Override öffentlich int filterorder () {return 0; }}Ändern Sie die Startklasse
/*** @EnableZuulProxy aktivieren Zuabs. } public static void main (String [] args) {SpringApplication.run (gatewayapp.class, args); }}prüfen
) Besuchen Sie http: // localhost: 5555/hello-service/Hallo, der Zugriff fehlgeschlagen
) Besuchen Sie http: // localhost: 5555/hello-service/Hallo?
Modifizierte Codestruktur:
5. Erweitern und erweitern
Wenn die Routing -Funktion tatsächlich ausgeführt wird, werden die Routing -Mapping und die Anfrage -Weiterleitung von mehreren verschiedenen Filtern durchgeführt.
Die Routing-Mapping wird hauptsächlich über Vor-Typ-Filter abgeschlossen, die dem Anforderungspfad mit den konfigurierten Routing-Regeln übereinstimmen und die Zieladresse findet, die weitergeleitet werden muss.
Der Anfrage-Weiterleitungsteil ist durch einen Routenfilter abgeschlossen, der die vom Vor-Typ-Filter erhaltene Routenadresse weiterleitet.
Daher können Filter als die Kernkomponente der API -Gateway -Funktion von Zuul bezeichnen. Jede HTTP -Anfrage, die Zul eingibt, wird über eine Reihe von Filterverarbeitungsketten beantwortet und an den Client zurückgegeben.
Zusammenfassen
Das obige ist das Problem der Verwendung von Zuul zur Implementierung des API -Gateway -Dienstes in Spring Cloud. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!