Я работаю над архитектурой на основе микроуслуг, которая включает Spring-Boot, Eureka, Zuul на ключевом уровне.Моя проблема заключается в следующем:
Service1: / api / v1 / service1 POSTService2: / api / v2 / service2 POST
application.yml выглядит как
zuul:
routes:
service1:
path: /api/v1/**
service2:
path: /api/v1/**
common:
path: /common/endpoint
Кроме того, я написал фильтр, в котором я пытаюсь получить ввод через эту общую конечную точку и вычесть на основеотправить запрос, куда направить запрос, т. е. на service1 или service2.Но здесь я застрял и, похоже, ничего не получается, даже после нескольких поисков в Google и проверки проблем других людей, я пока не могу найти свое решение.Вот как выглядит мой Фильтр:
public class CommonEndpointFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
if ((ctx.get("proxy") != null) && ctx.get("proxy").equals("common")) {
return true;
}
return false;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
InputStream in = (InputStream) ctx.get("requestEntity");
if (in == null) {
try {
in = request.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
String body = null;
try {
body = StreamUtils.copyToString(in, Charset.forName("UTF-8"));
if (body.indexOf("somethingrelatedtoservice1") != -1) {
//forward the request to Service1: /api/v1/service1
} else if (body.indexOf("somethingrelatedtoservice2") != -1) {
//forward the request to Service2: /api/v1/service2
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public String filterType() {
return FilterConstants.ROUTE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
}
Я не могу понять, как направить запрос дальше этим службам, а затем получить ответ для отправки обратно через общую конечную точку.
Что я здесь не так делаю?Как я могу продолжить, чтобы мне не пришлось использовать жестко запрограммированный URL-адрес какой-либо службы.Пожалуйста, проведите меня через это.
Я пробовал некоторые вещи, такие как:1. используя DiscoveryClient для получения экземпляра и использования метода контекста setRouteHost.Он всегда выбрасывает исключительный URL-адрес zuulfilter, неправильный общий / конечная точка добавляется после URL-адреса службы, полученного через DiscoveryClient.2. Я попробовал самую глупую вещь, которая пришла мне в голову, используя RestTemplate, чтобы сделать запрос и получить ответ, и поместить его в контекстный ответ, который тоже не работал, однако запрос был перенаправлен в службу, но я не получил никакого ответа.
Любая помощь приветствуется !!