#java #netflix-zuul
Вопрос:
Этот вопрос касается зуула и маршрутизации. Теперь получить маршрутизацию zuul довольно просто в вашем приложении.yml у вас есть следующее
routes: silver: path: "/silver/**" serviceId: "SILVER-MICO-SERVICE" stripPrefix: true gold: path: "/gold/**" serviceId: "GOLD-MICO-SERVICE" stripPrefix: false
Поэтому, если в вашем URL-адресе есть серебро, он направит сервис silver micro, если в нем есть золото, он направит на сервис gold micro.
Но у меня есть 3-я услуга, которую я хочу позвонить, прежде чем направлять на серебро или золото. поэтому я хочу что-то вроде
routes: silver: path: "/silver/**" serviceId: "SILVER-MICO-SERVICE" stripPrefix: true gold: path: "/gold/**" serviceId: "GOLD-MICO-SERVICE" stripPrefix: false throttle path: "/throttle/**" serviceId: "THROTTLE-MICO-SERVICE" stripPrefix: false
И когда говорят, что серебро называется
У меня в фильтре будет следующее: у меня будет дроссельный фильтр, который вызовет службу микроконтроллера дроссельной заслонки. Но я понятия не имею, как закодировать вызов zuul на Java.
Спасибо за любую помощь
Ответ №1:
Вам не нужно прокладывать маршрут к микросервису дроссельной заслонки, потому что вы можете проложить маршрут только к одной микросервисе. Вместо этого вы можете написать предварительный фильтр и вызвать микрослужбу дроссельной заслонки. Вот пример того, как написать предварительный фильтр
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import javax.servlet.http.HttpServletRequest; public class SimplePreFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { //You can apply custom logic if required return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); //TODO you can call throttle micro service here return null; }
}
Комментарии:
1. Спасибо, но я хочу позвонить через сервер eureka. Я хочу добавить эврику, но вы не можете редактировать это. Итак, это зуул эврика и 3 услуги. поэтому я согласен, что мне нужно позвонить через предварительный фильтр, но есть ли способ просто указать идентификатор службы. Или мне нужно использовать webclient или resttemplate, чтобы создать URL-адрес и назвать его таким образом. Проблема в том , что доступ ко всем сервисам осуществляется через эврику, и я хотел бы получить доступ к регулированию через эврику.
2. Это определенно будет работать с webclient или resttemplate, но я не уверен в эврике
3. Спасибо, я боялся, что это будет что-то в этом роде. Служба обнаружения Эврики запущена и работает, но я не могу ее использовать, если только путь не содержит регулирования, чего не произойдет, оно будет серебряным или золотым.
Ответ №2:
Хорошо, это код для выполнения того, что я хочу сделать. Функциональность, в которой я нуждался, была предоставлена EurekaClient
zuul throttling: path: "/throttling/**" serviceId: "SITE-THROTTLING" stripPrefix: false
И в коде у меня есть
@Autowired private EurekaClient eurekaClient; private boolean checkThrottling(String url) { InstanceInfo service = eurekaClient .getApplication("SITE-THROTTLING") .getInstances() .get(0); StringBuilder sb = new StringBuilder(service.getHomePageUrl()) .append("/throttling") .append("?paramUrl=") .append(url); return webSevice.sendPost(sb.toString()); public boolean sendPost(String url) { WebClient webClient = WebClient.create(); Boolean flag = webClient.get() .uri(url) .retrieve() .bodyToMono(Boolean.class) .block(); return flag;