web-dev-qa-db-fra.com

L'équilibreur de charge n'a pas de serveur disponible pour le client: réunion

Pendant que j'essaie d'atteindre le service meeting via la passerelle Zuul, Zuul n'est pas en mesure de transmettre la demande au service respectif. Je fais face aux erreurs suivantes:

  1. nettflix.zuul.exception.ZuulException: erreur de transfert
  2. Provoqué par: com.netflix.client.ClientException: l'équilibreur de charge n'a pas de serveur disponible pour le client: réunion

Permettez-moi de partager l'application.yml pour le service, la passerelle eureka et zuul.

EurekaClient: Application.yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
    lease-renewal-interval-in-seconds: 300
  client:
    register-with-eureka: false
    fetch-registry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

ZuulGateWay: application.yml

server:
  port: 8085

spring:
  application:
    name: gatekeeper


zuul:
  routes:
    meeting: /meeting/**
    serviceId: meeting

ribbon:
  eureka:
    enabled: false

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

ZuulGateWay: SpringBootApplication

package com.sagarp.gatekeeper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class MeetingApplication {

    public static void main(String[] args) {
        SpringApplication.run(MeetingApplication.class, args);
    }
}

Ma classe de service (réunion): Application.yml

server:
  port: 0
spring:
  application:
    name: meeting
  datasource:
    url: jdbc:mysql://localhost:3306/sagarp?useSSL=false
    username: myUserName
    password: myPassWord
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
     ddl-auto: update

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    lease-renewal-interval-in-seconds: 5

Ma classe de service (réunion): SpringBootApplication

package com.sagarp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class MeetingApplication {

    public static void main(String[] args) {
        SpringApplication.run(MeetingApplication.class, args);
    }
}

Comme vous pouvez le voir, la configuration garantit que tous mes services sont découverts par le client eureka.

Dans la console eureka, j'ai vérifié la même chose, les zuul gateway Et my service(meeting) les deux sont visibles.

Pour une meilleure vue, vous pouvez visiter mon dépôt git. https://github.com/sagar-patro/demo-microservices

Toute aide serait très appréciable

11
bibliophilsagar

Réponse courte

ribbon:
  eureka:
    enabled: false

Spring Cloud Netflix Zuul utilise le ruban de Netflix pour effectuer client -side load balancing, et par défaut, Le ruban utiliserait Netflix Eureka pour découverte de service. Vous ignorez découverte de service, vous avez donc défini ribbon.eureka.enabled Sur false. Étant donné que le ruban ne peut plus utiliser Eureka pour rechercher des services, vous doit spécifier une URL pour le service meeting:

meeting:
  ribbon:
    listOfServers: localhost:8080

Réponse élargie

Je vais être plus clair pour vous.

La dépendance org.springframework.cloud:spring-cloud-starter-netflix-zuul , que vous utilisez actuellement dans le projet gatekeeper, a plusieurs dépendances de compilation:

com.netflix.zuul:zuul-core
org.springframework.boot:spring-boot-starter-web        
org.springframework.boot:spring-boot-starter-actuator       
org.springframework.cloud:spring-cloud-netflix-zuul
org.springframework.cloud:spring-cloud-starter      
org.springframework.cloud:pring-cloud-starter-netflix-hystrix
org.springframework.cloud:spring-cloud-starter-netflix-ribbon
org.springframework.cloud:spring-cloud-starter-netflix-archaius

Comme vous le voyez, il constitue de nombreux composants regroupés autour du module com.netflix.zuul:zuul-core (y compris Eureka pour la découverte d'instance et le ruban pour le routage):

enter image description here

Lorsque vous lancez l'application gatekeeper, la configuration par défaut ZuulProxyAutoConfiguration est appliquée. Il importe les classes de configuration du ruban:

@Configuration
@Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class,
        RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class,
        RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class,
        HttpClientConfiguration.class })
@ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class)
public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { ... }

HttpClientRibbonConfiguration, à son tour, initialise RibbonLoadBalancingHttpClient qui est responsable des messages d'erreur que vous avez vus.

Ce RibbonLoadBalancingHttpClient utilise par défaut ZoneAwareLoadBalancer qui provient d'un package com.netflix.ribbon:ribbon-loadbalancer:

Par défaut, les équilibrages de charge Zuul utilisent le ZoneAwareLoadBalancer du ruban. L'algorithme est un tour de rôle des instances disponibles dans la découverte, avec zone de disponibilité suivi des succès pour la résilience. L'équilibreur de charge conservera les statistiques pour chaque zone et supprimera une zone si les taux de défaillance sont supérieurs à un seuil configurable.

Si vous souhaitez utiliser votre propre équilibreur de charge personnalisé, vous pouvez définir la propriété NFLoadBalancerClassName pour cet espace de noms client Ribbon ou remplacer la méthode getLoadBalancerClass() dans le DefaultClientChannelManager. Notez que votre classe doit étendre DynamicServerListLoadBalancer.

Il explique que Zuul délègue le routage et l'équilibrage de charge aux composants du ruban et prouve que vous utilisez réellement le ruban dans le projet gatekeeper.

À moins que vous ne choisissiez un équilibreur de charge différent, vous devriez opter pour ma réponse originale.
J'espère que cela aidera.

11
Andrew Tobilko