有了分布式網(wǎng)格,一個(gè)很樸素的想法就是能將自己的應(yīng)用部署到網(wǎng)格中運(yùn)行,并且網(wǎng)格可以保證HA和failover。 Ignite可以非常便利的實(shí)現(xiàn)這一點(diǎn),廢話不多說(shuō),直接開(kāi)干。
需求
一個(gè)定時(shí)任務(wù),可以根據(jù)指定的時(shí)間周期向client節(jié)點(diǎn)發(fā)出信息
實(shí)現(xiàn)
- 作業(yè)調(diào)度
需求中需要服務(wù)可以周期性執(zhí)行,顯然需要有簡(jiǎn)單的作業(yè)調(diào)度功能。Ignite中有scheule模塊,只不過(guò)由于是LGPL的license,因此build-in的模塊中沒(méi)有,需要手動(dòng)build
下載Ignite源碼包,如 apache-ignite-2.2.0-src.zip
解壓并進(jìn)入apache-ignite-2.2.0-src\modules\schedule目錄
執(zhí)行命令 mvn clean package -DskipTests -Prelease,lgpl
進(jìn)入target目錄,將ignite-schedule-2.2.0.jar和libs\cron4j-2.2.5.jarcopy至IGNITE_HOME\libs目錄下
這樣,Ignite就可以調(diào)度作業(yè)了
- 實(shí)現(xiàn)service
Ignite的Servcie Grid服務(wù)需要實(shí)現(xiàn)IgniteServices接口, 而Ignite可以保證服務(wù)可以以Node Singleton或者Cluster Singleton模式運(yùn)行并實(shí)現(xiàn)負(fù)載均衡
public class MyServiceImpl implements Service {
@IgniteInstanceResource
private Ignite ignite;
private String svcName;
@Override
public void init(ServiceContext ctx) {
svcName = ctx.name();
System.out.println("Service was initialized: " + svcName);
IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forClients());
rmtMsg.remoteListen("MyOrderedTopic", (nodeId, msg) -> {
System.out.println("Received ordered message [msg=" + msg + ", from=" + nodeId + ']');
return true; // Return true to continue listening.
});
ignite.scheduler().scheduleLocal(
new Runnable() {
@Override
public void run() {
rmtMsg.send("MyOrderedTopic", "hello");
System.out.println("Send message");
}
}, "* * * * *" //send msg every mintue
);
}
@Override
public void cancel(ServiceContext ctx) {
System.out.println("Service was cancelled: " + svcName);
}
@Override
public void execute(ServiceContext ctx) {
// Since our service is simply demo, there is nothing we need
// to do in order to start it up.
System.out.println("Executing distributed service: " + svcName);
}
}
- build service jar 包
通過(guò)maven將此代碼build成jar包后放置到IGNITE_HOME\libs目錄下, 由于Ignite現(xiàn)不支持service的Zero Deployment, 因此此jar包需要放置到所有需要運(yùn)行此服務(wù)的所有節(jié)點(diǎn)中
- 配置service服務(wù)
打開(kāi)配置文件,編輯如下內(nèi)容
<bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="serviceConfiguration">
<list>
<bean class="org.apache.ignite.services.ServiceConfiguration">
<property name="name" value="MyClusterSingletonSvc"/>
<property name="maxPerNodeCount" value="1"/>
<property name="totalCount" value="1"/>
<property name="service">
<ref bean="myServiceImpl"/>
</property>
</bean>
</list>
</property>
</bean>
<bean id="myServiceImpl" class="com.abc.igniteservicedemo.MyServiceImpl"/>
</bean>
這里我們?cè)O(shè)定此服務(wù)為Cluster Singleton模式,如需要設(shè)置Node Singleton模式,去掉
<property name="totalCount" value="1"/>
即可
- 啟動(dòng)Ignite后會(huì)看到如下輸出
[18:10:55] Security status [authentication=off, tls/ssl=off]
Service was initialized: MyClusterSingletonSvc
Executing distributed service: MyClusterSingletonSvc
[18:10:59] Performance suggestions for grid (fix if possible)
... ...
[18:10:59] Topology snapshot [ver=1, servers=1, clients=0, CPUs=4, heap=1.0GB]
Send message
Send message
至此,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的service grid服務(wù)