单元测试中创建内置ignite server

举报
张俭 发表于 2023/12/30 10:03:11 2023/12/30
【摘要】 TLDR 导入maven依赖<dependency> <groupId>io.github.embedded-middleware</groupId> <artifactId>embedded-ignite-core</artifactId> <version>0.0.1</version> <scpoe>test</scope></dependency>Embed...

TLDR

导入maven依赖

<dependency>
    <groupId>io.github.embedded-middleware</groupId>
    <artifactId>embedded-ignite-core</artifactId>
    <version>0.0.1</version>
    <scpoe>test</scope>
</dependency>
EmbeddedIgniteServer server = new EmbeddedIgniteServer();
server.start();
Assertions.assertTrue(server.clientConnectorPort() > 0);
Assertions.assertTrue(server.jdbcPort() > 0);
Assertions.assertTrue(server.httpPort() > 0);

在ignite server里,clientConnectorPort默认是10800,也是我们最常使用的端口。jdbc端口默认是11211,http默认是8080.

背景

Apache Ignite是一个高性能、集成了计算、缓存和事务性数据网格的分布式数据库,适用于大规模数据处理。它可以在内存中处理大量的数据,以提供快速的数据访问和处理能力,是许多高并发、低延迟的应用的理想选择。

单元测试是软件开发的重要组成部分。它有助于开发者检测代码中的错误,验证每个组件或模块的功能,并确保代码的质量。通过单元测试,我们可以在早期发现问题,节省问题修复的时间,并提高软件的可靠性。

然而,在进行单元测试时,一种常见的问题是如何处理依赖关系。比如说,当你的代码依赖于Apache Ignite时,你需要一个运行的Ignite服务来运行你的测试。在这种情况下,启动一个内置的Ignite服务器可以使得测试更加自包含和可重复,不需要单独设置和管理一个外部Ignite服务器。内置Ignite服务器在测试开始时启动,在测试结束时关闭,使得测试更加清晰和稳定。

启动Ignite Server的核心代码详解

int[] ports = SocketUtil.getFreeServerPorts(3);
this.clientConnectorPort = ports[0];
this.jdbcPort = ports[1];
this.httpPort = ports[2];
log.info("clientConnectorPort is {} jdbcPort is {} httpPort is {}", clientConnectorPort, jdbcPort, httpPort);
igniteConfiguration.setDiscoverySpi(new IsolatedDiscoverySpi());
igniteConfiguration.setCommunicationSpi(new StandaloneNoopCommunicationSpi());
igniteConfiguration.setIgniteInstanceName("local-ignite-server");
igniteConfiguration.setConsistentId("local-ignite-server");
ConnectorConfiguration connectorConfiguration = new ConnectorConfiguration();
connectorConfiguration.setPort(jdbcPort);
File jettyConfigFolder = Files.newTemporaryFolder();
jettyConfigFolder.deleteOnExit();
createJettyConfigFile(jettyConfigFolder, httpPort);
connectorConfiguration.setJettyPath(jettyConfigFolder.getAbsolutePath() + File.separator + "jetty.xml");
igniteConfiguration.setConnectorConfiguration(connectorConfiguration);
ClientConnectorConfiguration clientConnectorConfiguration = new ClientConnectorConfiguration();
clientConnectorConfiguration.setPort(clientConnectorPort);
igniteConfiguration.setClientConnectorConfiguration(clientConnectorConfiguration);
this.ignite = Ignition.start(igniteConfiguration);

首先,代码从操作系统获取了三个空闲的网络端口,这些端口用于客户端连接器、JDBC和HTTP服务。这些信息也会被记录在日志中。

接着,配置Ignite服务实例,包括设置发现服务(Discovery SPI)、通信服务(Communication SPI)、实例名和一致性ID。然后,创建和设置Connector和Client Connector的配置,包括设置JDBC和客户端连接器的端口号。

然后,创建一个临时文件夹,用于存放Jetty配置文件。Jetty是一个HTTP服务器和Servlet容器,这里主要用于Ignite的HTTP服务。通过调用**createJettyConfigFile**方法,创建Jetty的配置文件,并设置其监听端口为前面获取的HTTP服务的端口。然后将这个配置文件的路径设置到Connector的配置中。

最后,使用Ignite的Ignition类的start方法,传入配置好的IgniteConfiguration,启动Ignite服务。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。