Sitemap
Nal Fr

Nal Fr

Have a passion to learn new technologies, fast learning specially on web and mobile apps interface.

Golang : Microservice REST API

5 min readJul 16, 2020

Baru kali ini punya waktu share tulisan tentang Golang, sudah sekitar 3 tahun lalu belajar. Saat belajar Golang, beberapa project saya rombak ke Golang dengan menggunakan arsitektur Microservice yang menurut pendapat pribadi saya lebih powerfull.

Tentu saja klo kita bicara perbandingan program language, ngga ada yg sempurna. Kita tinggal melihat kelebihan dan kekurangan lalu memanfaatkan hal tersebut untuk memecahkan masalah.

Press enter or click to view image in full size

Kali ini saya akan coba buat aplikasi REST API sederhana, dengan memanfaatkan modul-modul standard Golang. Bisa dilihat disini :

Beberapa library penting yang diperlukan :

github.com/go-sql-driver/mysqlgithub.com/joho/godotenvgithub.com/nicholasjackson/env

Jadi, katakanlah kita memiliki tabel product dengan database Mysql

Press enter or click to view image in full size
Table Product Mysql

Tabel ini akan dibuat REST API untuk POST, GET, PUT untuk mengelola table ini. Berikut beberapa endpoint yang ingin dibuat :

  1. GET : Untuk menampilkan seluruh data produk (Endpoint : /products)
  2. GET : Untuk menampilkan data produk tertentu, katakanlah by ID (Endpoint : /product/{id})
  3. POST : Untuk menambah produk baru ke dalam tabel (Endpoint : /products)
  4. PUT : Untuk mengubah data produk (Endpoint : /products)

Ini hal standard pada REST API sederhana.

Struktur Project saya sangat sederhana agar mudah di manage saya buat sebagai berikut :

struktur project golang

Config : merupakan file untuk konfigurasi koneksi ke database

Handlers : merupakan file untuk mengatur fungsi-fungsi yang didefenisikan di routing endpoint. Fungsi yang ada dalam Handlers juga akan mengambil data dari model lalu menampilkannya dalam bentuk JSON.

Model : merupakan file untuk membuat inteface struktur data dan fungsi-fungsi yang berhubungan dengan database seperti SELECT, INSERT dan UPDATE.

Utils : merupakan file utility untuk membuat interface JSON response dari API.

Get Nal Fr’s stories in your inbox

Join Medium for free to get updates from this writer.

Kita mulai mengcoding..

Press enter or click to view image in full size
config/connectdbgo

Kita membuat fungsi MYSQL() dimana output dari fungsi ini adalah (*sql.DB, error) yang merupakan koneksi ke database dan error jika terjadi error koneksi.

Note : di Golang error handling itu wajib ya.

Agar lebih aman, parameter DB kita tulis di file .env sehingga kita memerlukan library os.Getenv untuk membaca parameter di file env.

Press enter or click to view image in full size
model/products.go

Kita membuat struktur data dari table yang akan kita gunakan, dan kita membuat tipe ListProducts untuk menampung model data dari table nantinya. Ada juga constanta table, yang berisi nama table yang akan kita gunakan yakni table “product”.

Press enter or click to view image in full size
model/products.go

Kita membuat fungsi GetProductAll() dengan output ListProducts yang telah kita buat sebelumnya dan error untuk menghandle jika terjadi error.

Fungsi GetProductAll() ini berisi akses ke database, lalu perintah SQL untuk melakukan query SELECT semua data yang ada pada table product lalu hasilnya akan ditampung di ListProducts.

Jika proses koneksi database, query data terjadi error maka aplikasi akan menuliskan error pada log. Jika tidak ada error, maka akan mengembalikan listProduct yang berisi record2 hasil query.

Note : untuk fungsi INSERT, UPDATE nanti akan dibahas terpisah.

utils/res.go

func ResponseJSON(w http.ResponseWriter, payload interface{}, status int) {

mapdata := map[string]interface{}{}

mapdata["status"] = ok
mapdata["message"] = "success"
mapdata["data"] = payload

response, err := json.Marshal(mapdata)

w.Header().Set("Content-Type", "application/json")
if err != nil {
http.Error(w, "Bad Request", http.StatusBadRequest)
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(status)
_, _ = w.Write(response)

}

Fungsi ini merupakan fungsi struktur response JSON yang akan diterima oleh user ketika melakukan request ke endpoint API. Jika request sukses user akan menerima response JSON yang berisi : status, message dan data record.

Press enter or click to view image in full size
handlers/product.go

Kita membuat fungsi handler untuk menangani request getProducts() dimana fungsi ini akan memanggil fungsi GetProductAll() pada package model, lalu hasil return nya akan di mapping oleh fungsi ResponseJSON lalu di berikan ke user.

File : main.go

unc main() {
_ = env.Parse()
newlog := log.New(os.Stdout, "gomicroservice", log.LstdFlags)
hp := handlers.NewProduct(newlog)

sm := http.NewServeMux()
sm.Handle("/products", hp)
sm.Handle("/product/", hp)

s := http.Server{
Addr: *bindAddress,
Handler: sm,
ErrorLog: newlog,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
}

// start server
go func() {
newlog.Println("Starting server on port 9090")
err := s.ListenAndServe()
if err != nil {
newlog.Printf("Error starting server : %s\n\n", err)
os.Exit(1)
}
}()

c := make(chan os.Signal, 0)
signal.Notify(c, os.Interrupt)
signal.Notify(c, os.Kill)

// Block until a signal is received.
sig := <-c
log.Println("Got signal:", sig)

// gracefully shutdown the server, waiting max 30 seconds for current operations to complete
ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
_ = s.Shutdown(ctx)
}

Fungsi main.go ini merupakan fungsi awal aplikasi dimana kita membuat 2 routing sebagai endpoint, untuk GET All Product routingnya “/products” yang akan ditangani oleh package handlers.

Kemudian kita membuat http Server pada port 9090, yang merupakan server yang akan menangani request API.

Source Code : https://github.com/enalfarid/go-productms

Jika tertarik mempelajari tentang Microservice Golang, berikut channel youtube yang saya rekomendasikan :

Sangat lengkap pembahasan dari dasar hingga lanjutan. Semoga bermanfaat.

--

--

Nal Fr
Nal Fr

Written by Nal Fr

0 followers

Have a passion to learn new technologies, fast learning specially on web and mobile apps interface.