Установка: Так у меня есть RESTfull API написан на Java, используя spring-boot
и spring-hates
для добавления ссылки на ресурс (гипермедиа-Driven RESTful Web Service). Все у меня есть стандартный и никаких дополнительных настроек или изменения не сделаныSpring HATEOAS ControllerLinkBuilder methodOn раз увеличение отклика значительно
Проблема
- Дело: нет ссылки на ресурс - Chrome TTFB Avg. (10 прогонов) 400 мс для 1000 наименований
- Корпус: 1 ссылка самообслуживания на ресурсе - Chrome TTFB сред. (10 трасс) 1500ms на 1000 пунктов
Я использую this official guide
Вопрос
Почему добавлять только 1 ссылку на мой ресурс добавляет еще 1 секунду для обработки запроса. Мне потребуется около 5-7 ссылок на каждый ресурс, и каждый ресурс имеет дополнительные встроенные функции?
Для всего 9000 предметов с 1 ссылкой на элемент (включая вложенные), я должен ждать 30 секунд для ответа и без ссылок ~ 400 мс.
P.S. Дополнительный код не имеет значения, потому что я просто добавляю код из учебника, который резко влияет на производительность.
Edit 1
Как предложил я добавляю пример кода из моего TextItem
конструктора
add(linkTo(methodOn(TestController.class).getTestItems()).withRel("testLink"));
Edit 2
Так в следующем примере предложен из @Mathias Dpunkt работает абсолютно совершенен
private Method method = ReflectionUtils.findMethod(TestController.class, "getOne", Integer.class);
@Override
public Resource<Item> process(Resource<Item> resource) {
resource.add(linkTo(method, resource.getContent().getId()).withSelfRel());
return resource;
}
Новая проблема
Контроллер:
@RestController
@RequestMapping("items")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final ItemResourceProcessor resourceProcessor;
@RequestMapping(method = GET)
public ResponseEntity<List<Resource<Item>>> getAll() {
List<Resource<Item>> items = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
items.add(resourceProcessor.process(
new Resource<>(new Item(i, UUID.randomUUID().toString()))));
}
return ResponseEntity.ok(items);
}
@RequestMapping(method = GET, path = "/{id}")
public ResponseEntity<Resource<Item>> getOne(@PathVariable Integer id, @RequestParam boolean test1, @RequestParam boolean test2) {
return null;
}
}
Если метод контроллера принимает @RequestParam
посланного решение не добавляет его к ссылке. Когда я звоню
private Method method = ReflectionUtils.findMethod(TestController.class, "getOne", Integer.class);
@Override
public Resource<Item> process(Resource<Item> resource) {
resource.add(linkTo(method, resource.getContent().getId(), true, true).withSelfRel());
return resource;
}
Профиль вашего приложения. – Kayaman
@ Кайаман, даже если мой вопрос основан на конкретном приложении - случай - это то, что происходит в каждом весеннем приложении, которое у меня есть - я обнаружил его только сейчас, когда размер ответа взорвался, но это не проблема, не так ли. . –
Добавление ссылки не вызывает проблемы. Замедление, скорее всего, связано с использованием метода methodOn. Но пока вы считаете, что нет необходимости показывать свой код, мы не можем вам помочь. – zeroflagL