前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >要黑盒测试微服务内部服务间调用,我该如何实现?

要黑盒测试微服务内部服务间调用,我该如何实现?

作者头像
用户2781897
发布2020-02-25 13:00:46
8190
发布2020-02-25 13:00:46
举报
文章被收录于专栏:服务端思维服务端思维

作者 | 梁桂钊

出品 | 服务端思维

单体系统和微服务的区别在于,一个单体系统是一个大而全的功能集合,每个服务器运行的是这个应用的完整服务。而微服务是独立自治的功能模块,它是生态系统中的一部分,和其他微服务是共生关系。随着微服务架构的普及,我们遇到了许多服务之间相互依赖。那么,我们需要对其进行模块测试就有点力不从心了。例如,我们的模块中存在服务 A 内部依赖于服务 B,而整个模块又依赖于服务 C,如图所示。

那么,针对微服务的内部服务依赖,我们如何实现测试呢?

事实上,我们由两种方案。第一种方案,我们将所有依赖的服务都进行构建与打包,然后统一部署进行测试。但是呢,这种方案过于复杂,且可能会可能演变成集成测试。因此,第二种方案通过虚拟化服务进行 API 仿真就显得更加合适了。对此,Hoverfly 作为一种新的服务虚拟化工具,可以模拟 HTTP 和 HTTPS 服务。Hoverfly 会启动一个代理,并使用存储的内容对请求进行响应,而这个响应和真实服务针对特定的请求产生的响应完全一致。如果整个流程能被正确地执行,并且存储地响应和真实服务一致,则 Hoverfly 可以完美地模拟真实服务。

读者可以通过官方教程进行安装,链接:https://hoverfly.readthedocs.io/en/latest/pages/introduction/downloadinstallation.html。

本文的示例教程以开放在 github,可以下载运行,链接:https://github.com/lianggzone/hoverfly-samples

其中最为核心的是 hoverfly-provider 服务提供一个 API 接口,通过 http://localhost:8080/health 提供服务。

代码语言:javascript
复制
@RestController
public class HealthController {
    @RequestMapping(value = "/health")
    public HealthVO getHealthInfo() {
        HealthVO healthVO = HealthVO.builder()
                .msg("OK")
                .timestrap(System.currentTimeMillis())
                .build();
        return healthVO;
    }
}

而另外一个 hoverfly-service 服务通过 RestTemplate 进行内部服务调用,并通过 http://localhost:8089/health 提供服务。

代码语言:javascript
复制
@Component
public class HoverflyProxy {
    @Autowired
    private RestTemplate restTemplate;

    public HealthVO getHealthInfo(){
        String url = "http://localhost:8080/health";
        HealthVO healthVO = restTemplate.getForEntity(url, HealthVO.class).getBody();
        return healthVO;
    }
}

@RestController
public class HealthController {
    @Autowired
    private HoverflyProxy hoverflyProxy;

    @RequestMapping(value = "/health")
    public HealthVO getHealthInfo() {
        return hoverflyProxy.getHealthInfo();
    }
}

现在,准备好必要的工作后,我们来聊一聊如何使用 Hoverfly 进行虚拟化服务。首先,我们需要启动 Hoverfly。

代码语言:javascript
复制
hoverctl start

Hoverfly 启动后,提示其代理端口和管理台端口,如图所示。

然后,我们将 Hoverfly 切换成捕获模式。

代码语言:javascript
复制
hoverctl mode capture

我们启动 hoverfly-provider 服务和 hoverfly-service 服务,进行 http://localhost:8089/health 接口调用。注意的是,这里,我们需要指定 Hoverfly 作为代理。

代码语言:javascript
复制
curl localhost:8089/health -H "Content-Type: Content-Type" --proxy localhost:8500

此时,我们通过指定 proxy 参数,请求会首先转发到 Hoverfly 代理服务,然后再被转发到真正的业务服务,而响应接受过程也是如此。

最后,我们采集足够多的样本后,就可以切换到仿真模式。

代码语言:javascript
复制
hoverctl mode simulate

在仿真模式下,我们再次发起相同的请求。

代码语言:javascript
复制
curl localhost:8089/health -H "Content-Type: Content-Type" --proxy localhost:8500

Hoverfly 会将之前记录袭来的请求来响应业务结果。

那么,我也可以通过其控制台进行查看。

事实上,一旦 Hoverfly 存储了请求和响应的数据,我们就不需要访问真正的业务访问,做到真正的仿真测试。次数,我们可以通过如下命名导出结果文件 simulations.json。

代码语言:javascript
复制
hoverctl export simulate.json

然后,根据持续集成和持续测试的规格标准,进行配置文件依赖的初始化即可。(这里,可以通过 hoverctl import simulations.json 执行)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 服务端思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
持续集成
CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档