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);