vert.x tcp 服务_Vert.X通过Hoverfly满足服务虚拟化

vert.x tcp 服务

服务虚拟化是一种用于模拟基于组件的应用程序的依赖关系行为的技术。

Hoverfly是用Go语言编写的服务虚拟化工具,可让您模拟HTTP(S)服务。 它是一个代理,它使用存储的响应来响应HTTP(S)请求,并假装它是真正的对应对象。

食蚜蝇Java是围绕食蚜蝇的包装,它可以让你在Java世界中使用它。 它提供了本机Java DSL来编写期望,并提供了JUnit规则与JUnit一起使用。

但是,除了能够设定期望值之外,您还可以使用Hoverfly捕获这两种服务之间的流量(在两种情况下都是真实的服务)并将其持久化。

然后,在接下来的运行中, Hoverfly将使用这些持久化的脚本来模拟流量,而不接触远程服务。 这样,您将使用真实的通信数据,而不是编程期望,这意味着您正在编程如何理解系统。

下图中可以总结一下:

首次通过Hoverfly代理发送输出流量时,会将其重定向到真实服务并生成响应。 然后,当响应到达代理时,将同时存储请求和响应,并将实际响应发送回调用方。

然后在下一个相同方法的调用中:

服务A的输出流量仍通过Hoverfly代理发送,但是现在响应是从以前存储的响应返回的,而不是重定向到实际服务。

那么,如何从服务A的HTTP客户端连接到Hoverfly代理? 快速的答案是什么。

Hoverfly只会覆盖Java网络系统属性( https://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html ),因此您无需执行任何操作,来自HTTP客户端的所有通信(独立于您放置在那里的主机)都将通过Hoverfly代理进行。

问题是,如果您用作HTTP客户端的API不支持这些系统属性,那会发生什么情况? 那么显然所有传出的通信都不会通过彻底的代理。

一个示例是Vert.X及其HTTP客户端io.vertx.rxjava.ext.web.client.WebClient 。 由于WebClient不使用这些属性,因此需要正确配置客户端才能使用
Hoverfly

您需要做的基本步骤只是使用设置为系统属性的代理选项配置WebClient

final Optional<ProxyOptions> proxyOptions = useSystemPropertiesProxyOptions();
if (proxyOptions.isPresent()) {
     final WebClientOptions webClientOptions = new WebClientOptions();
     webClientOptions.setProxyOptions(proxyOptions.get());
     client = WebClient.create(vertx, webClientOptions);
} else {
     client = WebClient.create(vertx);
}

private Optional<ProxyOptions> useSystemPropertiesProxyOptions() {
  final String httpsProxy = System.getProperty("https.proxyHost");
  if (httpsProxy != null) {
      return Optional.of(new ProxyOptions()
          .setHost(httpsProxy)
          .setPort(Integer.parseInt(System.getProperty("https.proxyPort", "443"))));
  } else {
       final String httpProxy = System.getProperty("http.proxyHost");
       if (httpProxy != null) {
           return Optional.of(new ProxyOptions()
               .setHost(httpsProxy)
               .setPort(Integer.parseInt(System.getProperty("http.proxyPort", "80"))));
       }
  }
  return Optional.empty();
}

请注意,这里唯一要做的只是检查是否已配置了有关网络代理的系统属性(由Hoverfly Java),如果是,则只需创建一个Vert.X ProxyOptions对象来配置HTTP客户端。

通过此更改,您可以毫无问题地使用HoverflyVert.X编写测试

public class VillainsVerticleTest {

    private static Vertx vertx;

    private static String RESPONSE = "[\n"
        + "    {\n"
        + "        \"name\": \"Moon\",\n"
        + "        \"villain\": \"Gru\",\n"
        + "        \"wiki\": \"https://en.wikipedia.org/wiki/Moon\"\n"
        + "    },\n"
        + "    {\n"
        + "        \"name\": \"Times Square JumboTron\",\n"
        + "        \"villain\": \"Gru\",\n"
        + "        \"wiki\": \"https://en.wikipedia.org/wiki/One_Times_Square\"\n"
        + "    }\n"
        + "]";


    @ClassRule
    public static HoverflyRule hoverflyRule = HoverflyRule.inSimulationMode(dsl(
        service("crimes:9090")
            .get("/crimes/Gru")
            .willReturn(success(RESPONSE, "application/json"))
    ));

    @BeforeClass
    public static void deployVerticle() throws InterruptedException {
        final CountDownLatch waitVerticleDeployed = new CountDownLatch(1);

        new Thread(() -> {
            vertx = Vertx.vertx();
            DeploymentOptions deploymentOptions = new DeploymentOptions().
                setConfig(new JsonObject()
                    .put("services.crimes.host", "crimes")
                    .put("services.crimes.port", 9090));

            vertx.deployVerticle(VillainsVerticle.class.getName(), deploymentOptions, event -> {
                if (event.failed()) {
                    throw new IllegalStateException("Cannot deploy Villains Verticle");
                }
                waitVerticleDeployed.countDown();
            });
        }).start();
        waitVerticleDeployed.await();
    }

    @Test
    public void should_get_villain_information() {
       given()
            .when()
            .get("villains/{villain}", "Gru")
            .then()
            .assertThat()
            .body("name", is("Gru"))
            .body("areaOfInfluence", is("Worldwide"))
            .body("crimes.name", hasItems("Moon", "Times Square JumboTron"));

    }

}

在前面的示例中, Hoverfly用于模拟模式,并且请求/响应定义以DSL形式出现,而不是外部JSON脚本。 请注意,在这种情况下,您正在编程,当当前服务( VillainsVerticle )的请求完成时,使用/ crimes / Gru上的 GET HTTP方法来托管犯罪和端口9090 ,然后返回响应。 为了简化当前文章,此方法就足够了。

您可以在https://github.com/arquillian-testing-microservices/villains-service上查看源代码,并在http://hoverfly-java.readthedocs.io/en/latest/上了解有关Hoverfly Java的信息。

翻译自: https://www.javacodegeeks.com/2017/06/vert-x-meets-service-virtualization-hoverfly.html

vert.x tcp 服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值