Пытался узнать, как настроить. клиент отдыха на стороне сервера (то есть микросервис 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.
- Мик