Проект 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 Биджу Кунджуммена в блоге « все и вся» . |