Friday, December 14, 2018

Create Client Load Balancing with Spring Boot

Halo sobat nostra,
Kali ini saya akan menjelaskan bagaimana cara create client load balancing dengan spring boot

Nah, apa itu load balancing?
Apa sih gunanya load balancing?
Load balancing merupakan teknik yang digunakan untuk mendistribusikan beban trafik pada dua atau lebih jalur koneksi secara seimbang, dimana gunanya agar trafik dapat berjalan secara optimal,  memaksimalkan throughput serta menghindari overload pada salah satu jalur koneksi.

Untuk memulai, pertama kita create 2 project Spring Boot
  • Spring Boot untuk simple restfull service, untuk project ini akan kita jalankan pada port 8090, 8091, dan 8092 (localhost:8090, localhost:8091, localhost:8092)
  • Spring Boot untuk load Balancing yaitu Ribbon Client, dan untuk project ini di jalankan pada port 8080 (localhost:8080)
  1. Create Spring Boot Project for Simple Restfull Service
    Tambah code berikut pada pom.xml
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    Kemudian buat controller untuk request mapping
    package drools.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class WebController {
        @Value("${server.port}")
        String port;
    
        @RequestMapping(value = "/")
        public String home() {
             return "Hello!";    }
    
        @RequestMapping("/greeting")
        public String hello() {
             return "Hello from a service running at port: " + port + "!";
        }
    }
  2. Create Spring Boot Project for Ribbon Client
    Tambah code berikut pada pom.xml
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    Konfigurasi ribbon client pada file application.yaml
    spring:
        application:
            name: Ribbon-Client
    
    helloworld:
        ribbon:
            eureka:
                enabled: false
            listOfServers: localhost:8090,localhost:8091,localhost:8092
            ServerListRefreshInterval: 1000
    
    server:
        port: 8080
    listOfServer merupakan list server untuk load balancing,
    ServerListRefreshInterval merupakan waktu interval. interval yang digunakan untuk refresh ribbon service

    Kemudian create satu class Configuration. config.java
    package drools.config;
    
    import com.netflix.loadbalancer.AvailabilityFilteringRule;
    import com.netflix.loadbalancer.IPing;
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.PingUrl;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.netflix.client.config.IClientConfig;
    import org.springframework.context.annotation.Bean;
    
    public class config {
        @Autowired
        IClientConfig ribbonClientConfig;
    
        @Bean
        public IPing ribbonPing(IClientConfig config) {
            return new PingUrl();
        }
    
        @Bean
        public IRule ribbonRule(IClientConfig config) {
            return new AvailabilityFilteringRule();
        }
    }
    IClientConfig digunakan untuk menyimpan semua konfigurasi client yang kita define dalam code
    IPing merupakan komponen yang menentukan mekanisme yang kita gunakan untuk menentukan ketersediaan server secara real-time, memeriksa server apakah masih hidup
    IRule merupakan komponen logic yang menentukan aturan load balancing yang kita gunakan dalam spring boot. Dalam project ini kita menggunakan AvailabilityFilteringRule, dimana dalam aturan ini akan memilih server yang available atau yang tersedia.

    Create sebuah load balancing controller WebController.java
    package drools.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class WebController {
        @LoadBalanced
        @Bean
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/helloworld")
        public String home() {
             return this.restTemplate.getForObject("http://helloworld/greeting", 
                 String.class);
        }
    }
    Dalam controller diatas, digunakan anotasi @LoadBalanced untuk konfigurasi restTemplate sebagai LoadBalancerClient.
  3. Run and check results
  • Run Restfull Service pada port 8090, 8091, 8092
    mvn spring-boot:run -Dserver.port=8090
         mvn spring-boot:run -Dserver.port=8091
        mvn spring-boot:run -Dserver.port=8092

  • Kemudian run Ribbon Client
    mvn spring-boot:run
        dan jalankan http://localhost:8080/helloworld pada browser atau postman, dan kita akan   menerima output dari service 8090, 8091, 8092


dan log akan seperti gambar diatas jika kita menjalankan service ribbon client

Jika kita mematikan salah satu service pada restfull service maka kita akan menemukan connection refused pada log ribbon client.
Namun demikian, ribbon client akan tetap berjalan dari service yang masih hidup.
Dan Jika kita mematikan semua service, kita akan menemukan pada log no up servers available

Oke, sekian penjelasan saya, semoga bermanfaat
Terima kasih




No comments:

Post a Comment