我使用org.testcontainers来执行与Solr的集成测试。
[在我的单元测试中使用SolrJ]
当我在云模式下使用嵌入式ZooKeeper示例启动Solr时,我能够从单元测试连接到Solr示例,但无法从SolrClient连接到ZooKeeper。
我认为这是因为嵌入式ZooKeeper绑定到IP 127.0.0.1并且无法访问。
如果我启动两个单独的容器(使用共享网络),ZooKeeper和Solr,我可以将Solr连接到ZooKeeper,并且我可以从我的单元测试连接到Zookeeper,但是当Zookeeper返回活动SOLR节点时,它返回内部服务器IP,这是无法从我的单元测试访问的。
我不知道该怎么说。
也许有一个网络模式,将做地址转换?
有什么想法?
3条答案
按热度按时间mo49yndu1#
更新:
有一个官方的Testcontainers模块:https://www.testcontainers.org/modules/solr/
看来这个问题不是那么容易解决的。
一种方法是使用testcontainer的固定端口。在这种情况下,端口9983和8983将Map到主机上的相同端口。这使得使用Solr Cloud Client成为可能。但这只有在您可以确保测试将按顺序运行时才有效,这可能有点棘手,例如在Jenkins上使用功能分支。
另一种解决方案是使用另一个客户端。由于Solrj提供了多个客户端,因此您可以选择要使用的客户端。如果您只想搜索或更新,则可以使用LBHttp2SolrClient在多个节点之间进行负载平衡。如果您想使用特定的客户端进行集成测试,则可以使用此示例:
字符串
以下是Java中的solr客户端列表:https://lucene.apache.org/solr/guide/8_3/using-solrj.html#types-of-solrclients
ekqde3dh2#
我遇到了完全相同的问题。我使用代理解决了它。在我的 docker_compose.yml 中,我添加了:
字符串
在SolrClient的配置中,我添加了:
型
但我仍然对杰里米在这篇评论中提到的变通方法感兴趣。
s4chpxco3#
我使用zk和solr测试容器的方法如下所示
字符串