Diesmal teile ich mit Ihnen, wie Sie Dienstleistungen konsumieren. Im vorherigen Artikel geht es um die Verwendung von Tet für den Verbrauch. In diesem Artikel wird REST+RELBONS -Verbrauchsdienste verwendet und eine einfache Konsumkomponente durch Umfragen angepasst. Der Zweck dieses Artikels ist: die Idee, Konsumdienste anzupassen; Wenn es Vorteile gibt, bitte "wie":
Rest+Ribbon realisiert Verbraucherdienste
Als Serviceverbraucher haben wir zwei Hauptprozesse für die Unterscheidung zwischen 1) Diensten und 2) aufgerufenen Diensten durchgeführt. Wie kann man Dienstleistungen erhalten und wie Sie Dienste anrufen? Schauen wir uns ein manuelles Diagramm unten an:
Aus dem manuellen Diagramm ist aus ersichtlich, dass der Verbraucher zunächst die reale Schnittstellenadresse des Dienstanbieters erhält und dann die Schnittstelle über die Adresse aufruft. Dann ist es für die Microservice -Architektur definitiv nicht ratsam, eine bestimmte Klassen -IP oder einen bestimmten Port zu erhalten und dann die Schnittstelle aufzurufen, sodass im Microservice ein Konzept des ServiceID entstanden ist. Der einfache Prozess wurde eingeführt, und das Folgende ist ein Beispiel, um ihn zu analysieren. Fügen Sie zunächst Abhängigkeiten hinzu, wie:
<Depopenty> <gruppe> org.springFramework.boot </Groupid> <artifactId> Spring-Boot-Starter-Web </artifactId> </abhängig> <depectIncy> <GroupID> org.springframework
Verwenden wir den im vorherigen Artikel integrierten Eureka_Server (Service Center) und Eureka_Provider (Service Provider), um Testfälle durchzuführen. Hier definieren ich das Modul eureka_consumer_ribbon als Verbraucherdienst; Erstellen Sie zunächst die Service -Layer -Klasse und Code: Code:
@ServicePublic Class UserService implementiert userInterface {@autowired Protected rastTemplate rastTemplate; @Override public morp <list <Mouser >> GetUsers (Morq rq) {return null; } @Override public string getmsg () {string str = restTemplate.getforObject ("http: // eureka-provider/msg", string.class); return str; }}Verwenden Sie hauptsächlich die Funktion rastTeMplate.getForObject von rastTemplate, und dann müssen Sie einen Controller definieren, um auf die erhaltenen Daten auf der Seite zu reagieren. Einfachheit halber verwenden Sie einfach die GetMSG -Serviceschnittstelle, um zu testen:
@RestControllerPublic Class UserController {@autowired Private UserService UserService; @Getmapping ("/msg") public String getmsg () {return userService.getMsg (); }}Schließlich fügen wir der Startklasse den folgenden Code hinzu. Beachten Sie, dass das @loadBalanced -Tag hinzugefügt werden muss, da die von uns eingeführte Eureka -Abhängigkeit (Dalston.Release -Version) enthält. Das Ribbon verkauft den Lastausgleichsalgorithmus. Wenn diese Annotation nicht hinzugefügt wird, muss die URL der Restmethode der verfügbare URL -Pfad sein. Wenn die Annotation hier hinzugefügt wird, können Sie natürlich die oben genannte ServiceID verwenden:
@SpringBootApplication @enablediscoveryClient // Verbraucher Client Public Class EurekaSUMERRIBBonApplication {@bean @loadBalanced // Ausgleich balancieren rastTemplate rastTemplate () {return New RestTemplate zurückgeben; } public static void main (String [] args) {SpringApplication.run (eurekaconumerribBonApplication.Class, args); }}Das Folgende ist der vom Verbraucher angezeigte Effekt:
Ruhe+Umfrage Custom einfache Konsumkomponenten
Die benutzerdefinierte Konsumkomponente ist fast die gleiche Zeichnung des Gesichtshandbuchs. Es soll zuerst die reale Schnittstellenadresse des Dienstanbieters erhalten und dann die URL über Rest aufrufen, um die entsprechende Ergebnisausgabe zu erhalten. Hier ist eine Shenniubanlance -Komponentenklasse:
/** * Erstellt von Shenniu am 2018/6 * <p> * rest+eureka+benutzerdefinierte client */ @componentpublic class shenniubanlance {@autowired private rastTemplate rastTemplate; @Autowired Private DiscoveryClient DiscoveryClient; / ** * Service Real Address ConcurrentHasMap <"Service Application Name", ("Real Interface IP", Anzahl der Besuche)> */ public static ConcurrentHasMap <String, Liste <MoService >> servicesMap = new ConcurrentHasMap <> (); /** * Setzen Sie den Service Provider -Informationen auf map */public void setServicesMap () {// Alle Service Provider ApplicationName List <string> appnames = DiscoveryClient.getServices () erhalten; // Die reale Adresse zu map for (String appname: appnames) {// Informationen zu einer Dienstanbieterliste <ServiceInstance> InstanceInfos = DiscoveryClient.getInstances (AppName) erhalten; if (instanceInfos.isempty ()) {Fortsetzung; } List <MoService> dienste = new ArrayList <> (); instanceInfos.foreach (b -> {moService service = new moService (); // Anzahl der aufgerufenen service.setwatch (0l); // real interface address service.seturl (b.geturi (). toString ()); dienste.add (Service);}); // Wenn es vorhanden ist, aktualisieren Sie ServicesMap.put (Appname.tolowerCase (), Services); }} / ** * Dienst ausgewählt nach der App * * @param appname * @return * / public moService choiceserviceByAppname (String appname) löst eine Ausnahme aus {Appname = appname.tolowerCase (); // einige App -Service -Sammlungsliste <MoService> servicemap = servicesmap.get (AppName); if (servicemap == null) {// Initialisieren Sie alle App Services setServicesMap (); servicemap = servicesMap.get (AppName); if (servicemap == NULL) {Neue Ausnahme werfen ("nicht zu finden" + appname + "verwandte Dienste"); }} // Die Dienstabfragemethode mit der geringsten Anzahl von Besuchen herausfiltern. // Datensatz +1 MoService.SetWatch (moService.getWatch () + 1) laden; Moervice zurückgeben; } / ** * automatisch die Informationen zur Zuordnung von Dienstanbietern aktualisieren * / @Scheduled (fixedDelay = 1000 * 10) public void refreshservicesmap () {setServicesMap (); } / ** * Anforderungsdienst erhalten, um die Rückgabedaten zu erhalten Versuchen Sie es mit {// Filter, um den Real Service MoService Service = ChoiceserviceByAppname (AppName) zu erhalten. // fordern Sie die URL des Service String apiurl = service.geturl () + "/" + serviceName an; System.out.println (apiurl); result = map! = null? restTemplate.getForObject (apiurl, tclass, map): restTemplate.getForObject (apiurl, tclass); } catch (Ausnahme ex) {ex.printstacktrace (); } Rückgabeergebnis; } / *** Serviceinformationen* / öffentliche Klasse MoService { / *** Anzahl der Ladedatensätze* / private Long Watch; /** * Real Interface -Adresse: http://xxx.com/api/add */private String url; public long getWatch () {return watch; } public void setWatch (lange Uhr) {this.watch = watch; } public String geturl () {return url; } public void seturl (String url) {this.url = url; }}}Das obige ist der Hauptimplementierungscode. Codelogik: Legen Sie die Informationen zur Dienstanbieter so ein, dass sie gemäß der App nach der Erzielung der Wahlmethode》》》》 den Dienst beantragt, die Rückgabedaten zu erhalten. Das Prinzip der Umfragesimplementierung besteht darin, eine Lastdatensatznummer zu verwenden, die nach jeder Anfrage automatisch +1 ist. Wenn Sie einen bestimmten Dienstanbieter erhalten möchten, wird eine Instanz des Mindestwerts durch die Datensatznummer herausgefiltert, und die Real Interface -URL wird gespeichert. Der Anruf muss nur so sein (natürlich kann er als Anmerkungen bezeichnet werden):
@Override public String getmsg () {String str = banlance.getServicedata ("eureka-provider", "msg", null, string.class); return str; }Es ist hier zu beachten, dass wir die Annotation @LoadBalanced in der vorherigen RastTemplate hinzugefügt haben, damit auf die Restanforderung in einem Nicht-IP (dh ServiceID) zugegriffen werden muss, um normal zu antworten, sonst wird ein Fehler aufgefordert, z. B. aufzufordern:
Einfach ausgedrückt, Sie müssen IP nicht mehr verwenden, da ein Lastausgleichsmechanismus vorhanden ist. Wenn wir diese Annotation entfernen, können unsere individuellen Komponenten erfolgreich ausgeführt werden, und die Renderings sind die gleichen wie in Beispiel 1, und die Karte wird nicht festhalten.
Informationen zur Anbieter von Dienstanbietern mit geplanten Aktualisierung erstellen
In der Microservice -Architektur müssen die Service -Cache -Informationen des Kunden rechtzeitig aktualisiert werden, da er ansonsten an die Down -URL anfordert. Basierend auf dieser Überlegung habe ich das Aktivierungs -Tag verwendet, um eine zeitgesteuerte Aktualisierung durchzuführen. Fügen Sie zuerst @EnablesScharning zur Startklasse hinzu und definieren Sie dann einen Dienst, der die Serviceinformationen aufblitzt, wie z. B.:
/ ** * Aktualisieren Sie die Informationen zur Kartierung der Dienstanbieter automatisch */ @Scheduled (fixedDelay = 1000 * 10) public void refreshServicesMap () {setServicesMap (); }Um den Testeffekt zu erleichtern, starten wir mit Port 2005 einen Anbieterdienst, wenn der Server, der Anbieter (2) und der Verbraucher gestartet wurden. Aktualisieren Sie dann die Verbraucherschnittstelle, um den Effekt anzuzeigen:
Zu diesem Zeitpunkt können Sie sehen, dass die Schnittstelle, die den Port 2005 anruft, erfolgreich aufgerufen wurde. Nachdem der neueste oder ungültige Dienst dem @Scheduled Timed -Service hinzugefügt wurde, erfüllt er den Anforderungen dessen, was Sie brauchen. Wenn Sie der Meinung sind, dass dieser Inhalt für Sie hilfreich ist, gefällt es Ihnen bitte, danke. Ich hoffe, es wird für das Lernen aller hilfreich sein, und ich hoffe, jeder wird Wulin.com mehr unterstützen.