Статьи

Spring Cloud Zuul — написание фильтра

Проект Netflix OSS Zuul служит шлюзом для бэкэнд-сервисов и обеспечивает поддержку для добавления в пограничные функции, такие как безопасность, маршрутизация. В мире Zuul специфические функции предоставляются компонентами, называемыми Zuul Filter, и написать такой фильтр для проекта на основе Spring Cloud очень просто. Хорошая ссылка на добавление фильтра здесь . Здесь я хотел продемонстрировать две небольшие функции — решить, должен ли фильтр действовать на запрос, и, во-вторых, добавить заголовок перед пересылкой запроса.

Написание фильтра Зуула

Написание фильтра Zuul очень просто для Spring Cloud , все, что нам нужно сделать, это добавить bean-компонент Spring, который реализует ZuulFilter, поэтому для этого примера это будет выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Service;
 
 
@Service
public class PayloadTraceFilter extends ZuulFilter {
 
    private static final String HEADER="payload.trace";
 
    @Override
    public String filterType() {
        return "pre";
    }
 
    @Override
    public int filterOrder() {
        return 999;
    }
 
    @Override
    public boolean shouldFilter() {
      ....  
    }
 
    @Override
    public Object run() {
     ....
    }
}

Некоторые подробности высокого уровня этой реализации, это было помечено как «Тип фильтра» «pre», что означает, что этот фильтр будет вызываться до того, как запрос будет отправлен в бэкэнд-сервис, filterOrder определяет, когда этот конкретный фильтр вызывается в цепочка фильтров, если Фильтр определяет, был ли этот фильтр вообще вызван для этого запроса, и запуск содержит логику для фильтра.

Итак, на мой первый взгляд, должен ли этот фильтр действовать на поток вообще — это можно сделать по запросу на основе запроса, моя логика очень проста — если запрос uri начинается с / samplesvc, тогда этот фильтр должен действовать на запрос ,

1
2
3
4
5
6
@Override
public boolean shouldFilter() {
    RequestContext ctx = RequestContext.getCurrentContext();
    String requestUri = ctx.getRequest().getRequestURI();
    return requestUri.startsWith("/samplesvc");
}

и второе соображение по изменению заголовков запроса к бэкэнд-сервису:

1
2
3
4
5
6
@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    ctx.addZuulRequestHeader("payload.trace", "true");
    return null;
}

Служба поддержки, получающая такой запрос, может искать заголовок и действовать соответствующим образом, скажем, в данном конкретном случае, просматривая заголовок «payload.trace» и решая зарегистрировать входящее сообщение:

1
2
3
4
5
6
@RequestMapping(value = "/message", method = RequestMethod.POST)
public Resource<MessageAcknowledgement> pongMessage(@RequestBody Message input, @RequestHeader("payload.trace") boolean tracePayload) {
    if (tracePayload) {
        LOGGER.info("Received Payload: {}", input.getPayload());
    }
....

Вывод

Как показано здесь, Spring Cloud действительно упрощает добавление фильтров Zuul для любых краевых нужд. Если вы хотите изучить этот пример немного дальше, у меня есть примеры проектов, доступных в
мой репозиторий github

Ссылка: Spring Cloud Zuul — написание фильтра от нашего партнера по JCG Биджу Кунджуммена в блоге « все и вся» .