單元測試中創(chuàng)建內(nèi)置ignite server

TLDR

導(dǎo)入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是一個高性能、集成了計算、緩存和事務(wù)性數(shù)據(jù)網(wǎng)格的分布式數(shù)據(jù)庫,適用于大規(guī)模數(shù)據(jù)處理。它可以在內(nèi)存中處理大量的數(shù)據(jù),以提供快速的數(shù)據(jù)訪問和處理能力,是許多高并發(fā)、低延遲的應(yīng)用的理想選擇。

單元測試是軟件開發(fā)的重要組成部分。它有助于開發(fā)者檢測代碼中的錯誤,驗證每個組件或模塊的功能,并確保代碼的質(zhì)量。通過單元測試,我們可以在早期發(fā)現(xiàn)問題,節(jié)省問題修復(fù)的時間,并提高軟件的可靠性。

然而,在進行單元測試時,一種常見的問題是如何處理依賴關(guān)系。比如說,當(dāng)你的代碼依賴于Apache Ignite時,你需要一個運行的Ignite服務(wù)來運行你的測試。在這種情況下,啟動一個內(nèi)置的Ignite服務(wù)器可以使得測試更加自包含和可重復(fù),不需要單獨設(shè)置和管理一個外部Ignite服務(wù)器。內(nèi)置Ignite服務(wù)器在測試開始時啟動,在測試結(jié)束時關(guān)閉,使得測試更加清晰和穩(wěn)定。

啟動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);

首先,代碼從操作系統(tǒng)獲取了三個空閑的網(wǎng)絡(luò)端口,這些端口用于客戶端連接器、JDBC和HTTP服務(wù)。這些信息也會被記錄在日志中。

接著,配置Ignite服務(wù)實例,包括設(shè)置發(fā)現(xiàn)服務(wù)(Discovery SPI)、通信服務(wù)(Communication SPI)、實例名和一致性ID。然后,創(chuàng)建和設(shè)置Connector和Client Connector的配置,包括設(shè)置JDBC和客戶端連接器的端口號。

然后,創(chuàng)建一個臨時文件夾,用于存放Jetty配置文件。Jetty是一個HTTP服務(wù)器和Servlet容器,這里主要用于Ignite的HTTP服務(wù)。通過調(diào)用createJettyConfigFile方法,創(chuàng)建Jetty的配置文件,并設(shè)置其監(jiān)聽端口為前面獲取的HTTP服務(wù)的端口。然后將這個配置文件的路徑設(shè)置到Connector的配置中。

最后,使用Ignite的Ignition類的start方法,傳入配置好的IgniteConfiguration,啟動Ignite服務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容