extend ../_components/base.pug

block pagetitle
    title Apache Ignite Services, Distributed Service Grid
    meta(name="description", content="Apache Ignite Service Grid allows to deploy various types of singleton services in the cluster or multiple service instances. Build a fault-tolerant, scalable, high-performant, microservice-based solution with Apache Ignite.")
    link(rel="canonical", href="https://ignite.apache.org/features/service-apis.html")

    meta(property="og:title", content="Apache Ignite Services, Distributed Service Grid")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/features/service-apis.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Apache Ignite Service Grid allows to deploy various types of singleton services in the cluster or multiple service instances. Build a fault-tolerant, scalable, high-performant, microservice-based solution with Apache Ignite.")

block css 
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/service.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/compute-apis.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)

    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/highlight/java.min.js")
    script(src="../js/vendor/highlight/xml.min.js")
    script(src="../js/vendor/highlight/csharp.min.js")



block main
    - global.pageHref = "features"
    - config.hdrClassName = "hdr__blue"
    include ../_components/header.pug


    section.innerhero
        .container.innerhero__cont
            .innerhero__main
                .innerhero__pre.pb-3 Apache Ignite
                h1.h1.innerhero__h1 Service APIs
                .innerhero__descr.pt-2.h5.
                    Deploy your microservices straight on the cluster nodes and<br> trigger execution from the application code
                .innerhero__action 
                    a.button.innerhero__button(href="https://ignite.apache.org/docs/latest/index") Start Coding
            img.innerhero__pic.innerhero__pic--servicegrid(src="/img/features/service/service-hero.svg", alt="Distributed In-Memory Cache")
    // /.innerhero

  

    section.service1
      .container
       h2.service1__h2 Apache Ignite Service APIs Overview
       .fz20.service1__text With the services API, you can create and deploy arbitrary services on the cluster. For instance, you may want to implement custom counters, hierarchical maps, or anything that you treat as a microservice.
    // /.service1
    

    section.nativecode.container.jsTabWrap
        header.blockheader.blockheader--spl.flexi
            h2.h4.blockheader__left Use Contemporary Powerful Languages
            .blockheader__right.service-subtextvideo.fz20
                p Create scalable microservices in languages such as Java or C#
        .nativecode__tabctrls.flexi
            a(href="#", data-tablink="nativeTabJava").nativecode__link.active Java
         
        .nativecode__tabs
            .nativecode__tab(data-tab="nativeTabJava").active
                pre.nativecode__codebox 
                    code.java.
                        Ignite ignite = Ignition.start();

                        //get the services interface associated with all server nodes
                        IgniteServices services = ignite.services();
                        
                        //start a node singleton
                        services.deployClusterSingleton("myCounterService", new MyCounterServiceImpl());
            
    // /.nativecode

    section.service2
      .container
         h2.service2__h2.h4 Services Deployment Modes
         .service2__text Deploy single or many instances of a service on the cluster
         .service2__block
             .service2item.service2item__one.flexi
                .service2item__info
                   h3.service2item__title Cluster Singleton
                   p.service2item__text The most commonly used feature is to deploy singleton services on the cluster.
                   p.service2item__text There is only one instance of the service in the cluster, and Ignite guarantees<br> that the instance is always available. 
                   p.service2item__text In case the cluster node on which the service is deployed disconnects, Ignite automatically redeploys the instance to another node.
                   
                img.service2item__image1(src="/img/features/service/one-image.svg", alt="one-image")

             .service2item.service2item__two.flexi
                img.service2item__image2(src="/img/features/service/two-image.svg", alt="two-image")
                .service2item__info.service2item__info2
                   h3.service2item__title Node Singleton
                   p.service2item__text You can specify your service as part of the node configuration and start<br> the service together with the node.
                   p.service2item__text The service is started on each node of the cluster. If the service is a cluster singleton, it is started in the first cluster node, and is redeployed to one <br>of the other nodes if the first node terminates.
              
   
     

    section.compute2
     .container
       h2.compute2__h2 Benefits Of Apache Ignite Service APIs
       .compute2__grid 
            .compute2item
              .compute2-points__item.fz20
              .compute2item__block
                h3.fz20.compute2item__title Load balancing
                p.compute2__text In all cases, other than singleton service deployment, Ignite makes sure that an equal number of services are deployed on each node within the cluster. 
                p.compute2__text Whenever cluster topology changes, Ignite will re-evaluate service deployments and may re-deploy an already deployed service on another node for better load balancing.
            .compute2item
              .compute2-points__item.fz20
              .compute2item__block
                h3.fz20.compute2item__title Fault Tolerance
                p.compute2__text Ignite always guarantees that services are continuously available, and are deployed according to the specified configuration, regardless of any topology changes or node crashes.
            .compute2item
              .compute2-points__item.fz20
              .compute2item__block
                h3.fz20.compute2item__title Hot Redeployment
                p.compute2__text You can update the implementation of a service without stopping the cluster.
                p.compute2__text Use Ignite’s DeploymentSpi configuration to re-deploy services without restarting the cluster. 
    // /.compute2

    section.native-bottom.container
        .native-bottom__grid 
            article.nativebotblock
                .h4.nativebotblock__title
                    img(src="/img/features/native-rocket.svg", alt="").nativebotblock__icon
                    span Ready to Start?
                p.nativebotblock__text Start coding with Ignite Service APIs
                a.nativebotblock__link.arrowlink(href="https://ignite.apache.org/docs/latest/services/services#re-deploying-services", target="_blank") Performing Service APIs 
            article.nativebotblock.nativebotblock--learn
                .h4.nativebotblock__title
                    img(src="/img/features/native-docs.svg", alt="").nativebotblock__icon
                    span Want to Learn More?
                p.nativebotblock__text Check out a special tutorial that shows how to build and deploy microservices with Ignite Service APIs
                a.nativebotblock__link.servicenativelink.arrowlink(href="https://www.gridgain.com/resources/blog/implementing-microservices-apache-ignite-service-apis-part-iii", target="_blank") Implementing Microservices<br> With Apache Ignite Service APIs




