Получить имя хоста/IP:порт сервера, на который должен быть перенаправлен запрос из ленты Zuul+

Я использую Eureka для обнаружения сервисов и Zuul+ленту в качестве обратного прокси-сервера и балансировщика нагрузки. У меня есть 2 экземпляра, зарегистрированных в Eureka, следующим образом:

MYSERVICE   n/a (2) (2) UP (2) - MYHOST:MyService:8888 , MYHOST:MyService:9999

Ниже мой конфиг zuul:

@EnableZuulProxy
@EnableDiscoveryClient

zuul:
  debug.request: true
  sensitiveHeaders: 
  routes:
ecm:
   path: /myservice/**
   serviceId: MYSERVICE
   stripPrefix: false
  host:
       maxTotalConnections: 200
       maxPerRouteConnections: 30
  RibbonRoutingFilter:
       route.disable: false

Мне нужен фильтр или перехватчик, который поможет мне зарегистрировать URL-адрес моего запроса, параметры моего запроса и сервер, выбранный Zuul.

Я попытался расширить следующее:

@Component
public class RibbonInterceptor extends ZoneAvoidanceRule {

@Override
public Server choose(Object key) {

Server choose = super.choose(key);
System.out.println(choose);
return choose;
}

Но это просто дало мне информацию о сервере из ленты, а здесь лента просто выбирала сервер. Я хотел получить эту информацию от Зуула вместе с деталями запроса.

Пожалуйста помоги!!


person Rakz    schedule 01.02.2018    source источник
comment
Вы пытались создать фильтр Zuul post? может быть информация о том, какая конечная точка была выбрана, возможно, даже в заголовках   -  person phoenix7360    schedule 02.02.2018
comment
Фильтр Zuul не раскрывает детали, связанные с лентой. Уже пытался реализовать фильтры PRE, ROUTE и POST.   -  person Rakz    schedule 07.02.2018


Ответы (2)


Для URL-адреса запроса и сервера, выбранного Zuul, вы можете установить уровень журнала от LoadBalancerContext до DEBUG в application.properties.

#logging load balancing information 
logging.level.com.netflix.loadbalancer.LoadBalancerContext=DEBUG

Это создаст оператор журнала, например:

2017-09-11T12:59:09.746-07:00: [DEBUG] hystrix-myserviceV3-2 com.netflix.loadbalancer.LoadBalancerContext - myserviceV3 using LB returned Server: myservice-2.abc.com:8080 for request http:///myservice/auth/users

Не уверен, однако, как вы можете обрабатывать параметры запроса.

person pan    schedule 02.02.2018
comment
Это просто распечатается в файле журнала. Мне нужен настоящий перехватчик сразу после того, как сервер выбран вместе с объектом запроса. - person Rakz; 07.02.2018

Предполагая, что вы используете Apache HttpClient, есть много способов сделать это, но я думаю, что самый простой — добавить HttpRequestInterceptor к CloseableHttpClient, используемому лентой. Вы можете настроить клиент, предоставив bean-компонент типа CloseableHttpClient, как указано в документации [1]. Затем у вас есть запрос, фактически используемый HttpClient, поэтому вы записываете подробности.

@Bean
public HttpClient delegate(IClientConfig clientConfig)
{
    HttpClientBuilder builder = HttpClientBuilder.create();
    //set connection pool configuration

    HttpRequestInterceptor interceptor = (request, context) -> logger.info("Server : {}, headers : {}", request.getRequestLine().getUri(), request.getAllHeaders());
    builder.addInterceptorFirst(interceptor);

    return builder.build();
}

Вы также можете расширить HttpClientRibbonCommand и переопределить метод run(), чтобы напечатать то, что вы хотите. Вы бы использовали свой новый класс, предоставив bean-компонент типа RibbonCommandFactory<YourExtendedRibbonCommand>, и он должен автоматически подключаться к классу RibbonRoutingFilter.


Наконец, если вы используете стратегию изоляции семафоров в hystrix, вы можете использовать свой RibbonInterceptor, как и вы, в дополнение к com.netflix.zuul.context.RequestContext. В RequestContext вы найдете исходный HttpServletRequest вместе с проанализированными параметрами и заголовками, которые были обработаны фильтрами pre.


[1] https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#_zuul_http_client

person jebeaudet    schedule 06.02.2018
comment
Я не пробовал это. Постараюсь выложить обновление как можно скорее. Спасибо :) - person Rakz; 07.02.2018
comment
Не могли бы вы также перечислить другие возможные способы сделать это? - person Rakz; 07.02.2018