Речь идет о зууле и маршрутизации

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