Могу ли я сопоставить запрос с ответом в WebClient? - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь использовать новые классы Reactive в Spring для проведения нагрузочного тестирования в конечной точке RESTful. Я все еще изучаю эти классы, поэтому, возможно, я иду в неправильном направлении, поэтому, пожалуйста, перенаправьте меня на более легкий путь, если вы знаете один ...

Вот что у меня есть. Это заводной код:

def token="xyz"

WebClient webClient=WebClient
    .builder()
    //Using google for example purposes only
    .baseUrl("http://google.com")
    //In the real code, there's a lot of extra headers like this one..
    .defaultHeaders({ headers ->
      headers.add(HttpHeaders.AUTHORIZATION,"bearer $token")
    })
    .build()

//This is where load is measured
for (int i:1..3) {
  webClient
      .method(HttpMethod.GET)
      .header("x","y")
      .attribute("i",i)
      .retrieve()
      .bodyToMono(String)
      .subscribe {
        body -> 
          println body
          //Is there any way to get the "i" attribute here to determine the request???
      }
}

sleep 30000
println "done"

Я вижу, как возвращаются три запроса, поэтому он работает. Теперь я хочу определить время ожидания между запросом и ответом для каждого из трех запросов. Если бы я мог получить атрибут «i», каждый цикл мог бы начинаться с сохранения текущего времени на карте, а затем метод подписки мог бы использовать «i» для чтения карты и сравнения ее с текущим временем для вычисления дельты.

Другой вариант, который я рассматриваю, - это создание нового WebClient для каждого запроса, но будет 1000 запросов, и я хочу оптимизировать производительность.

Кроме того, я не слишком рад тому, что в конце мне нужен оператор сна ...

Каков наилучший способ использования классов Reactive для нагрузочного тестирования службы RESTful?

1 Ответ

0 голосов
/ 06 сентября 2018

Я решил просто использовать большой набор объектов WebClient. Пропускная способность запроса в моем случае достаточно высока, чтобы забить сервер и вызвать ошибки, невидимые при более низкой скорости запроса. Не нужно было беспокоиться о attributes, вместо этого я просто создал новую переменную для каждой итерации цикла, чтобы сохранить метку времени начала. Смотрите код ниже:

for (int i:1..3) {
  WebClient webClient=WebClient
    .builder()
    //Using google for example purposes only
    .baseUrl("http://google.com")
    //In the real code, there's a lot of extra headers like this one..
    .defaultHeaders({ headers ->
      headers.add(HttpHeaders.AUTHORIZATION,"bearer $token")
    })
    .build()

  //Get timestamp here

  webClient
      .method(HttpMethod.GET)
      .header("x","y")
      .retrieve()
      .bodyToMono(String)
      .subscribe {
        body -> 
          //Get timestamp here and compare with the other timestamp to calculate latency.
      }
}
...