Préface: l'architecture de microservice a inévitablement plusieurs instances de microservice unique. Alors, comment le client peut-il répartir les demandes aux instances de plusieurs microservices? Ici, nous devons utiliser l'équilibrage de la charge
1. Introduction au ruban
Ribbon est un équilibreur de charge publié par Netflix, qui aide à contrôler le comportement des clients HTTP et TCP. Après avoir configuré la liste d'adresses du fournisseur de services pour Ruban, le ruban peut automatiquement aider les consommateurs de services à demander en fonction de certains algorithmes d'équilibrage de charge. Le ruban nous fournit de nombreux algorithmes d'équilibrage de charge par défaut, tels que le sondage, le hasard, etc., qui peuvent également être personnalisés;
Github du ruban: https://github.com/netflix/ribbon
Lors de l'utilisation du ruban et de l'eureka dans SpringCloud, le ruban obtiendra automatiquement la liste des adresses du fournisseur de services d'Eurekaserver et en fonction de l'algorithme d'équilibrage de charge.
2. Combat réel du ruban
1 et 1 Créez eurekaserver, eurekaclient1, eurekaclient2. J'ai déjà mentionné l'utilisation d'Eureka, alors voici le code:
Eurekaserver:
Serverapplication.java
@ SpringbootApplication @ activyEurekaserverpublic class ServerApplication {public static void main (String [] args) {springApplication.run (serverapplication.class, args); }}pom.xml
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" XSI: ScheMalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion> 4.0.0 </ ModelVersion> <ProupId> com.cn </proncId> <ArtefactId> Eureka-Ribbon-Server </ Artifactid> <Dersion> 1.0-Snapshot </DERNIERS> <PERTERTIES> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </java.version> </propperties> <GroupId> org.springframework.boot </proupId> <Artifactid> printemps-boot-starter-parent </lefactive> <version> 1.5.13.release </ version> </pareplences> <dependency> <proupId> org.springframework. </proupId> <artifactid> </pultifactid> </ dépendance> <GroupId> org.springframework.cloud </proupId> <Artifactid> Spring-Cloud-Starter-eureka-server </retifactid> </dependency> </Dependance> </Dependency> </Dedency> <Dedencymanagement> <petences> <Dedency> <ProupId> org.springframework.cloud> </preendid> <ArtefactId> Spring-Cloud-Dependuces </ Artifactid> <DERSE> Edgware.sr3 </ Version> <Type> Pom </pote> <ccope> Import </ccope> </ Dependency> </Dependency> </Dedencymanagement> <! - Ajouter le plugin Spring-Boot Maven -> <uild> <gouchins> <Pluchin> <groupen <ArtefactId> Spring-Boot-Maven-Plugin </ ArfactId> </Glugin> </Glugins> </Duild> </randing>
application.properties
server.port = 8761 # Remarque: Ces deux configurations sont vraies par défaut. Vous devez passer à False, sinon une erreur sera signalée. Connot Connect Server # Indique s'il faut s'inscrire sur eurekaserver eureka.client.register-with-eureka = false # indique s'il faut obtenir des informations d'enregistrement à partir d'Eurekaserver eureka.client.fetch-registry = falseureka.client.service-url.defaultzone = http: // localhost: 8761 / eureka /
Eurekaclient1:
pom.xml
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" XSI: ScheMalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion> 4.0.0 </ ModelVersion> <ProupId> com.cn </proncId> <ArtefactId> eureka-ribbon-client </letefactive> <in version> 1.0-snapshot </-version> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </java.version> </propserties> <GroupId> org.springframework.boot </proupId> <Ertifactid> printemps-boot-starter-parent </lefactive> <version> 1.5.13.release </ version> </pareplences> <dependency> <proupId> org.springframework.cloud </prounid> </Dependency> <Dependency> <ProupId> org.springFramework.cloud </proncId> <ArtifActid> Spring-Cloud-Starter-eureka </ ArtifactId> </Dependency> </Dependency> </Dependency> </Dependency> <Dedency> <proupId> org.springFramework.Cloud </preendency> <ArtefactId> Spring-Cloud-Dependuces </ Artifactid> <DERSE> Edgware.sr3 </ Version> <Type> Pom </pote> <ccope> Import </ccope> </ Dependency> </Dependency> </Dedencymanagement> <! - Ajouter le plugin Spring-Boot Maven -> <uild> <gouchins> <Pluchin> <groupen <ArtefactId> Spring-Boot-Maven-Plugin </ ArfactId> </Glugin> </Glugins> </Duild> </randing>
server.port = 8762spring.application.name = client-8762eureka.client.service-url.defaultZone = http: // localhost: 8761 / eureka /
Ajoutez une instance d'appel à distance RestTemplate au conteneur dans la classe de démarrage et ajoutez une annotation chargebanancée pour faire de Rest -mplate a la possibilité de charger l'équilibrage:
@ SpringbootApplication @ ENablediscoveryClientPublic class ClientApplication {public static void main (String [] args) {springApplication.run (clientApplication.class, args); } / ** * @Description: Ajout de l'annotation @loadBalanced pour ajouter des capacités d'équilibrage de charge à RestTemplate * @param: * @return: * @author: * @date: 2018/6/15 * / @bean @loadBalanced Public RestTemplate Getresttemplate () {return new restTemplate (); }}Créez un contrôleur, injectez des instances de repos et chargebalancerclient:
Package com.cn.Controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadBalancer.LoadBerBerglient; Import Org.springFramework.Stereotype.Contre; org.springframework.web.bind.annotation.getMapping; import org.springframework.web.bind.annotation.responsebody; import org.springframework.web.client.resttemplate; / ** * @program: Springcloud-Example * @Description: * @Autor: * @create: 2018-06-15: * @Autor: * @create: 2018-06-15: 16: ** / @ ControllerPublic Class RibbonController {@Autowired Private LoadBalancer LoadBalancerClient; @Autowired Private RestTemplate RestTemplate; @GetMapping ("/ LoadInstance") @ResponseBody Public String LoadInstance () {ServiceInstance Choose = this.LoadBalancerClient.Choose ("Client-87"); System.out.println (Choose.getServiceId () + ":" + Choose.Gethost () + ":" + Choose.getport ()); return choisir.getServiceId () + ":" + Choose.Gethost () + ":" + Choose.Getport (); }} Package com.cn; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.cloud.client.discover 535504 * @create: 2018-06-15 16:05 ** / @ SpringbootApplication @ ENableDiscoveryClientPublic class ClientApplication {public static void main (String [] args) {SpringApplication.Run (clientApplication.class, args); }}Eurekaclient2:
pom.xml est cohérent avec eurekaclient1
application.xml:
server.port = 8763spring.application.name = client-87eureka.client.service-url.defaultZone = http: // localhost: 8761 / eureka
ClientController.java:
Package com.cn.contorller; import org.springframework.stereType.Controller; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.responsebody; / ** * @program: SpringCloud-Example * @Description: * @aUTHOR: @program: SpringCloud-Example * 2018-06-15 16:12 ** / @ ControllerPublic Class ClientController {@GetMapping ("/ GetUser") @ResponseBody public String getuser () {System.out.println ("Get User le succès"); Renvoie "réussir l'utilisateur"; }}2. Séquence de démarrage:
①. Démarrer eurekaserver =》 eurekaclient1 =》 eurekaclient2;
②. Modifiez ensuite Server.port = 8763 d'Application.properties dans eurekaclient2 à server.port = 8764, et recommencez le projet;
③. Ouvrez la page de configuration Eurekaserver (http: // localhost: 8761 /), comme suit:
④. Nous entrons http: // localhost: 8762 / LoadInstance dans la barre d'adresse et le rafraîchir plusieurs fois. Vous constaterez que les instances de port sont différentes à chaque fois que nous l'appelons, comme indiqué dans la figure ci-dessous:
⑤. Nous regardons la console, comme indiqué sur l'image:
À ce stade, le ruban a déjà commencé. N'est-ce pas très simple? Mais c'est juste l'application la plus simple, et c'est une perte de temps ... il n'y a pas de fin d'apprentissage!
Exemple de code: https://gitee.com/lfalex/springcloud-example