TestContainers中的Zookeeper + Solr

mefy6pfw  于 2023-11-15  发布在  Apache
关注(0)|答案(3)|浏览(146)

我使用org.testcontainers来执行与Solr的集成测试。
[在我的单元测试中使用SolrJ]
当我在云模式下使用嵌入式ZooKeeper示例启动Solr时,我能够从单元测试连接到Solr示例,但无法从SolrClient连接到ZooKeeper。
我认为这是因为嵌入式ZooKeeper绑定到IP 127.0.0.1并且无法访问。
如果我启动两个单独的容器(使用共享网络),ZooKeeper和Solr,我可以将Solr连接到ZooKeeper,并且我可以从我的单元测试连接到Zookeeper,但是当Zookeeper返回活动SOLR节点时,它返回内部服务器IP,这是无法从我的单元测试访问的。
我不知道该怎么说。
也许有一个网络模式,将做地址转换?
有什么想法?

mo49yndu

mo49yndu1#

更新:

有一个官方的Testcontainers模块:https://www.testcontainers.org/modules/solr/
看来这个问题不是那么容易解决的。
一种方法是使用testcontainer的固定端口。在这种情况下,端口9983和8983将Map到主机上的相同端口。这使得使用Solr Cloud Client成为可能。但这只有在您可以确保测试将按顺序运行时才有效,这可能有点棘手,例如在Jenkins上使用功能分支。
另一种解决方案是使用另一个客户端。由于Solrj提供了多个客户端,因此您可以选择要使用的客户端。如果您只想搜索或更新,则可以使用LBHttp2SolrClient在多个节点之间进行负载平衡。如果您想使用特定的客户端进行集成测试,则可以使用此示例:

// Create the solr container.
SolrContainer container = new SolrContainer();

// Start the container. This step might take some time...
container.start();

// Do whatever you want with the client ...
SolrClient client = new Http2SolrClient.Builder("http://localhost:" + container.getSolrPort() + "/solr").build();
SolrPingResponse response = client.ping("dummy");

// Stop the container.
container.stop();

字符串
以下是Java中的solr客户端列表:https://lucene.apache.org/solr/guide/8_3/using-solrj.html#types-of-solrclients

ekqde3dh

ekqde3dh2#

我遇到了完全相同的问题。我使用代理解决了它。在我的 docker_compose.yml 中,我添加了:

squid:
    image: sameersbn/squid:3.5.27-2
    ports:
      - "3128:3128"
    volumes:
      - ./squid.conf:/etc/squid/squid.conf
      - ./cache:/var/spool/squid
    restart: always
    networks:
     - solr

字符串
在SolrClient的配置中,我添加了:

[...]

HttpClient httpClient = HttpClientBuilder.create().setProxy(new HttpHost("localhost", 3128)).build()
CloudSolrClient c = new CloudSolrClient.Builder(getZookeeperList(), Optional.empty()).withHttpClient(httpClient).build();

[...]

protected List<String> getZookeeperList() {
  List<String> zookeeperList = new ArrayList<String>();

  for (Zookeepers z : Zookeepers.values()) {
            zookeeperList.add(testcontainer.getServiceHost(z.getServicename(), z.getPort()) + ":"
                    + testcontainer.getServicePort(z.getServicename(), z.getPort()));
  }

  return zookeeperList;
}


但我仍然对杰里米在这篇评论中提到的变通方法感兴趣。

s4chpxco

s4chpxco3#

我使用zk和solr测试容器的方法如下所示

DockerImageName SOLR_IMAGE = DockerImageName.parse("solr:8.4.1");
    SolrContainer solrContainer = new SolrContainer(SOLR_IMAGE);
    solrContainer.withZookeeper(true);
    solrContainer.start();

    HttpClient httpClient = HttpClientBuilder.create().setProxy(new HttpHost("localhost", solrContainer.getSolrPort())).build();
    CloudSolrClient solrClient = new CloudSolrClient.Builder(Arrays.asList("localhost:" + solrContainer.getZookeeperPort()),
        Optional.empty()).withHttpClient(httpClient).build();
    return solrClient;

字符串

相关问题