Introducción
Continuamos construyendo el código de los blogs anteriores y agregamos componentes de cinta para proporcionar un equilibrio de carga del cliente. El equilibrio de carga es una parte importante para lograr servicios de alta concurrencia, alto rendimiento y escalables. Puede distribuir solicitudes a diferentes servidores en un clúster para aliviar la carga en cada servidor. El equilibrio de carga del cliente se ejecuta en programas de clientes, como nuestro proyecto web, y luego seleccione aleatoriamente un servidor para enviar solicitudes obteniendo la lista de direcciones IP del clúster. En comparación con el equilibrio de carga del servidor, no requiere consumir recursos del servidor.
Entorno básico
GIT: código fuente del proyecto
Actualizar la configuración
Esta vez necesitamos iniciar dos programas de servicio de productos localmente para verificar el equilibrio de carga, por lo que necesitamos proporcionar diferentes puertos para el segundo programa. La configuración del Centro de servicio de configuración de Spring Cloud anulará las variables de entorno del sistema local de forma predeterminada. Necesitamos establecer el puerto del servicio del producto a través de las variables de entorno del sistema, por lo que necesitamos modificar el archivo de configuración del servicio de producto en el repositorio Git Center de configuración.
servidor: puerto: 8081spring: nube: configuración: permiso-override: verdadera anulación del sistema-propiedades: falso
El valor predeterminado de Permatir-Override es verdadero. Lo escribí para explicarlo. Significa que los elementos de configuración del centro de configuración remota pueden sobrescribir la configuración local, no que la configuración local pueda sobrescribir la configuración remota. Por supuesto, podemos establecerlo en FALSO, pero para proporcionar reglas de cobertura más precisas, el valor predeterminado se conserva aquí.
Hemos agregado anulación del sistema-propiedades = false, es decir, aunque el archivo de configuración del centro de configuración remota puede sobrescribir la configuración local, no sobrescribe las variables del sistema local. Después de completar la modificación, envíelo al repositorio GIT.
Además, agregue algunos registros al ProductController del proyecto Productservice para verificar si el equilibrio de carga es efectivo:
paquete cn.zxuqian.controllers; import org.slf4j.logger; import org.slf4j.loggerFactory; import org.springframework.web.bind.annotation.requestMapping; import og.springFrameWork.web.bind.annotation.restController; @restertroller Logger log = loggerFactory.getLogger (productController.class); @RequestMapping (" /Products") public String productList () {log.info ("Access to /Products Endpoint"); regresar "abrigo, chaqueta, suéter, camiseta"; }}Configurar cinta para la web
Primero agregue las dependencias de la cinta en pom.xml:
<Spendency> <MoupRoMID> org.springframework.cloud </groupid> <artifactId> spring-ncloud-starter-netflix-ribbon </artifactid> </pendency>
Luego modifique la clase de aplicación y agregue el siguiente código:
@EnableCircuitbreaker@EngabledScoveryClient@RibbonClient (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 (); }} Aquí usamos la anotación @RibbonClient (name = "Servicio de producto") para marcar este proyecto como un cliente de equilibrio de carga de cinta. Necesita seleccionar uno de los grupos de servicios de productos para acceder a los servicios requeridos. El atributo de nombre aquí corresponde al atributo Spring.Application.Name configurado en el Proyecto Productservice.
La anotación @LoadBalanced indica que RESTTemplate se configurará para usar automáticamente LoadBalancerClient de Ribbon para seleccionar el URI del servicio y enviar la solicitud.
Agregamos el siguiente código a la clase de servicios de productos:
@ServicePublic ProductsService {RestTemplate RestTemplate final privado; @Autowired Private DiscoveryClient DiscoveryClient; Public Productservice (RestTemplate RestTemplate) {this.restTemplate = RestTemplate; } @HystrixCommand (fallbackmethod = "backupproductList") public string productList () {list <serviceInstance> instancias = this.discoveryclient.getInstances ("producto-servicio"); if (instances! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instancias.get (0) .geturi () + "/productos", string.class); } devolver ""; } public String BackupProductList () {return "Jack, Sweater"; } public String productListListloadBalanced () {return this.resttemplate.getForObject ("http: // producto-servicio/productos", string.class); }}Aquí se ha agregado un nuevo método ProductListLoadBalanced, al que se accede al mismo servicio que el método ProductList anterior, pero se equilibra la carga con el cliente de cinta. Aquí, el host de URI se ha convertido en el nombre del servicio a acceder, lo cual es consistente con el atributo de nombre configurado en @ribbonclient. Finalmente, agregue el siguiente código en nuestro ProductController:
@RestControllerPublic Class ProductController {@aUtowired Productservice Productservice; @RequestMapping ("/Products") public String productList () {return Productservice.productList (); } @RequestMapping ("/ProductsLB") public String ProductListLoadBalanced () {return Productservice.ProductListLoadBalanced (); }}Para crear un método que maneja específicamente /ProductsLB solicitudes y llame a Productservie para proporcionar un equilibrio de carga.
En este punto se completa nuestro código. El código parece simple, pero de hecho todas las configuraciones usan valores predeterminados. Ribbon proporciona métodos de programación y configuración para configurar el cliente de cinta. Déjame darte una breve presentación. Cuando profundice en la cinta, echemos un vistazo a cómo modificar su configuración. Ribbon proporciona la siguiente configuración (la interfaz está a la izquierda y la implementación predeterminada está a la derecha):
Debido a que nuestro proyecto usa Eureka, algunos elementos de configuración son diferentes de la implementación predeterminada. Por ejemplo, Eureka utiliza DiscoveryEnnabledNIWSServerList en lugar de RibBonserverList para obtener una lista de servicios registrados en Eureka. Hay una clase de configuración simple a continuación, del sitio web oficial de Spring:
clase pública sayhelloconfiguration {@aUtowired ivlientconfig ribbonClientConfig; @Bean Public Iping Ribbonping (IClientConfig config) {return new pingUrl (); } @Bean public Irule Ribbonrule (ICLIENTCONFIG CONFIG) {return New DisponibleFilterEnsule (); }}Ribbon no enviará ping para verificar el estado de salud del servidor de forma predeterminada, y el valor predeterminado es normal. Entonces Irune se implementa como ZoneAvaidancerule de forma predeterminada para evitar la zona con muchos problemas con AWS EC2. Esto no está disponible en el entorno de prueba local. Luego se reemplaza con disponibilidad FilteringRule. Esto puede habilitar la función del disyuntor que viene con la cinta para filtrar servidores que no funcionan correctamente.
prueba
Primero, inicie nuestro servicio de configuración del centro de configuración de configuración, luego inicie el servicio de registro y descubrimiento de registro eureka, y luego inicie dos servicios de productos. El primero es usar el complemento Spring-Boot: Ejecutar para iniciar, y el segundo es proporcionarle un nuevo puerto, que se puede iniciar con el siguiente comando:
$ Server_port = 8082 MVN Spring-Boot: Ejecutar
Finalmente, inicie nuestro proyecto de cliente web, visite http: // localhost: 8080/ProductsLB, y luego actualice algunas veces. Verá que dos Windows de línea de comandos que ejecutan Productservice aparecerán aleatoriamente:
Acceso a /punto final de productos
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.