gpt4 book ai didi

micronaut - 创建多个具有相同接口(interface)的 HTTP 客户端

转载 作者:行者123 更新时间:2023-12-04 12:40:03 26 4
gpt4 key购买 nike

我们需要能够连接到多个 Elasticsearch 服务器。我们有一个简单的 Elasticsearch 客户端,使用 Micronaut 的声明式方法定义。

然而,作为一个 Multi-Tenancy 环境,我们需要能够定义许多这样的客户端。这些客户端中的每一个显然都有不同的 URL,并且需要使用不同的 HTTPFilter 进行身份验证。

Micronaut 是一个专注于编译时的框架,我如何动态创建许多由配置选项定义的此类 bean?

更新:
我看到@Factory结合 @EachBean注释可能是一种很有前途的方法,但是声明式 HTTP 客户端是一个接口(interface),而不是一个具体的类。如何仅基于接口(interface)实例化这样的客户端?

https://docs.micronaut.io/latest/guide/index.html#eachBean

最佳答案

除了2个细节外,通常创建声明性@Client接口(interface):

  • 使其指向本地的 url "/proxy-elastic"
  • 在每个声明的方法中添加一个 @Header("X-Elastic-Cluster") 字符串簇

  • @Client("/proxy-elastic")
    public interface DeclarativeHttpClient {
    @Get("/connectors/{name}")
    void diplay(@Header(value = "X-Elastic-Cluster") String cluster, String name);
    }
    然后,创建一个 ProxyFilter 并根据 Header 值改变 HttpRequest
    ( https://docs.micronaut.io/latest/guide/index.html#proxyClient )
    @Filter("/proxy-elastic/**")
    public class KafkaConnectClientProxy extends OncePerRequestHttpServerFilter {
    @Inject
    ProxyHttpClient client;

    @Override
    protected Publisher<MutableHttpResponse<?>> doFilterOnce(HttpRequest<?> request, ServerFilterChain chain) {
    // retrieve the config for this cluster
    String cluster = request.getHeaders().get("X-Elastic-Cluster");
    var config = getConfigForCluster(cluster);
    URI newURI = URI.create(config.url);

    // call kafka connect with proper URL and Auth
    return Publishers.map(client.proxy(
    request.mutate()
    .uri(b -> b
    .scheme(newURI.getScheme())
    .host(newURI.getHost())
    .port(newURI.getPort())
    .replacePath(StringUtils.prependUri(
    newURI.getPath(),
    request.getPath().substring("/proxy-elastic".length())
    ))
    )
    .basicAuth(config.basicAuthUsername, config.basicAuthPassword)
    ), response -> response.header("X-My-Response-Header", "YYY"));
    }
    }

    关于micronaut - 创建多个具有相同接口(interface)的 HTTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042611/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com