Vert.X通过Hoverfly满足服务虚拟化

2023-11-10

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vert.X通过Hoverfly满足服务虚拟化 的相关文章

随机推荐

  • 3D形状分割:在ShapeNet数据集上使用PointNet++进行3D形状分割任务

    在本篇博客中 我们将探讨如何使用PointNet 模型在ShapeNet数据集上进行3D形状分割任务 3D形状分割是计算机视觉和深度学习领域的一个重要研究方向 可以用于识别3D点云数据中的不同部分 PointNet 是一种基于点云数据的深度
  • OSI模型与TCP\IP协议

    目录 一 分层 1 1 分层原因 1 2 OSI七层模型 二 TCP IP 2 1 TCP IP协议族的组成 模型层 物理层 网络层 传输层 应用层 三 数据封装过程 五 PDU协议数据定义 六 设备与各层对应关系 七 各层间通信 一 分层
  • dos bat批量创建软链接

    windows 下 要将 train2017 val2017 两个目录下的图片并入一个目录 images 用 mklink 创建软链接 1 可以不用额外空间 win10 也可以写 sh 脚本用 ln s 但效果似乎同 copy 因为用 ln
  • uni-app实战教程

    一 准备 下载HBuilderX编辑器 前往下载 注册百度AI账号 创建应用获得Appid和Secret 前往注册 百度AI通用物体识别文档 前往查阅 Uni App文档 前往查阅 HTML5 文档 前往查阅 HTML5 文档 前往查阅 二
  • IDEA插件分享(实用推荐)

    1 SequenceDiagram 序列图插件 查看方法内部的调用其他的序列图 使用方法 选中对应的方法 右击选择 SequenceDiagram 或者右上角点击SequenceDiagramtu bi 2 Maven Search 快速搜
  • 万户协同办公平台ezoffice未授权访问漏洞

    文章目录 0x01 前言 0x02 漏洞描述 0x03 影响范围 0x04 漏洞环境 0x05 漏洞复现 1 构造POC 2 进行MD5值解密 3 尝试进行登录 0x06 复现建议 0x01 前言 本次测试仅供学习使用 如若非法他用 与本文
  • [论文分享] TREX: Learning Execution Semantics from Micro-Traces for Binary Similarity

    TREX Learning Execution Semantics from Micro Traces for Binary Similarity Kexin Pei Columbia University Zhou Xuan Univer
  • HashMap的扩容机制、ConcurrentHashMap的原理

    HashMap的扩容机制 ConcurrentHashMap的原理 n 1 hash 相当于hash n public V put K key V value return putVal hash key key value false t
  • Android性能调优工具TraceView介绍

    转自 http www trinea cn android android traceview 本文主要介绍Android性能调优工具TraceView的使用及通过其确定性能点 目前性能优化专题已完成以下部分 性能优化总纲 性能问题及性能调
  • WIN10软件开机自启动设置(基于win10系统,不依赖第三方软件)

    开机启动项设置教程 第一步 win R打开运行窗口 输入命令msconfig 回车 第二步打开系统配置 切换到 启动 选项卡 第三步打开任务管理器 第四步单击选中想要禁止或者开启的软件 已启动代表开机时软件会自动启动 已禁用代表开机是软件不
  • “Intel VT-x处于禁用状态”怎么解决(图形化)

    Intel VT x处于禁用状态 如何解决 开启虚拟机时弹出这个提示 说明电脑的虚拟化没有开启 只有开启它 才能运行虚拟机 网上大多数 Intel VT x处于禁用状态 解决方案都是开机按Fn系列键进入BIOS设置 可是博主试了好多次 电脑
  • WEB攻击与防御

    这里列举一些常见的攻击类型与基本防御手段 XSS攻击 跨站脚本 Cross site scripting 简称XSS 把JS代码注入到表单中运行例如在表单中提交含有可执行的JS的内容文本 如果服务器端没有过滤或转义这些脚本 而这些脚本由通过
  • 判断带头结点的循环双链表是否对称

    题目 设计一个算法 用于判断带头结点的循环双链表是否对称 分析 循环双链表的特点是 当前结点方便找到前后节点 且尾指针指向第一个结点 对称性 判断第一个结点和最后一个结点的值是否相等 如果相等 再判断第二个结点和倒数第二个结点 以此类推 从
  • [论文阅读] (18)英文论文Model Design和Overview如何撰写及精句摘抄——以系统AI安全顶会为例

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇介绍CCS2019的P
  • 电子设计大赛作品_电子设计大赛

    为了进一步提高学生对电子和科技的兴趣 培养学生的动手能力和想象能力 增强学生的团队合作意识 提高学生分析和解决问题的能力 现决定开展电子设计大赛 电子设计大赛详情 一 参赛对象 全体全日制在校大学生 1 3人自由组队 并指定队长一名 可自由
  • 华为OD机试 - 简易内存池(Java)

    题目描述 请实现一个简易内存池 根据请求命令完成内存分配和释放 内存池支持两种操作命令 REQUEST和RELEASE 其格式为 REQUEST 请求的内存大小 表示请求分配指定大小内存 如果分配成功 返回分配到的内存首地址 如果内存不足
  • java-map-put方法源码分析

    HashMap是由数组 链表和红黑树组成的数据结构 而其中put方法可以算的上HashMap中的核心方法 这个方法给我们展示了HashMap的大部分精髓 我们首先来看一下map的核心变量 transient Node
  • 2022年一起努力应对互联网寒冬吧,5G音视频时代还不学NDK开发吗

    前言 找工作还是需要大家不要紧张 有我们干这一行的接触人本来就不多 难免看到面试官会紧张 主要是因为怕面试官问的问题到不上来 那时候不要着急 答不上了的千万不然胡扯一些 直接就给面试官说这块我还没接触到 以后如果工作当中遇到的话我可以很快的
  • i2c 编程接口

    1 通信接口 i2c发送或者接收一次数据都以数据包 struct i2c msg 封装 struct i2c msg u16 addr 从机地址 u16 flags 标志 define I2C M TEN 0x0010 十位地址标志 def
  • Vert.X通过Hoverfly满足服务虚拟化

    服务虚拟化是一种用于模拟基于组件的应用程序的依赖关系行为的技术 Hoverfly是用Go语言编写的服务虚拟化工具 可让您模拟HTTP S 服务 它是一个代理 它使用存储的响应来响应HTTP S 请求 并假装它是真正的对应对象 食蚜蝇Java