Prefacio: la arquitectura de microservicio inevitablemente tiene múltiples instancias de un solo microservicio. Entonces, ¿cómo puede el cliente asignar solicitudes a instancias de múltiples microservicios? Aquí necesitamos usar el equilibrio de carga
1. Introducción a la cinta
Ribbon es un equilibrador de carga liberado por Netflix, que ayuda a controlar el comportamiento de los clientes HTTP y TCP. Después de configurar la lista de direcciones del proveedor de servicios para la cinta, Ribbon puede ayudar automáticamente a los consumidores de servicios a solicitar en función de algún algoritmo de equilibrio de carga. Ribbon nos proporciona muchos algoritmos de equilibrio de carga de forma predeterminada, como encuestas, aleatoriedad, etc., que también se pueden personalizar;
Github de Ribbon: https://github.com/netflix/ribbon
Cuando se usa Ribbon y Eureka en SpringCloud, Ribbon obtendrá automáticamente la lista de direcciones de proveedores de servicios de Eurekaserver y se basará en el algoritmo de equilibrio de carga.
2. Combate real de cinta
1. Cree Eurekaserver, Eurekaclient1, Eurekaclient2. He mencionado el uso de Eureka antes, así que aquí está el código:
Eurekaserver:
ServerAplication.java
@SpringBootApplication@EnseDableeureKaserverPublic Class ServerApplication {public static void main (string [] args) {springApplication.run (serverAplication.class, args); }}pom.xml
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" 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> <MoupRid> com.cn </proupid> <artifactid> eureka-ribbon-server </arfactid> <versión> 1.0-snapshot </versions> <properties> <ject.build.sourceencoding> utf-8 </project.build.sourceEncoding> <java.version> 1.8 <java.version> </plossies> <MoupRid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </arfactid> <verserse> 1.5.13.release </versión> </parent> <pendencies> <pendency> <proupid> org.springFramework. </groupid> <artifactid> </artifactid> </dependence> <MoupRoD> org.springframework.cloud </groupid> <artifactid> Spring-Cloud-Starter-eureka-Server </arfactid> </pendency> </pendency> </pendency> </spertency> <SpendencyManagement> <epardency> <epardency> <uproupid> org.pringFrameWork.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <versever> edgware.sr3 </versión> <proye> pom </pype> <cope> import </cope> </pendence> </dependency> </dependencymanagement> <!-Agregar plumín maven de spring-boot-> <1ting> <glugin> <glugin> <grupid> org. <artifactID> spring-boot-saven-plugin </artifactid> </glugin> </glugins> </build> </proyecto>
Aplicación. Properties
Server.port = 8761#NOTA: Estas dos configuraciones son verdaderas de forma predeterminada. Debe cambiar a falso, de lo contrario se informará un error. Connot Connect Server# indica si debe registrarse en eurekaserver eureka.client.register-with-eureka = false# indica si debe obtener información de registro de eurekaserver eureka.client.fetch-registry = falseeureka.client.service-url.defaultzone = httpp: // localhost: 8761/eureka/eureka/eureka/
Eurekaclient1:
pom.xml
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" 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> <MoupRid> com.cn </groupid> <artifact> <versión> 1.0-snapshot </versewer> <properties> <proyect.build.sourceEncoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </Java.version> </Properties> <Elent> <MoupRid> Org.SpringframeWork.Boot </proupid> <artifactid> spring-boot-starter-parent </artifactid> <versión> 1.5.13.release </versión> </parent> <pendencies> <pendency> <uproupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-ribbon </artifactid> </pendency> <spendency> <MoupRid> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> </dependency> </dependency> </pendency> </dependency> <pendencyManagement> <pendencies> <pendency> <proupid> org.springframework.cloud </groupid> <artifactid> spring-cloud-dependencies </artifactid> <versever> edgware.sr3 </versión> <proye> pom </pype> <cope> import </cope> </pendence> </dependency> </dependencymanagement> <!-Agregar plumín maven de spring-boot-> <1ting> <glugin> <glugin> <grupid> org. <artifactID> spring-boot-saven-plugin </artifactid> </glugin> </glugins> </build> </proyecto>
server.port = 8762spring.application.name = Client-8762eureka.client.service-url.defaultzone = http: // localhost: 8761/eureka/
Agregue la instancia de llamada remota RestTemplate al contenedor en la clase de inicio y agregue la anotación de carga de carga para que RestTemplate tenga la capacidad de equilibrar el equilibrio de carga:
@Springbootapplication@habilitados en la clase de ClientApplication de clase de Public Public {public static void main (string [] args) {springapplication.run (clientApplication.class, args); }/** * @Description: Agregar la anotación @LoadBalanced para agregar capacidades de equilibrio de carga a RestTemplate * @param: * @return: * @author: * @date: 2018/6/15 */@Bean @LoadBalanced public ResttEmplate getRestTemplate () {return New RestTemplate ();; }}Cree un controlador, inyecte RestTemplate y LoadBalancerClient Instancias:
paquete com.cn.controller; import org.springframework.beans.factory.annotation.aUtowired; import org.springframework.cloud.client.serviceInstance; import org.springframework.cloud.client.loadBalancer.loadBalancerClient; import org.springframe org.springframework.web.bind.annotation.getMapping; import org.springframework.web.bind.annotation.responseBody; import org.springframework.web.client.resttemplate;/** * @program: springcloud-example * @Description: * @author: * @create: 2018-151515151515151515:06 **/ @ControllerPublic Class RibbonController {@AUTOWIREDIRDIRIRD LoadBalancerClient LoadBalancerClient; @AUtoWired private RestTemplate RestTTemplate; @GetMapping ("/LoadInstance") @ResponseBody public String LoadInstance () {ServiceInstance elige = this.loadBalancercclient.Choose ("Client-87"); System.out.println (elige.getServiceId ()+":"+elección.gethost ()+":"+elección.getport ()); return elige.getServiceId () + ":" + elige.gethost () + ":" + elección.getport (); }} paquete com.cn; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; import og.springframework.cloud.client.discovery.engodediscoveryClient;/** * @program: springcloud-example * @@Desettion: * 535504 *@Create: 2018-06-15 16:05 **/@springbootapplication@habilitionCoveryClientPublic clase ClientApplication {public static void main (string [] args) {springApplication.run (clientApplication.class, args); }}Eurekaclient2:
pom.xml es consistente con eurekaclient1
Application.xml:
servidor.port = 8763spring.application.name = client-87eureka.client.service-url.defaultzone = http: // localhost: 8761/eureka
ClientController.java:
paquete com.cn.contorller; import org.springframework.steretype.controller; import org.springframework.web.bind.annotation.getMapping; import og.springframework.web.bind.annotation.ResponseBody;/** * @program: treingcloud-example: @Description: * @Description: * @Description: * 2018-06-15 16:12 **/ @ControllerPublic Class ClientController {@getMapping ("/getUser") @ResponseBody Public String getUser () {System.out.println ("Obtener el usuario exitoso"); devolver "Obtener el usuario exitoso"; }}2. Secuencia de inicio:
①. Inicio eurekaserver =》 eurekaclient1 =》 eurekaclient2;
②. Luego cambie server.port = 8763 de Application.Properties en Eurekaclient2 a Server.port = 8764, e inicie el proyecto nuevamente;
③. Abra la página de configuración de Eurekaserver (http: // localhost: 8761/), como sigue:
④. Ingresamos http: // localhost: 8762/loadInstance en la barra de direcciones y lo actualizamos varias veces. Encontrará que las instancias portuarias son diferentes cada vez que lo llamemos, como se muestra en la figura a continuación:
⑤. Estamos mirando la consola, como se muestra en la imagen:
En este punto, Ribbon ya ha comenzado. ¿No es muy simple? Pero esta es la aplicación más simple, y es una pérdida de tiempo ... ¡no hay fin para el aprendizaje!
Código de muestra: https://gitee.com/lfalex/springcloud-example