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:
- nettflix.zuul.exception.ZuulException: erreur de transfert
- 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
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
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):
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éthodegetLoadBalancerClass()
dans leDefaultClientChannelManager
. Notez que votre classe doit étendreDynamicServerListLoadBalancer
.
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.