Introduction
Nous continuons à construire sur le code à partir des blogs précédents et à ajouter des composants du ruban pour fournir un équilibrage de charge client. L'équilibrage des charges est une partie importante de la réalisation de services élevés de concurrence et de hautes performances. Il peut distribuer des demandes à différents serveurs dans un cluster pour soulager le fardeau de chaque serveur. L'équilibrage de la charge du client est exécuté dans des programmes clients, tels que notre projet Web, puis sélectionnez au hasard un serveur pour envoyer des demandes en obtenant la liste d'adresses IP du cluster. Par rapport à l'équilibrage de la charge du serveur, il ne nécessite pas de consommation de ressources de serveur.
Environnement de base
Git: code source du projet
Mettre à jour la configuration
Cette fois, nous devons démarrer deux programmes de services de produits localement pour vérifier l'équilibrage de la charge, nous devons donc fournir des ports différents pour le deuxième programme. La configuration de Spring Cloud Configuration Service Center remplacera les variables d'environnement du système local par défaut. Nous devons définir le port du service produit via les variables d'environnement système, nous devons donc modifier le fichier de configuration du service produit dans le référentiel Git Center de configuration.
Serveur: Port: 8081Spring: Cloud: Config: Override Autorride: True Override-System-Properties: False
La valeur par défaut de la surride d'autorisation est vraie. Je l'ai écrit pour l'expliquer. Cela signifie que les éléments de configuration du centre de configuration distant sont autorisés à écraser la configuration locale, et non que la configuration locale est autorisée à écraser la configuration distante. Bien sûr, nous pouvons le définir sur False, mais pour fournir des règles de couverture plus précises, la valeur par défaut est conservée ici.
Nous avons ajouté Override-System-Properties = False, c'est-à-dire, bien que le fichier de configuration du centre de configuration distant puisse écraser la configuration locale, ne pas écraser les variables système locales. Une fois la modification terminée, soumettez-la au référentiel GIT.
De plus, ajoutez quelques journaux au produit ProductController du projet ProductService pour vérifier si l'équilibrage de charge est efficace:
package cn.zxuqian.Controllers; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bindContation.restController; @RestCrollers {private static logger log = loggerfactory.getLogger (productController.class); @RequestMapping ("/ Products") public String ProductList () {log.info ("Access to / Products Endpoint"); retour "manteau, veste, pull, t-shirt"; }}Configurer le ruban pour le Web
Ajoutez d'abord les dépendances du ruban dans pom.xml:
<dependency> <proupId> org.springframework.cloud </rombasid> <ArtifactId> Spring-Cloud-Starter-Netflix-Ribbon </ Arfactive> </Dependance>
Modifiez ensuite la classe d'application et ajoutez le code suivant:
@ CapableCircuitBreaker @ eablediscoveryClient @ rubbonClient (name = "Product-Service") @ SpringbootApplicationPublic class Application {public static void main (String [] args) {springApplication.run (application.class, args); } @Bean @loadBalanced Public RestTemplate Rest (RestTemplateBuilder Builder) {return builder.build (); }} Ici, nous utilisons l'annotation @RibbonClient (name = "Product-Service") pour marquer ce projet en tant que client d'équilibrage de la charge de ruban. Il doit sélectionner l'un des clusters de services de produits pour accéder aux services requis. L'attribut de nom correspond ici à l'attribut Spring.Application.name configuré dans le projet ProductService.
L'annotation @loadBalanced indique que Rest -mplate sera configurée pour utiliser automatiquement le Ruban LoadBalancerClient pour sélectionner l'URI du service et envoyer la demande.
Nous ajoutons le code suivant à la classe ProductService:
@ServicePublic Class ProductionService {private final restTemplate RestTemplate; @Autowired Private DiscoveryClient DiscoveryClient; public ProductsService (RestTemplate RestTemplate) {this.RestTemplate = RestTemplate; } @Hystrixcommand (FallBackMethod = "BackupproductList") public String productList () {list <ServiceInstance> instances = this.discoveryclient.getInstances ("Product-Service"); if (instances! = null && instances.size ()> 0) {return this.RestTemplate.getForObject (instances.get (0) .geturi () + "/ produits", string.class); } retour ""; } public String backupproductList () {return "jack, pull"; } public String productListLoadBalanced () {return this.restTemplate.getForObject ("http: // Product-Service / Products", string.class); }}Une nouvelle méthode ProductListloadBalanced a été ajoutée ici, qui est accessible au même service que la méthode ProductList précédente, mais il est équilibré avec le client du ruban. Ici, l'hôte d'Uri est devenu le nom du service à accéder, ce qui est cohérent avec l'attribut de nom configuré dans @RibbonClient. Enfin, ajoutez le code suivant dans notre produit Contrôleur:
@RestControllerPublic Class ProductController {@Autowired Private ProductService ProduceService; @RequestMapping ("/ Products") public String ProductList () {return productservice.productList (); } @RequestMapping ("/ ProductsLB") public String productListOLDBALAND () {return productService.ProductListLoadBalanced (); }}Pour créer une méthode qui gère spécifiquement les demandes / produitslb, et appelez Productsservie pour fournir un équilibre entre charge.
À ce stade, notre code est terminé. Le code semble simple, mais en fait toutes les configurations utilisent des valeurs par défaut. Ribbon fournit des méthodes de programmation et de configuration pour configurer le client du ruban. Permettez-moi de vous donner une brève introduction. Lorsque vous approfondissez le ruban, examinons comment modifier sa configuration. Ribbon fournit la configuration suivante (l'interface est à gauche et l'implémentation par défaut est à droite):
Parce que notre projet utilise Eureka, certains éléments de configuration sont différents de l'implémentation par défaut. Par exemple, Eureka utilise DiscoveryEnabledNiWSServerList au lieu de RibBonServerList pour obtenir une liste de services enregistrés sur Eureka. Il existe une classe de configuration simple ci-dessous, du site officiel de Spring:
classe publique SayHelloConfiguration {@autowired iClientConfig rubbonClientConfig; @Bean Public Iping Ribbonping (IclientConfig config) {return new Pingurl (); } @Bean Public Irule Ribbonrule (IclientConfig Config) {return new DisponibilitéFilterringRule (); }}Le ruban n'enverra pas de ping pour vérifier l'état de santé du serveur par défaut, et la valeur par défaut est normale. Ensuite, Irune est implémentée en tant que ZoneavoidancerUle par défaut pour éviter la zone avec de nombreux problèmes avec AWS EC2. Ceci n'est pas disponible dans l'environnement de test local. Il est ensuite remplacé par la disponibilité-Filteringrule. Cela peut activer la fonction de disjonction de circuit qui est livré avec du ruban pour filtrer les serveurs qui ne fonctionnent pas correctement.
test
Tout d'abord, démarrez notre service de configuration de configuration de configuration, puis démarrez le service d'enregistrement et de découverte d'Eureka d'enregistrement, puis démarrez deux services de produits. Le premier consiste à utiliser le plug-in Spring-Boot: Exécutez pour démarrer, et le second est de lui fournir un nouveau port, qui peut être démarré avec la commande suivante:
$ Server_port = 8082 MVN Spring-boot: Exécuter
Enfin, démarrez notre projet client Web, visitez http: // localhost: 8080 / productsLB, puis actualisez plusieurs fois. Vous verrez que deux lignes de commande Windows exécutant ProductService apparaîtront au hasard:
Accès aux points finaux / produits
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.