Как создать прокси-сервер Java-клиента для службы RESTful, реализованного с помощью Spring?

Мы используем Spring для реализации контроллера REST, например:

@Controller
@RequestMapping("/myservice") 
public class MyController {
    @RequestMapping(value = "foo", method = RequestMethod.GET)
    public @ResponseBody string foo() {...}
}

Я могу вызвать эту услугу, используя Spring RestTemplate, и она отлично работает, но я бы предпочел ее вызывать с помощью прокси вместо безошибочного вызова с использованием строки url:

// client code:
MyController proxy = getProxy("baseUrl", MyController.class);
String results = proxy.foo();

Таким образом, ввод в генерацию прокси-сервера - это java-интерфейс с аннотациями, описывающими детали REST. Я прочитал эту статью, и похоже, что у всех типов удаленных вызовов есть прокси, и все, что мне нужно для REST, похоже на RestProxyFactoryBean, который будет использовать мой интерфейс REST java и вернуть тип безопасного прокси, который использует RestTemplate в качестве реализации.

Самое близкое найденное решение - JBoss RESTEasy.

Но он, кажется, использует разные аннотации, поэтому я не уверен, что он будет работать с аннотациями, которые у меня уже есть: @Controller, @RequestMapping. Есть ли другие варианты, или RESTEasy - единственный? Заметьте, я новичок Spring, поэтому некоторые очевидные вещи Spring для меня довольно новы.

Спасибо.
Дима

Ответ 1

Вы можете попробовать Feign Netflix, легкий клиент REST на основе прокси. Он работает декларативно с помощью аннотаций и используется Spring облачными проектами для взаимодействия с Netflix Eureka.

Ответ 2

Одна из причин, по которой была изобретена парадигма REST, заключалась в том, что опыт работы с другими удаленными технологиями (RMI, CORBA, SOAP) показывает нам, что часто подход на основе прокси создает больше проблем, чем решает.

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

На практике, однако, это обещание не может быть выполнено, потому что удаленные вызовы функций просто имеют другие свойства, кроме локальных. Сетевые сбои, перегрузки, тайм-ауты, проблемы с нагрузкой, чтобы назвать лишь некоторые из них. Если вы решите игнорировать все эти вещи, которые могут пойти не так, как с удаленными вызовами, ваш код, вероятно, не будет очень стабильным.

TL; DR: Вы, вероятно, не должны работать с прокси-сервером, это уже не актуально. Просто используйте RestTemplate.

Ответ 3

Вот проект, пытающийся генерировать прокси файлы времени выполнения из аннотаций контроллера (используя RestTemplate в фоновом режиме для обработки прокси-вызовов): spring-rest-proxy-client Очень рано в реализации.

Ответ 4

Это похоже на это: https://swagger.io/swagger-codegen/, а у swagger есть много других приятных вещей для REST API.