Showing posts with label loadbalancing. Show all posts
Showing posts with label loadbalancing. Show all posts

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




Saturday, March 17, 2018

LoadBalancing Percona-MySQL with HAproxy and ClusterCheck

         Untuk postingan kali ini saya akan membahas tentang bagaimana cara loadbalancing 3 nodes Percona-xtradb MySQL cluster dengan menggunakan haproxy dan clustercheck. Untuk lebih mengenal apa itu percona-xtradb dapat mengunjungi halaman dokumentasi resminya di percona-xtradb official. Untuk loadbalancing ketiga nodes ini kita membutuhkan clustercheck, xinetd dan HAproxy. 


Kita akan bahas satu persatu, clustercheck adalah shell script yang akan check status node percona-mysql apakah ready to accept request. Jika ready, clustercheck akan respon HTTP code 200 (OK), jika tidak HTTP error 503 (Service Unavailable) akan dikirim. Xinetd (xtended Internet daemon) adalah opensource daemon yang dapat membuka koneksi untuk request pada jaringan dengan menyediakan sebuah service. Xinetd akan kita gunakan untuk membuka service pada port 9200 yang akan digunakan clustercheck untuk report status node percona-mysql. Haproxy yang menjadi balancer akan check ke port 9200 yang telah disediakan oleh xinetd pada setiap node untuk menentukan apakah node tersebut dapat digunakan.

Prerequisites :
- Centos 7 64bit
- Git installed
- Percona-XtraDB cluster sudah di setup dan sync di ketiga nodes.

Next kita masuk ke konfigurasi, lakukan step berikut di ketiga node :

  • Install xinetd

  • Add user untuk clustercheck

  • Clone repository clustercheck dan copy clustercheck file ke /usr/bin

  • Create file mysqlchk ke /etc/xinetd.d

  • Add service mysqlchk ke /etc/services

  • Verifikasi konfigurasi, bila return = 0, node tersebut sudah sync 

  • Restart service xinet.d, jika sudah maka di setiap node akan listen di port 9200/xinetd
  • Setelah semua step diatas selesai dilakukan di setiap node, kita beralih ke haproxy.
  • Konfigurasi /etc/haproxy/haproxy.cfg dan sesuaikan hostname setiap node


Selesai, 3 node percona-mysql tersebut akan di loadbalancing oleh HAproxy yang akan melakukan check melalui port 9200. Dari sisi aplikasi, endpoint yang digunakan untuk menembak percona-mysql adalah ip dan port yang di set pada HAproxy. Selamat mencoba guys.

Referensi :