Uso ZuulFilter encaminamiento hacia adelante

Antecedentes: El proyecto de reconstrucción, las necesidades de la línea de producción de URL que se transmitirá a través de la puerta de acceso a un servicio diferente según sea necesario, ruta personalizada previamente usado, el archivo de configuración de la ruta yml transmita la manera de hacerlo, tener un problema que es zuul.route <auto. definir un ServiceId> .Path = / account / ** zuul.route. <personalizar un ServiceId> = .serviceId cuenta, pero no puede garantizar la solicitud de URL, ruta / cuenta / ruta URL coherente detrás de la cuenta de servicio con el interior, por lo que este será un problema. En este caso, sólo en otra forma, y ​​que es enviada a través del filtro

1. Código de puerta de enlace

@Component
 pública  clase CommonServicePathFilter extiende ZuulFilter { 

    privado  última  estática Cadena GETWAY_FOWARD_PREFIX = "getway_forward_" ; 

    privada  última  estática Cadena GETWAY_COMPAY_CONFIG_KEY = "getway_company" ; 

    @Autowired 
    privada redisTemplate RedisTemplate; 

    @ Override 
    pública Cadena tipofiltro () {
        // 这里很重要,必须是ruta 
        de retorno "ruta" ; 
    } 

    @ Override 
    pública  int filterOrder () {
         volver 1 ;
    }


    @ Override 
    pública de ejecución del objeto () lanza ZuulException { 
        RequestContext ctx = RequestContext.getCurrentContext (); 
        String url = ctx.getRequest () getRequestURI ().; 
        Mapa <String, String> forwardMap =   getForwardMap (url);
        si (forwardMap =! nula ) { 
            Cadena fowardUrl = forwardMap.get (url); 
            Cadena serviceId = getServiceId (fowardUrl); 
            Cadena requestUrl = getRequestUrl (fowardUrl, serviceId);
              //1.设置目标servicio的Controller的路径
            ctx.put (FilterConstants.REQUEST_URI_KEY, requestUrl);
             // 2.设置目标servicio的serviceId 
            ctx.put (FilterConstants.SERVICE_ID_KEY, serviceId); 
        } 
        Devolver  nulo ; 
    } 
    Privada Cadena getServiceId (String url) {
         si (url.startsWith ( "/" )) { 
            Cadena temp = url.substring (1 );
            retorno temp.split ( "/") [0 ]; 
        } Demás {
             retorno  nula ; 
        } 
    } 

    PrivadaGetRequestUrl String (String URL, el serviceId String) {
         retorno url.substring (serviceId.length () hecho +1 ); 
    } 

    @ Override 
    pública  de Boole shouldFilter () {
        retorno  a la verdadera ; 
    } 



    privada mapa <String, String> getForwardMap (originalUrl la cadena) {
            // TODO: aquí es devolver un mapa, pasar una originUrl, un retorno a la url hacia adelante 
    } 

}

 

2. Pit

 Una gran cantidad de información en línea dicen que hay que hacer

ctx.put (FilterConstants.REQUEST_URI_KEY, requestUrl); 
pero después de que yo uso, se ha informado que 404, entonces el seguimiento del servicio, encontraron que, de hecho, también hay un ctx ServiceId la propiedad, que se mantiene con el mapeo URL original ServiceId petición actual el mismo, pero si desea reenviar serviceId no es esto, entonces se informará 404, es necesario redefinir serviceId aquí,
 ctx.put (FilterConstants.SERVICE_ID_KEY, serviceId);

Supongo que te gusta

Origin www.cnblogs.com/logan-w/p/12498943.html
Recomendado
Clasificación