0

J'ai quelques microservices de démarrage à ressort, qui sont déployés dans JBoss sur un environnement cloud. Ces services de démarrage sont des clients Eureka qui s'enregistrent sur le serveur Eureka. Voici un exemple:zuul eureka service id redirection

eureka: 
    client: 
    healthcheck: 
     enabled: true 
    serviceUrl: 
     defaultZone: ${DISCOVERY_URL:http://localhost:8761}/eureka/ 


    instance: 
    ip-address: 127.0.0.1 
    appname: user-regn-service-app 
    home-page-url-path: /user-regn-service-app 

Il enregistre l'application avec Eureka avec le nom d'utilisateur-regn-service app Eureka Homepage

Le serveur wildfly fonctionne à 8080 et l'utilisateur-regn-service-app est déployé sur le chemin du contexte/user-regn-service-app. Donc, le reste api est comme ci-dessous

localhost:8080/user-regn-service-app/regnUser 

Lorsque j'utilise Zuul comme passerelle api, la configuration est comme ci-dessous

zuul: 
    prefix: /api 
    routes: 
    test: 
     path: /test/** 
     service-id: USER-REGN-SERVICE-APP 
     strip-prefix: true 


ribbon: 
    eureka: 
    enabled: true 

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

Mais chaque fois que je fais appel à la passerelle Zuul api il est incapable de Reconnaître le chemin du contexte et redirige vers localhost: 8080 au lieu de localhost: 8080/user-regn-service-app.

http://localhost:8765/api/ -> 404 not found

http://localhost:8765/api/user-regn-service-app/ -> wildfly page d'accueil par défaut

http://localhost:8765/api/user-regn-service-app/user-regn-service-app/regnUser -> Redirige à l'enregistrement de l'utilisateur.

Comportement attendu: http://localhost:8765/api/test/regnUser doit rediriger vers l'enregistrement de l'utilisateur.

J'ai presque essayé toutes les combinaisons que j'ai reçues des blogs entre Zuul et Eureka pour faire ce qui suit mais pas de chance. Veuillez aviser s'il me manque quelque chose.

J'ai essayé d'utiliser le filtre personnalisé zuul personnalisé comme ci-dessous, mais il ne transmet pas au chemin Context requis. Le code est comme ci-dessous

@Component 
public class ZuulApiFilter extends ZuulFilter{ 

    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     System.out.println("original"+ ctx.get("requestURI")); 
     HttpServletRequest request = ctx.getRequest(); 
     String requestURI = request.getRequestURI(); 
     String contextAwareURI=requestURI.concat("user-regn-service-app/"); 
     ctx.set("requestURI", contextAwareURI); 
     return null; 
    } 

    @Override 
    public boolean shouldFilter() { 
     return true; 
    } 

    @Override 
    public int filterOrder() { 
     return 1; 
    } 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

} 

Le requestURI ne pas modifications après avoir réglé la nouvelle URI et ctx.set ("requestURI", contextAwareURI); request.getRequestURI(); affiche uniquement l'ancienne URI de demande.

Répondre

0

Pourriez-vous supprimer et essayez de définir:

strip-prefix: false

et essayez d'envoyer la demande à:

http://<zuul ip>:<zuul port>/api/test/....

Modifié:

@Tanmay Ghosh

Voici un exemple de code que je utilise pour le post de blog lié Zuul (encore en projet) que je vais publier dans les prochains jours:

Zuul « s application.yml:

... 
eureka: 
    client: 
    registerWithEureka: false 
    fetchRegistry: true 
    serviceUrl: 
     defaultZone: http://localhost:8000/eureka/ 

# ribbon.eureka.enabled: false 
zuul: 
    ignoredServices: "*" 
    routes: 
    zuulDemo1: 
     path: /zuul1/** 
# serviceId as registed with Eureka. Enabled and used when ribbon.eureka.enabled is true. 
     serviceId: demo-zuul-api1 
# zuul.routes.<the route>.url used when ribbon.eureka.enabled is false, serviceId is disabled. 
#  url: http://localhost:8600/ 
# stripPrefix set to true if context path is set to/
     stripPrefix: true 
... 

Et en fait mon repo serveur Zuul est public et disponible à: https://bitbucket.org/asimio/zuulserver et un récent blog à http://tech.asimio.net/2017/10/10/Routing-requests-and-dynamically-refreshing-routes-using-Spring-Cloud-Zuul-Server.html

une autre chose, est-ce le service Zuul utilise également un contexte d'application autre que /? Si oui, pourriez-vous essayer d'envoyer la demande via Zuul au: http://<zuul host>:<zuul port>/<zuul app context>/api/test/....?

+0

Si je fais fausse je peux accéder au-dessous http: // localhost: 8765/api/user-regn-service app/-> wildfly page d'accueil http: // localhost: 8765/api/user- regn-service-app/utilisateur-regn-service-app/userRegn -> Service Vous ne savez pas si une config est manquante –

+0

Ceci est déroutant, utilisez-vous JBoss et Weblogic? Si l'API écoute 'localhost: 8080' et utilise également le contexte d'application' user-regn-service-app', cela signifie que les requêtes doivent être envoyées à 'http: // localhost: 8080/user-regn-service-app/ '. stripPrefix est défini sur true si le chemin d'accès au contexte de l'API (pas le service Zuul) est défini sur/ – ootero

+0

Désolé pour la confusion, j'utilise Jboss Wildfly pour ce service et il est déployé à la racine de contexte/user-regn-service- application à 8080. http: // localhost: 8080/utilisateur-regn-service-app/ fonctionne bien, mais zuul est incapable de rediriger vers le service donné. Ai-je manqué quelque chose dans la config? –