Einführung
Wir bauen weiterhin auf dem Code aus früheren Blogs und fügen Ribbon -Komponenten hinzu, um Client -Lastausgleich zu bieten. Lastausgleich ist ein wichtiger Bestandteil der Erreichung von hohen Parallelität, hohen Leistung und skalierbaren Diensten. Es kann Anforderungen an verschiedene Server in einem Cluster verteilen, um die Belastung für jeden Server zu lindern. Der Client -Lastausgleich wird in Client -Programmen wie unser Webprojekt ausgeführt und wählt dann zufällig einen Server aus, um Anforderungen zu senden, indem die IP -Adressliste des Clusters abgerufen wird. Im Vergleich zum Lastausgleich von Server müssen keine Serverressourcen konsumiert werden.
Grundlegende Umgebung
GIT: Projektquellcode
Konfiguration aktualisieren
Dieses Mal müssen wir zwei Produktdienstprogramme vor Ort starten, um den Lastausgleich zu überprüfen. Daher müssen wir verschiedene Ports für das zweite Programm bereitstellen. Die Konfiguration des Feder Cloud Configuration Service Centers überschreibt die lokalen Systemumgebungsvariablen standardmäßig. Wir müssen den Port des Produktdienstes über die Systemumgebungsvariablen einstellen, daher müssen wir die Konfigurationsdatei des Produktdienstes im GIT -Repository des Konfigurationszentrums ändern.
Server: Port: 8081Spring: Cloud: Konfiguration: Degly-Override: True Override-System-Properties: Falsch
Der Standardwert der Zulassungsübergreifung ist wahr. Ich habe es geschrieben, um es zu erklären. Dies bedeutet, dass die Konfigurationselemente des Remote -Konfigurationszentrums die lokale Konfiguration überschreiben dürfen, nicht dass die lokale Konfiguration die Remote -Konfiguration überschreiben darf. Natürlich können wir es auf False einstellen, aber um genauere Regeln für die Berichterstattung vorzulegen, bleibt der Standardwert hier erhalten.
Wir haben Override-System-Properties = False hinzugefügt, dh, obwohl die Konfigurationsdatei des Remote-Konfigurationszentrums die lokale Konfiguration überschreiben kann und die lokalen Systemvariablen nicht überschreiben kann. Nach Abschluss der Änderung senden Sie es dem Git -Repository.
Fügen Sie außerdem einige Protokolle zum ProductController des ProductService -Projekts hinzu, um zu überprüfen, ob Lastausgleich effektiv ist:
Paket cn.zxuqian.controllers; import org.slf4j.logger; import org.slf4j.loggerfactory; ProductController {private static Logger log = loggerFactory.getLogger (productController.class); @RequestMapping (" /products") public String productList () {log.info ("Zugriff auf /produkte Endpunkt"); Rückkehr "Mantel, Jacke, Pullover, T-Shirt"; }}Konfigurieren Sie das Band für Web
Fügen Sie zunächst die Abhängigkeiten von Ribbon in pom.xml hinzu:
<Depopentcy> <gruppe> org.springFramework.cloud </Groupid> <artifactId> Spring-Cloud-Starter-Netflix-Ribbon </artifactid> </abhängig>
Ändern Sie dann die Anwendungsklasse und fügen Sie den folgenden Code hinzu:
@EnableCircuitbreaker@enablediscoveryClient@bullbonclient (name = "product-service")@SpringbootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.run (application.class, args); } @Bean @LoadBalanced public rastTemplate rest (rastTemplateBuilder Builder) {return Builder.build (); }} Hier verwenden wir die Annotation von @RibbonClient (name = "Product-Service"), um dieses Projekt als Client des Ribbon Load Balancing zu markieren. Es muss eine der Produktdienstcluster auswählen, um auf die erforderlichen Dienstleistungen zuzugreifen. Das Namensattribut hier entspricht dem im ProductService -Projekt konfigurierten Attribut für Spring.application.name.
Die @LoadBalanced Annotation gibt an, dass RestTemplate so konfiguriert ist, dass sie automatisch das LoadBalancerClient von Ribbon verwenden, um den URI des Dienstes auszuwählen und die Anforderung zu senden.
Wir fügen der ProductService -Klasse den folgenden Code hinzu:
@ServicePublic Class ProductService {private final rastTemplate rastTemplate; @Autowired Private DiscoveryClient DiscoveryClient; public productService (rastTemplate rastTemplate) {this.restTemplate = restTemplate; } @HyStrixCommand (fallbackMethod = "BackupproductList") public String productList () {list <ServiceInstance> Instances = this.discoveryClient.getInstances ("Product-Service"); if (Instanzen! } zurückkehren ""; } public String BackUproductList () {return "Jack, Pullover"; } public String productLtloadBalanced () {return this.restTemplate.getforObject ("http: // product-service/products", string.class); }}Hier wurde eine neue Produktladungsmethode hinzugefügt, auf die auf denselben Service wie die vorherige Produktlistenmethode zugegriffen wird. Hier ist der Host von URI zum Namen des zugegriffenen Dienstes geworden, der mit dem in @RibbonClient konfigurierten Namensattribut übereinstimmt. Fügen Sie schließlich den folgenden Code in unserem ProductController hinzu:
@RestControllerPublic Class ProductController {@autowired Private Products Service Productsservice; @RequestMapping ("/products") public String productList () {return productservice.productList (); } @RequestMapping ("/productslb") public String productLoLoLaLeBalanced () {return productService.ProductListLoadBalanced (); }}Um eine Methode zu erstellen, die speziell mit Anfragen /productsLB -Anforderungen behandelt wird, und ProductServie anrufen, um Lastausgleich zu bieten.
Zu diesem Zeitpunkt ist unser Code abgeschlossen. Der Code scheint einfach zu sein, aber tatsächlich verwenden alle Konfigurationen Standardwerte. Ribbon bietet Programmier- und Konfigurationsmethoden zum Konfigurieren von Ribbon -Client. Lassen Sie mich Ihnen eine kurze Einführung geben. Wenn Sie tiefer in das Band gehen, sehen wir uns an, wie die Konfiguration geändert werden kann. Ribbon liefert die folgende Konfiguration (die Schnittstelle befindet sich links und die Standardimplementierung befindet sich rechts):
Da unser Projekt Eureka verwendet, unterscheiden sich einige Konfigurationselemente von der Standardimplementierung. Beispielsweise verwendet Eureka DiscoveryEnableDniwsServerList anstelle von RibbonserverList, um eine Liste von Diensten auf Eureka zu erhalten. Nachfolgend finden Sie eine einfache Konfigurationsklasse von der offiziellen Spring -Website:
öffentliche Klasse Sayhelloconfiguration {@autowired iClientConfig RibbonClientConfig; @Bean public iping ribbonping (iclientConfig config) {return New pingurl (); } @Bean public iRule RibbonRule (iClientConfig config) {return New availabilityFilteringRule (); }}Die Tibbon sendet Ping nicht, um standardmäßig den Gesundheitszustand des Servers zu überprüfen, und der Standard ist normal. Dann wird Irune standardmäßig als Zoneavoidancerule implementiert, um die Zone mit vielen Problemen mit AWS EC2 zu vermeiden. Dies ist in der lokalen Testumgebung nicht verfügbar. Es wird dann durch VerfügbarkeitsFilteringRule ersetzt. Dies kann die Leistungsschalterfunktion ermöglichen, die mit einem Band geliefert wird, um Server zu filtern, die nicht ordnungsgemäß funktionieren.
prüfen
Starten Sie zunächst unseren ConfigServer Configuration Center -Service, starten Sie dann die Registrierung von Eureka Registration und Discovery Service und starten Sie dann zwei Produktservices. Der erste besteht darin, das Start des Spring-Boot-Boot: Run Plug-in auszufahren. Das zweite kann es mit einem neuen Port zur Verfügung stellen, die mit dem folgenden Befehl gestartet werden kann:
$ Server_port = 8082 MVN Spring-Boot: Ausführen
Starten Sie schließlich unser Web -Client -Projekt, besuchen Sie http: // localhost: 8080/productslb und aktualisieren Sie dann einige Male. Sie werden sehen, dass zwei Befehlszeilenfenster, die ProductService ausgeführt haben, zufällig angezeigt werden:
Zugang zum Endpunkt /Produkte
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.