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服务。