【问题标题】:simulate network outage for database with testcontainers使用测试容器模拟数据库的网络中断
【发布时间】:2019-06-04 19:12:00
【问题描述】:

我正在尝试使用测试容器模拟网络中断。 我想使用 Socat 容器来暴露端口,然后将其击落,然后再次向上。我无法做到这一点,因为没有停止。

我该如何管理?

【问题讨论】:

    标签: java testcontainers


    【解决方案1】:

    这很简单!

    您需要 2 个容器,SocatContainer(由 Testcontainers 提供)和您的目标容器。将它们(Socat 和目标)与网络连接,请参见此处的示例:
    https://github.com/testcontainers/testcontainers-java/blob/bcecd5cd9f9325517fd45db585312df2624315bb/core/src/test/java/org/testcontainers/containers/NetworkTest.java

    当您需要模拟中断时,只需断开目标与网络的连接(通过使用您通过DockerClientFactory.instance().client()disconnectFromNetworkCmd 获得的Docker 客户端)。

    在您确认正确处理中断后,使用connectToNetworkCmd 将您的目标连接到网络。

    另一种解决方案是使用 Shopify 的 Toxiproxy:
    https://github.com/shopify/toxiproxy。 在容器中启动它(当然是使用 Testcontainers ;))并使用他们的 Java 客户端应用混沌操作。

    【讨论】:

    • 酷!我会试一试!我尝试使用 Socat,但找不到示例。
    • SocatContainer 的 API 很简单,但你也可以从 Kafka 容器中获得一些灵感。
    【解决方案2】:

    最简单的方法是通过 testcontainers 支持 toxiproxy (https://www.testcontainers.org/modules/toxiproxy/)。

    从上面的网页复制粘贴:

    E.g. // Create a common docker network so that containers can communicate
    @Rule
    public Network network = Network.newNetwork();
    
    // the target container - this could be anything
    @Rule
    public GenericContainer redis = new GenericContainer("redis:5.0.4")
        .withExposedPorts(6379)
        .withNetwork(network);
    
    // Toxiproxy container, which will be used as a TCP proxy
    @Rule
    public ToxiproxyContainer toxiproxy = new ToxiproxyContainer()
        .withNetwork(network);
    // To simulate an outage you do:
    
    final ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy(redis, 6379);
    proxy.setConnectionCut(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 2019-01-26
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多