Schauen wir uns anschließend an, wie Sie die Serviceinstanz erhalten, welche Verarbeitung nach der Erlangung durchgeführt wurde und wie die Serviceinstanz nach der Verarbeitung ausgewählt wird.
In drei Teile teilen:
Konfiguration
Im Konfigurationsabschnitt des vorherigen Artikels "Die Prinzipien des Spring Cloud Ribbon" können Sie feststellen, dass der Standard -Last -Balancer ZoneeAwareloadbalancer ist.
Schauen Sie sich die Konfigurationsklasse an.
Standort:
Spring-Cloud-Netflix-Core-1.3.5.Release.jarorg.springframework.cloud.netflix.ribbonribbonclientConfiguration.class
@Suppresswarnings ("Abschaltung")@configuration@EnableConfigurationProperties // Bestellung ist hier wichtig, zuletzt sollte der Standard sein, zuerst sollte optional sein // siehe https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653@import( {okhttpribbonConfiguration.class, restclientribbonfiguration.class, httpclentribbonation uMit @Bean @ConditionalonmissingBean public iloadbalancer ribbonloadBalancer (iClientConfig -Konfiguration, Serverlist <Server> Serverlist, ServerListFilter <Server> Serverlistfilter, iRule -Regel, iPing Ping, ServerListupdater Serverlistupdater) {itropertiesFactiesfactory.issetor. issetory. issetory. issetory. issetory. issetors (rotalr. this.PropertiesFactory.get (iLoadBalancer.Class, config, Name); } Neue ZoneAwareloadBalancer <> zurückgeben (Konfiguration, Regel, Ping, Serverlist, ServerListFilter, ServerListupDater); } // weggelassen}In die Instanz von config, regel, ping, serverlist, serverlistfilter, serverListupdater injiziert.
Konfiguration: Konfigurieren Sie die Instanz.
Regel: Lastausgleichspolitikinstanz.
Ping: Ping -Instanz.
ServerList: Holt und aktualisiert eine Instanz des Dienstes.
ServerListFilter: Service -Filterinstanz.
ServerListupDater: Service -Informationen Aktualisierungsinstanz.
@Suppresswarnings ("Abschaltung")@configuration@EnableConfigurationProperties // Bestellung ist hier wichtig, zuletzt sollte der Standard sein, zuerst sollte optional sein // siehe https://github.com/spring-cloud/spring-cloud-netflix/issues/2086#issuecomment-316281653@import( {okhttpribbonConfiguration.class, restclientribbonfiguration.class, httpclentribbonation uMit @Bean @ConditionalonmissingBean public iclientConfig RibbonClientConfig () {defaultClientConfigImpl config = new DefaultClientConFigImpl (); config.loadProperties (this.name); Rückgabekonfiguration; } @Bean @ConditionalonmissingBean public iRule Ribbonrule (iclientConfig config) {if (this.propertiesfactory.isset (iRule.class, name)) {return this.propertiesfactory.get (iRule.class, config, name); } Zoneavoidancerule Regel = neuer Zoneavoidanal (); regel.initwithniwsconfig (config); Rückgaberegel; } @Bean @ConditionalonmissingBean public iping ribbonping (iclientConfig config) {if (this.propertiesfactory.isset (iping.class, name)) {return this.propertiesfactory.get (iping.class, config, name); } return New Dummyping (); } @Bean @ConditionalonmissingBean @SuppressWarnings ("Deaktiviert") public serverlist <Server> ribBonserverList (iclientConfig) {if (this.propertiesFactory.isset (Serverlist.class, Name) {return this } ConfigurationBasedServerList ServerList = new ConfigurationBasedServerList (); serverlist.initwithniwsconfig (config); Serverlist zurückgeben; } @Bean @ConditionalonmissingBean public ServerListupdater Ribbonverlistupdater (iClientConfig -Konfiguration) {Neue ForderingServerListupdater (config) zurückgeben; } @Bean @ConditionalonmissingBean public iloadbalancer ribBonloadBalancer (iClientConfig -Konfiguration, Serverlist <Server> ServerListFilter <Server> serverlistfilter, iRule -Regel, iPing ping, serverlistupdater serverlistupdater) {if (this.Propertiesfactory.isset this.PropertiesFactory.get (iLoadBalancer.Class, config, Name); } Neue ZoneAwareloadBalancer <> zurückgeben (Konfiguration, Regel, Ping, Serverlist, ServerListFilter, ServerListupDater); } @Bean @ConditionalonmissingBean @SuppressWarnings ("Unkontrolliert") public serverlistFilter <Server> RibbonserverListFilter (iClientConfig) {if (this.Th -Propertiesfactory.isset (serverlistFilter.class) {concopertiesfactory.getory.get, name, cononald.Properties). } ZonePreferenceServerListFilter filter = new zonePreferenceServerListFilter (); filter.initwithniwsconfig (config); Rückgabefilter; } @Bean @ConditionalonmissingBean Public RibbonloadBalancerText RibbonloadBalancerText (iLoadBalancer LoadBalancer, iClientConfig -Konfiguration, RetryHandler RetryHandler zurückgeben {Neue RibbonloadBalancerText (LoadBalancer, Config, RetypryHandler); } // weggelassen}Konfigurieren Sie hier relevante Beispiele hier
Konfiguration: StandardClientConfigImpl.
Regel: Zoneavoidanzer.
Ping: Dummyping.
Serverlist: configurationBasedServerList, Konfigurationsbasierte Serviceliste.
ServerListFilter: ZonePreferenceServerListFilter.
ServerListupDater: PollingServerListupDater.
Es ist zu beachten, dass die Instanz von ServerList hier Konfigurationsbasisserverlist ist, eine Instanz, die Serviceinformationen erhält, wenn Eureka nicht verwendet wird, und wird aus der Konfigurationsdatei erhalten.
Wenn Sie also Eureka verwenden, müssen Sie Serviceinformationen vom Eureka Server erhalten. Welche Instanz sollte dafür verwendet werden?
Bei der Aktivierung von Eureka -Service -Erkennung wird die Konfigurationsklasse der EurekaribbonClientConfiguration zuerst übernommen.
Standort:
Spring-Cloud-Netflix-Eureka-Client-1.3.5.Release.jarorg.springframework.cloud.netflix.ribbon.EURECAEEREURKARIBBONCLIENTCONFIGURATION.CLASS
@Configuration @commonsLogPublic -Klasse EurekaribbonClientConfiguration {// @bean @ConditionalonmissingBean public iPing Ribbonping (iClientConfig) {if (this.propertiesfactory.isset (iping.class, serviceInture)) {return this. } NiwsdiscoveryPing ping = new NiwsdiscoveryPing (); ping.initwithniwsconfig (config); Ping zurückgeben; } @Bean @ConditionalonmissingBean public serverlist <?> Ribbonserverlist (iclientConfig config, Anbieter <eurekaClient> eurekaclientProvider {if (this.propertiesfactory.isset (serverlist.clas)) {return this. } DiscoveryEnableDniwsServerList DiscoveryServerList = new DiscoveryEnableDsNiWSServerList (config, eurekaclientProvider); DOMAINEXACTIONINGINGERVILILISTERSE ServerList = new DomaineExtractingServerList (DiscoveryServerList, config, this. ApproximateZoneFromHostName); Serverlist zurückgeben; } // weggelassen}Nach der ersten Verwendung der EurekaribbonClientConfiguration -Konfiguration werden die Instanzen tatsächlich
Konfiguration: StandardClientConfigImpl.
Regel: Zoneavoidanzer.
Ping: NiwsdiscoveryPing.
ServerList: DomaineExtractingServerList, intern erfassteableDniwsServerList, die tatsächlich eine Liste von Serviceinformationen durch Service -Erkennung erhalten.
ServerListFilter: ZonePreferenceServerListFilter.
ServerListupDater: PollingServerListupDater.
Dienste erhalten
Bevor Sie den Zugriff auf Serviceinformationen finden, bearbeiten Sie zunächst die Vererbungsbeziehung der Klasse des Lastausgleichs.
Das Konstrukt der übergeordneten Klasse DynamicicServerListLoadBalancer wird im Konstrukt von ZoneeawareloadBalancer aufgerufen.
Standort:
Ribbon-Loadbalancer-2.2.2.jar
com.netflix.loadbalancer
Zonee -Wareloadbalancer.CLASS
Bei der Konstruktion von DynamicserverListLoadBalancer wird die Restofinit -Funktion aufgerufen.
Ribbon-Loadbalancer-2.2.2.jar
com.netflix.loadbalancer
DynamicserverListLoadBalancer.class
void restOfinit (iclientConfig clientConfig) {boolean primEconnection = this.isenablePrimingConnections (); // Schalten Sie dies aus, um eine doppelte asynchrone Grundierung in BaseloadBalancer zu vermeiden. EnableAndinitLearnNewServersFeature (); Updatelistofservers (); if (primEconnection && this.getPrimeConnections ()! } this.setEnablePrimingConnections (primEconnection); Logger.info ("DynamicicServerListLoadBalancer für Client {} initialisiert: {}", clientconfig.getClientname (), this.toString ()); }Zunächst wird die Serviceliste regelmäßig aktualisiert, indem die EnableAnDInitLearnNewServersFeature -Methode aufgerufen wird, und dann sofort die Funktion updatelistofservers aufrufen, um die Service -List -Informationen sofort zu erhalten und zu aktualisieren.
Schauen wir uns zunächst die EnableAndinitLearnNewServersFeature -Methode an. Tatsächlich wird die Startmethode der Service -Information -Aktualisierungsinstanz der Serviceliste aufgerufen, um die Funktionsfunktion für zeitliche Aktualisierung zu starten.
/ ** * Feature, mit der wir der Liste der vorhandenen Server neue Instanzen (von AMIS) hinzufügen können, dass die LB diese Methode anwendet, wenn Sie diese * Feature aktivieren */ public void EnableAndInitLearnNewServersFeature () {Logger.info ("Verwendung serienfisch {) {). ServerListupDater.Start (UpdateAction); } Das Beispiel für Service -List -Informationen aktualisiert hier die in der Konfigurationsphase konfigurierte PollingServerListupdater -Instanz. Schauen Sie sich die Konstruktion an und starten Sie die Methode dieser Klasse.
public class pollingServerListupdater implementiert ServerListupdater {// private statische lange Liste der Listofservers_Cache_Update_delay = 1000; // mscs; private statische int listofservers_cache_repeat_interval = 30 * 1000; // mscs; // Private endgültige Atomicboolean isActive = New Atomicboolean (Falsch); private volatile long lastUpdated = system.currentTimemillis (); private letzte lange Initialdelayms; private endgültige lange Refreshintervalme; // geringfügig public pollingServerListupdater (iclientConfig ClientConfig) {this (listofservers_cache_update_delay, getReFreshIntervalms (ClientConfig)); } public pollingServerListupdater (endgültige lange initialdelayms, endgültige lange Aktualisierungsintervalms) {this.initialdelayms = initialdelayms; this.reFreshIntervalms = RefreshIntervalms; } @Override public synchronisierte void start (endgültige UpdateAction updateAction) {if (isactive.ConPareAnDSet (false, true)) {endgültiger Runnable Wrapperrunnable = new Runnable () {@Override public void run () {isActive.get () {if (platonedfuture! } zurückkehren; } try {UpdateAction.doupDate (); lastUpdated = system.currentTimemillis (); } catch (Ausnahme e) {logger.warn ("fehlgeschlagen einen Update -Zyklus", e); }}}}; afulEdfuture = getReFreshExecutor (). PlanewithFixedDelay (WrapperRunnable, InitiDelayms, RefreshIntervalms, TimeUnit.Milliseconds); } else {logger.info ("bereits aktiv, no-op"); }} // weglassen}Aus der Konstruktion und der konstanten Definition wird die Ausführung um eine Sekunde verzögert und das Update wird standardmäßig alle 30 Sekunden durchgeführt. Sie können die Aktualisierungszeit zwischen der Konfiguration ändern.
Nach der Startmethode soll ein Zeitplan eröffnet werden, der regelmäßig ausgeführt wird und updateAction.doupdate () regelmäßig ausgeführt wird.
Kehren Sie zur Start -Methode -Methode Caller DynamicserverListLoadBalancer -Klasse zurück und sehen Sie sich die Definition der UpdateAction -Instanz an.
Protected Final ServerListupdater.UpDateAction UpdateAction = new ServerListupdater.UpDateAction () {@Override public void doupdate () {UpdatelistofServers (); }};Tatsächlich wird die Aktualisierungsmethode für die DynamicserverlaLoLeLoLeBalancer -Klasse aufgerufen, die mit dem Pfad übereinstimmt, um die Liste der Serviceinformationen unmittelbar nach dem Startzeit -Update zu aktualisieren.
Sehen Sie sich die UpdatelistofServers -Methode fort.
public void updatelistofservers () {list <T> servers = new ArrayList <T> (); if (serverListImpl! Logger.debug ("Liste der Server für {} erhalten von Discovery Client: {}", getIdentifier (), Server); if (filter! = null) {servers = filter.getFilteredListOfServers (Server); Logger.debug ("gefilterte Liste der Server für {} erhalten von Discovery Client: {}", getIdentifier (), Server); }} updateAllServerList (Server); }1. Erhalten Sie die Serviceinformationsliste über die ServerList -Instanz.
2. Filtern Sie die Liste der erhaltenen Serviceinformationen über die ServerListFilter -Instanz.
3. Speichern Sie die Liste der gefilterten Serviceinformationen in LoadBalancerStats als State Hold.
Schauen wir es uns als nächstes getrennt an.
1. Erhalten Sie die Serviceinformationsliste über die ServerList -Instanz.
Die ServerList -Instanz ist die in der Konfigurationsphase generierte DomainExtractingServerList. Die Serviceinformationen werden an die DiscoveryEnabledniwsServerList delegiert.
public class DiscoveryEnableDniWSServerList erweitert die AbstractServerList <DiscoveryEnableableDServer> {// @Override Public List <DiscoveryEnableDServer> GetInitialListofServers () {return erhaltenerversViadiscovery (); } @Override öffentliche Liste <DiscoveryEnableDServer> getupdatedListListOfServers () {return erhaltenerversViadiscovery (); } private Liste <DiscoveryEnableDserver if (eurekaclientProvider == null || eurekaclientProvider.get () == null) {logger.warn ("eurekaclient wurde noch nicht initialisiert, eine leere Liste zurückgibt"); NeuarrayList <DiscoveryEnableableDServer> () zurückgeben; } Eurekaclient eurekaclient = eurekaclientProvider.get (); if (vipaddresses! für (InstanceInfo II: ListoFinStanceInfo) {if (ii.getStatus (). Equals (InstanCestatus.Up)) {if (SollteOverridePort) {if (logger.isdebugenable ()) {logger.debug ("übergepasste Port auf Clientname:" + clientname + to "bis } // Kopie ist erforderlich, da der InstanceInfo -Builder nur die ursprüngliche Referenz verwendet, // und wir möchten die globale Eureka -Kopie des Objekts, das möglicherweise von anderen Clients in unserem SysteminstanceInfo Copy = new InstanceInfo (ii) verwendet wird, nicht beschädigt werden. if (isSecure) {ii = new InstanceInfo.builder (kopieren) .setsecurePort (oversidePort) .build (); } else {ii = new InstanceInfo.builder (copy) .setPort (oversidePort) .build (); }} DiscoveryEnableDServer Des = new DiscoveryEnableDServer (ii, isspecture, sollte Usepaddr); Des.Setzone (DiscoveryClient.getZone (ii)); serverlist.add (DES); }} if (serverlist.size ()> 0 && prioritizeVipadDressBasedServers) {break; // Wenn die aktuelle Vipaddress Server hat, verwenden wir keine nachfolgenden auf Vipaddress -basierten Server}}} return ServerList; } // weggelassen}Es ist zu erkennen, dass tatsächlich alle Serviceinstanzinformationen vom Eureka -Server über den Eureka -Client über den Eureka -Client erhalten und die Online -Instanzen in DiscoveryEnableDServer -Instanzen mit Zoneninformationen verpackt und in die Serviceliste eingesetzt werden.
2. Filtern Sie die Liste der erhaltenen Serviceinformationen über die ServerListFilter -Instanz.
Die ServerListFilte -Instanz ist der in der Konfigurationsphase generierte ZonePreferenceServerListFilter und wird durch Aufrufen der GetFilteredListOfServers -Methode der Instanz gefiltert.
@Data@EqualsandHashCode (Calluper = False) öffentlicher Klasse ZonePreferenceServerListFilter erweitert ZoneAffinityServerListFilter <Server> {private String -Zone; @Override public void initwithniwsconfig (iclientConfig NiwsclientConfig) {Super.initwithniwsconfig (NiwsclientConfig); if (configurationManager.getDeploymentContext ()! = null) {this.zone = configurationManager.getDePloymentContext (). }} @Override öffentliche Liste <Server> getFilteredListOfServers (List <Server> Server) {List <Server> output = super.getFilteredListOfServers (Server); if (this.zone! = null && output.size () == servers.size ()) {list <server> local = new ArrayList <Server> (); für (Serverserver: Ausgabe) {if (this.zone.equalSignoreCase (server.getZone ())) {local.add (Server); }} if (! local.isempty ()) {return Local; }} Rückgabeausgabe; }}In der GetFilteredListOfServers -Methode möchten Sie als erstes den gleichen Namen der Elternklasse anrufen, um zuerst zu filtern. Tatsächlich filtert die übergeordnete Klasse auch Dienste im gleichen Bereich wie die Verbraucherseite. Darüber hinaus werden einige intelligente Urteile hinzugefügt, um sicherzustellen, dass die Filterung im selben Bereich nicht ausgeführt wird, wenn der Fehler/die Last hoch ist oder wenn nur wenige verfügbare Instanzen verfügbar sind.
In zonePreferenceServerListFilter.getFilteredListOfServers müssen jedoch die Dienste derselben Zone noch herausgefiltert und verwendet werden. Wer hat gesagt, dass die Klasse hier ZonePreference ist?
Dies ist eine ziemlich seltsame Sache, und es fühlt sich an, dass das intelligente Urteil der Elternklasse keine Wirkung hat.
Werfen wir einen Blick auf die harte Arbeit von ZoneaffinityServerListFilter.getFilteredListListOfServers.
public class zoneaffinityServerlistFilter <T erweitert Server> Erweitert AbstractServerListFilter <T> Implementiert IClientConfigaware {// private boolean schützbarezoneafffinität (Liste <T> gefiltert) {if (! } if (zoneExclusive) {return true; } LoadBalancerStats Statistiken = GetloadBalancerStats (); if (stats == null) {return zoneaffinity; } else {logger.debug ("Bestimmung festlegen, ob die Zone -Affinität mit gegebener Serverliste aktiviert werden soll: {}", gefiltert); ZoneSnapshot snapshot = stats.getZonesnapshot (gefiltert); double loadPerServer = snapshot.getloadPerServer (); int InstanceCount = snapshot.getInstanceCount (); int circucteReakerTrippedCount = snapshot.getCircuitTrippedCount (); if ((((double) circuitBreakerTrippedCount) / instanceCount >= blackOutServerPercentageThreshold.get() || loadPerServer >= activeReqeustsPerServerThreshold.get() || (instanceCount - circuitBreakerTrippedCount) < availableServersThreshold.get()) { logger.debug("zoneAffinity is overriden. BlackoutServerpercentage: {}, activeReQeustSperServer: {}, Verfügabererverver: GetFilteredListOfServers (Liste <T> Server) {if (zone! this.zoneeiffinitys.getServerOrlyPredicate ());Zunächst werden die Dienste derselben Zone wie die Verbraucherseite herausgefiltert, und dann werden die Dienste derselben Zone durch schützbarezoneaffinität (filteredServers) bestimmt, um festzustellen, ob die Dienste derselben Zone angenommen werden können oder alle Dienste angenommen werden können.
Bei der Methode SHOERBABLABLEZOREAFFITY wird ein Schnappschuss für Dienste derselben Zone durchgeführt, und die Anzahl der Fälle, die durchschnittliche Last und die Anzahl der Fälle dieser Dienste werden zur Berechnung und Beurteilung erhalten.
Sie können sich die Werte der wichtigsten Indikatoren in der Initwithniwsconfig -Methode ansehen.
Entscheidungsbedingungen:
Prozentsatz der Leistungsschalter> = 0,8 (Anzahl der Leistungsschalter/Anzahl der Dienstfälle)
Durchschnittslast> = 0,6
Anzahl der verfügbaren Instanzen <2 (Anzahl der Instanzen - Anzahl der defekten Instanzen)
Wenn die Urteilsbedingungen erfüllt sind, werden alle Dienste verwendet, um die Verfügbarkeit zu gewährleisten.
Wie oben erwähnt, ist jedoch die intelligenten Operationen, die in ZoneaffinityServerListFilter durchgeführt werden.
Natürlich können Sie jedoch ZoneaffinityServerListFilter -Instanzen über benutzerdefinierte Konfigurationen verwenden.
3. Speichern Sie die Liste der gefilterten Serviceinformationen in LoadBalancerStats als State Hold.
Follow -up updateAllServerList(servers); Und Schritt für Schritt tiefer werden Sie feststellen, dass es tatsächlich in LoadBalancerStats gespeichert wird und die Dienste zu diesem Zeitpunkt in HashMap<String, List<Server>> Struktur gemäß der Zonengruppierung und der Schlüssel ist Zone gespeichert.
Wählen Sie einen Dienst aus
Der Last -Balancer, der die IloadBalancer -Schnittstelle implementiert, wird verwendet, um Dienste durch die Implementierung der ChoicesServer -Methode auszuwählen, und der ausgewählte Dienst wird als Zielanforderungsdienst verwendet.
Schauen Sie sich die ZoneeawareloadBalancer.chooServer -Methode an.
@Override public Server scoSoServer (Objektschlüssel) {if (! Enabled.get () || getloadBalancerStats (). Return Super.ChooServerver (Schlüssel); } Server server = null; probieren {loadBalancerStats lbstats = getloadBalancerStats (); Karte <String, ZonesNapshot> ZoneSnapshot = Zoneavoidancerule.CreateSnapshot (lbstats); logger.debug ("Zone Snapshots: {}", ZoneSnapshot); if (tiggeringLoad == null) {TriggeringLoad = DynamicPropertyFactory.getInstance (). getDoUbleProperty ("ZoneAwareniwsDiscoveryloadBalancer." + this.getName () +. } if (tiggeringBlackoutpercentage == null) {Auslöserblackoutpercentage = DynamicPropertyFactory.getInstance (). } Set <string> verfügbar ordnungsgemäß = zoneavoidancerule.getAVailableZones (ZoneSnapShot, TriggeringLoad.get (), TriggeringBlackoutpercentage.get ()); logger.debug ("verfügbare Zonen: {}", verfügbar); if (verfügbarezones! logger.debug ("Zone ausgewählt: {}", Zone); if (zone! Server = ZoneloadBalancer.chooServer (Schlüssel); }}} catch (Exception E) {logger.Error ("Fehler beim Auswählen von Server mit Zone AWARE Logic für lader balancer = {}", name, e); } if (server! = null) {return server; } else {logger.debug ("Zone Vermeidungslogik wird nicht aufgerufen."); Return Super.ChooServerver (Schlüssel); }}Beachten Sie, dass es hier zwei Verwendungen gibt:
1. Schalten Sie die zonenbewusste Lastausgleich aus, indem Sie ZoneavareniwsdiscoveryloadBalancer konfigurieren.
2. Verwenden Sie die Zonenwahrnehmung, oder die Anzahl der Zonen ist> 1.
Schauen wir uns nacheinander an
1. Schalten Sie die zonenbewusste Lastausgleich aus, indem Sie ZoneavareniwsdiscoveryloadBalancer konfigurieren.
In diesem Fall wird die übergeordnete Klassen -Baseloadbalancer -ChooServer -Methode aufgerufen.
public server wesoseServer (Objektschlüssel) {if (counter == null) {coption = createCounter (); } counter.increment (); if (regel == null) {return null; } else {try {return regel.choose (Schlüssel); } catch (Ausnahme e) {logger.warn ("loadBalancer [{}]: Fehler auswählen, der Server für Schlüssel {}", Name, Schlüssel, e); null zurückkehren; }}}Die hier verwendete Richtlinienregel für Lastausgleich ist tatsächlich die während der Konfigurationsphase erzeugte Zoneavoidancerule -Richtlinieninstanz, die beim Erstellen des Zone -WaReloadballers übertragen wurde.
public void setRule (IRULE -Regel) {if (regel! = null) {this.rule = rel; } else { / * Standardregel * / this.rule = new RoundRobinrule (); } if (this.rule.getloadBalancer ()! = this) {this.rule.setloadBalancer (this); }}Angenommen, wenn es keine Konfiguration gibt, wird die Standard -Richtlinieninstanz der RoundRobinrule verwendet.
2. Verwenden Sie die Zonenwahrnehmung, oder die Anzahl der Zonen ist> 1.
public Server wählterver (Objektschlüssel) {if (! enabled.get () || getloadBalancerStats (). Return Super.ChooServerver (Schlüssel); } Server server = null; probieren {loadBalancerStats lbstats = getloadBalancerStats (); Karte <String, ZonesNapshot> ZoneSnapshot = Zoneavoidancerule.CreateSnapshot (lbstats); logger.debug ("Zone Snapshots: {}", ZoneSnapshot); if (tiggeringLoad == null) {TriggeringLoad = DynamicPropertyFactory.getInstance (). getDoUbleProperty ("ZoneAwareniwsDiscoveryloadBalancer." + this.getName () +. } if (tiggeringBlackoutpercentage == null) {Auslöserblackoutpercentage = DynamicPropertyFactory.getInstance (). } Set <string> verfügbar ordnungsgemäß = zoneavoidancerule.getAVailableZones (ZoneSnapShot, TriggeringLoad.get (), TriggeringBlackoutpercentage.get ()); logger.debug ("verfügbare Zonen: {}", verfügbar); if (verfügbarezones! logger.debug ("Zone ausgewählt: {}", Zone); if (zone! Server = ZoneloadBalancer.chooServer (Schlüssel); }}} catch (Exception E) {logger.Error ("Fehler beim Auswählen von Server mit Zone AWARE Logic für lader balancer = {}", name, e); } if (server! = null) {return server; } else {logger.debug ("Zone Vermeidungslogik wird nicht aufgerufen."); Return Super.ChooServerver (Schlüssel); }}In diesem Fall wird die Zoneavoidancerule -Lastausgleichsrichtlinie standardmäßig verwendet.
Holen Sie sich die Snapshot -Informationen der Zone.
Holen Sie sich die verfügbare Zone, indem Sie Zoneavoidancerule beobachten.
Nachdem alle verfügbaren Zonen erhalten wurden, wählen Sie zufällig eine.
Und aus dieser Zone wählen Sie den Dienst über den BaseloadBalancer der übergeordneten Klasse von ZoneawareloadBalancer.chooServer. Wie oben kompiliert, wird die RoundrobenRule -Richtlinie standardmäßig bei Baseloadbalancer nicht mehr eine Regel erfolgt, um einen Dienst zu finden.
Tatsächlich ist es immer noch das Problem, den oben genannten ZonePreferenceServer -Filter -Filter zu erhalten. Tatsächlich wird nur ein Dienst mit der gleichen Zone wie die Verbraucherseite herausgefiltert. Daher kann die Funktion der Auswahl von Diensten aus verfügbaren Zonen in Teil 2 nicht erreicht werden. Um es zu erreichen, muss der Filter ersetzt werden.
Zusammenfassen:
Der konfigurierte Load Balancer startet den Zeitplan, um Serviceinformationen zu erhalten. Bei der Verwendung des Eureka -Kunden werden alle Informationen zur Serviceinstanz aus dem Eureka -Dienst erhalten, und die verwendeten Dienste werden über den Filter herausgefiltert. Standardmäßig filtert der Filter nur Dienste, die der Verbraucherseite entsprechen. Wenn Sie eine hohe Verfügbarkeit sicherstellen möchten, können Sie den ZoneaffinityServerListFilter -Filter konfigurieren, und die filterierte Dienstliste wählt den entsprechenden Service aus, indem die Lastausgleichsrichtlinie der iRule -Schnittstelle implementiert wird. Wenn Sie die zonebewusste Richtlinie verwenden, können Sie den entsprechenden Service aus der Zone mit guten Lastbedingungen auswählen.