Ignite實(shí)戰(zhàn)之五 第一個(gè)Service Grid應(yīng)用

有了分布式網(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

  1. 下載Ignite源碼包,如 apache-ignite-2.2.0-src.zip

  2. 解壓并進(jìn)入apache-ignite-2.2.0-src\modules\schedule目錄

  3. 執(zhí)行命令 mvn clean package -DskipTests -Prelease,lgpl

  4. 進(jìn)入target目錄,將ignite-schedule-2.2.0.jarlibs\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ù)

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

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

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