HTTP-кеш на стороне сервера Quarkus

Пытался узнать, как настроить. клиент отдыха на стороне сервера (то есть микросервис A вызывает другой микросервис B с помощью rest) для использования кеша http.

Фон состоит в том, что двоичные объекты, передаваемые по сети, могут быть довольно большими. Общая производительность может быть увеличена за счет кеширования на стороне микросервиса A, в котором используются заголовки и теги кэширования http, предоставляемые микросервисом B.

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

    @Inject
    /* package private */  ManagedExecutor executor;

    //
    // Instead of using a declarative rest client we create it ourselves, because we can then supply a server-side cache: See ctor()
    //
    private ServiceBApi serviceClientB;

    @ConfigProperty(name="serviceB.url")
    /* package private */ String serviceBUrl;

    @ConfigProperty(name="cache-entries")
    /* package private */ int cacheEntries;

    @ConfigProperty(name="cache-entrysize")
    /* package private */ int cacheEntrySize;

    @PostConstruct
    public void ctor()
    {
        // Create proxy ourselves, because we can then supply a server-side cache
        final CacheConfig cc = CacheConfig.custom()
            .setMaxCacheEntries(cacheEntries)
            .setMaxObjectSize(cacheEntrySize)
            .build();
        final CloseableHttpClient httpClient = CachingHttpClientBuilder.create()
            .setCacheConfig(cc)
            .build();
        final ResteasyClient client = new ResteasyClientBuilderImpl()
            .httpEngine(new ApacheHttpClient43Engine(httpClient))
            .executorService(executor)
            .build();
        final ResteasyWebTarget target = (ResteasyWebTarget) client.target(serviceBUrl);
        this.serviceClientB = target.proxy(ServiceBApi.class);
    }

    @Override
    public byte[] getDoc(final String id)
    {
        try (final Response response = serviceClientB.getDoc(id)) {
            [...]
            // Use normally and no need to handle conditional gets and caching headers and other HTTP protocol stuff here, because this does underlying impl.
            [...]
        }
    }

Мои вопросы:

  • Подходит ли мое решение как решение на стороне сервера, т.е. может ли оно обрабатывать одновременные запросы?
  • Есть ли декларативный (кварковый) способ (@RegisterRestClient и т. Д.) Для достижения того же?

-- Редактировать

Чтобы прояснить ситуацию: я хочу, чтобы служба B могла управлять кешированием на основе HTTP-запроса на получение и конкретного ресурса. Кроме того, я хочу избежать ненужной передачи больших документов, которые предоставляет служба B.

- Мик


person Mik86    schedule 25.02.2021    source источник


Ответы (1)


Предполагая, что вы уже работали с декларативным способом использования REST-клиента Quarkus, вы просто внедрить клиента в свой класс, потребляющий serviceB. Метод, который будет вызывать службу B, должен быть помечен @CacheResult. Это кеширует результаты в зависимости от входящего id. См. Также Руководство по кэшированию Quarkus.

Обратите внимание: поскольку Quarkus и Vert.x предназначены для неблокирующих операций, вам следует использовать асинхронная поддержка клиента REST.


    @Inject
    @RestClient
    ServiceBApi serviceB;

    ...
    @Override
    @CacheResult(cacheName = "service-b-cache")
    public Uni<byte[]> getDoc(final String id) {
        return serviceB.getDoc(id).map(...); 
    }
    ...
person rowing-ghoul    schedule 01.03.2021
comment
Да, я прочитал руководство по кешированию перед тем, как создать начальный пост. API кеширования - это другой вариант использования, чем у меня. Я хочу использовать встроенное кэширование HTTP, что означает кеширование заголовков и etags, потому что я хочу, чтобы микросервис B контролировал кеширование передачи. - person Mik86; 02.03.2021
comment
Хм, теперь я понял! У RESTEasy есть собственное решение для этого, но оно очень похоже на ваше: docs.jboss.org/resteasy/docs/4.6.0.Final/userguide/html_single/ - person rowing-ghoul; 03.03.2021