Как реализовать «балансировщик нагрузки» с помощью пружинной загрузки? - PullRequest
0 голосов
/ 02 октября 2018

Зависит от содержимого тела запроса. Мне нужно перенаправить http-запросы на URL_1 или URL_2.

. Я начал реализацию контроллера:

@RestController
public class RouteController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/**")
    public HttpServletResponse route(HttpServletRequest request) {
        String body = IOUtils.toString(request.getReader());
        if(isFirstServer(body)) {
            //send request to URL_1 and get response
        } else {
            //send request to URL_2 and get response
        }
    }
}

Запрос может быть GET илиPOST ot PUT или PATCH и т. Д.

Не могли бы вы помочь мне написать этот код?

1 Ответ

0 голосов
/ 02 октября 2018

Я задал какой-то похожий вопрос некоторое время назад.Пожалуйста, см. Переадресация на стороне сервера для вызова REST для получения дополнительной информации.

Лучший способ (насколько я понимаю), которого вы могли бы достичь, это вручную вызвать нужные конечные точки из вашей начальной конечной точки.

@RestController
public class RouteController {

    @Value("${firstUrl}")
    private String firstUrl;

    @Value("${secondUrl}")
    private String secondUrl;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/**")
    public void route(HttpServletRequest request) {
        String body = IOUtils.toString(request.getReader());
        if(isFirstServer(body)) {
            restTemplate.exchange(firstUrl,
                                  getHttpMethod(request), 
                                  getHttpEntity(request), 
                                  getResponseClass(request), 
                                  getParams(params));
        } else {
            restTemplate.exchange(secondUrl,
                                  getHttpMethod(request), 
                                  getHttpEntity(request), 
                                  getResponseClass(request), 
                                  getParams(params))
        }
   }
}

Пример реализации для getHttpMethod:

public HttpMethod getHttpMethod(HttpServletRequest request) {
    return HttpMethod.valueOf(request.getMethod());
}

Аналогичные реализации для getHttpEntity, getResponseClass и getParams.Они используются для преобразования данных из HttpServletRequest request в типы, требуемые методом exchange.

Кажется, есть много лучших способов сделать это для приложения Spring MVC, но я думаю, что это не относится к вашему контексту.

Другим способом, которым вы могли бы достичь этого, было быопределить свой собственный клиент REST и добавить туда логику маршрутизации.

...