Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
Tutorial Microservices dengan Golang
News Go

Tutorial Microservices dengan Golang

18 July 2024 · 5 menit baca · Ihsan Arif

Microservices adalah arsitektur perangkat lunak yang memecah aplikasi monolitik menjadi serangkaian layanan kecil yang independen, masing-masing berjalan dalam prosesnya sendiri dan berkomunikasi melalui antarmuka yang ringan, biasanya HTTP.

Tutorial Microservices dengan Golang

Pengantar

Microservices adalah arsitektur perangkat lunak yang memecah aplikasi monolitik menjadi serangkaian layanan kecil yang independen, masing-masing berjalan dalam prosesnya sendiri dan berkomunikasi melalui antarmuka yang ringan, biasanya HTTP. Pendekatan ini memungkinkan skalabilitas yang lebih baik, pengembangan yang lebih cepat, dan pemeliharaan yang lebih mudah. Golang, dengan performa tinggi dan dukungan untuk pemrograman bersamaan, adalah pilihan yang sangat baik untuk membangun arsitektur microservices. Dalam artikel ini, kita akan membahas cara membangun aplikasi microservices menggunakan Golang, dengan fokus pada komunikasi antar layanan, pengelolaan data, dan penanganan kesalahan. Untuk informasi lebih lanjut tentang arsitektur RESTful dan praktik terbaik, Anda dapat merujuk ke tutorial Golang RESTful API dan Clean Architecture .

1. Konsep Dasar Microservices

Sebelum kita mulai membangun, penting untuk memahami konsep dasar microservices:

  • Independensi Layanan: Setiap layanan adalah aplikasi yang sepenuhnya independen, dapat dikembangkan, diuji, dan dikerahkan secara terpisah.
  • Komunikasi Antar Layanan: Layanan berkomunikasi satu sama lain melalui protokol ringan seperti HTTP/HTTPS atau gRPC.
  • Pengelolaan Data Terdistribusi: Setiap layanan mengelola databasenya sendiri untuk menghindari keterikatan dan mempermudah skalabilitas.
  • Penanganan Kesalahan dan Pemulihan: Layanan harus dirancang untuk menangani kesalahan secara efisien dan dapat pulih dari kegagalan dengan cepat.

2. Persiapan Lingkungan

Pastikan Anda telah menginstal Golang di sistem Anda. Jika belum, Anda dapat mengunduh dan menginstalnya dari situs resmi Golang . Selain itu, kita akan menggunakan beberapa library tambahan untuk mempermudah pembangunan microservices.

3. Membuat Struktur Proyek

Untuk proyek ini, kita akan membangun dua layanan sederhana: UserService dan OrderService. Struktur proyek akan terlihat seperti ini:

sh
 1microservices/
 2├── user_service/
 3│   ├── main.go
 4│   ├── controllers/
 5│   ├── models/
 6│   ├── repositories/
 7│   ├── services/
 8│   └── config/
 9├── order_service/
10│   ├── main.go
11│   ├── controllers/
12│   ├── models/
13│   ├── repositories/
14│   ├── services/
15│   └── config/

4. Membuat UserService

Buat direktori user_service dan file main.go:

go
 1package main
 2
 3import (
 4    "log"
 5    "net/http"
 6    "user_service/config"
 7    "user_service/controllers"
 8
 9    "github.com/gorilla/mux"
10)
11
12func main() {
13    db, err := config.ConnectDatabase()
14    if err != nil {
15        log.Fatal(err)
16    }
17    defer db.Close()
18
19    router := mux.NewRouter()
20    controllers.RegisterUserRoutes(router, db)
21
22    log.Println("User Service running on port 8000")
23    http.ListenAndServe(":8000", router)
24}

5. Konfigurasi Database untuk UserService

Buat direktori config dan file config/database.go:

go
 1package config
 2
 3import (
 4    "database/sql"
 5    "log"
 6
 7    _ "github.com/go-sql-driver/mysql"
 8)
 9
10func ConnectDatabase() (*sql.DB, error) {
11    dsn := "user:password@tcp(127.0.0.1:3306)/userservice"
12    db, err := sql.Open("mysql", dsn)
13    if err != nil {
14        log.Fatal(err)
15        return nil, err
16    }
17    if err := db.Ping(); err != nil {
18        log.Fatal(err)
19        return nil, err
20    }
21    return db, nil
22}

6. Membuat Model User

Buat direktori models dan file models/user.go:

go
1package models
2
3type User struct {
4    ID    int    `json:"id"`
5    Name  string `json:"name"`
6    Email string `json:"email"`
7}

7. Membuat Repository User

Buat direktori repositories dan file repositories/userRepository.go:

go
 1package repositories
 2
 3import (
 4    "database/sql"
 5    "user_service/models"
 6)
 7
 8type UserRepository struct {
 9    DB *sql.DB
10}
11
12func NewUserRepository(db *sql.DB) *UserRepository {
13    return &UserRepository{DB: db}
14}
15
16func (r *UserRepository) CreateUser(user models.User) error {
17    _, err := r.DB.Exec("INSERT INTO users (name, email) VALUES (?, ?)", user.Name, user.Email)
18    return err
19}
20
21func (r *UserRepository) GetAllUsers() ([]models.User, error) {
22    rows, err := r.DB.Query("SELECT id, name, email FROM users")
23    if err != nil {
24        return nil, err
25    }
26    defer rows.Close()
27
28    users := []models.User{}
29    for rows.Next() {
30        var user models.User
31        err := rows.Scan(&user.ID, &user.Name, &user.Email)
32        if err != nil {
33            return nil, err
34        }
35        users = append(users, user)
36    }
37    return users, nil
38}

8. Membuat Service User

Buat direktori services dan file services/userService.go:

go
 1package services
 2
 3import (
 4    "user_service/models"
 5    "user_service/repositories"
 6)
 7
 8type UserService struct {
 9    Repo *repositories.UserRepository
10}
11
12func NewUserService(repo *repositories.UserRepository) *UserService {
13    return &UserService{Repo: repo}
14}
15
16func (s *UserService) CreateUser(user models.User) error {
17    return s.Repo.CreateUser(user)
18}
19
20func (s *UserService) GetAllUsers() ([]models.User, error) {
21    return s.Repo.GetAllUsers()
22}

9. Membuat Controller User

Buat direktori controllers dan file controllers/userController.go:

go
 1package controllers
 2
 3import (
 4    "database/sql"
 5    "encoding/json"
 6    "net/http"
 7    "user_service/models"
 8    "user_service/repositories"
 9    "user_service/services"
10
11    "github.com/gorilla/mux"
12)
13
14func RegisterUserRoutes(router *mux.Router, db *sql.DB) {
15    userRepo := repositories.NewUserRepository(db)
16    userService := services.NewUserService(userRepo)
17
18    router.HandleFunc("/users", createUser(userService)).Methods("POST")
19    router.HandleFunc("/users", getAllUsers(userService)).Methods("GET")
20}
21
22func createUser(userService *services.UserService) http.HandlerFunc {
23    return func(w http.ResponseWriter, r *http.Request) {
24        var user models.User
25        json.NewDecoder(r.Body).Decode(&user)
26
27        err := userService.CreateUser(user)
28        if err != nil {
29            http.Error(w, err.Error(), http.StatusInternalServerError)
30            return
31        }
32        w.WriteHeader(http.StatusCreated)
33        json.NewEncoder(w).Encode(user)
34    }
35}
36
37func getAllUsers(userService *services.UserService) http.HandlerFunc {
38    return func(w http.ResponseWriter, r *http.Request) {
39        users, err := userService.GetAllUsers()
40        if err != nil {
41            http.Error(w, err.Error(), http.StatusInternalServerError)
42            return
43        }
44        json.NewEncoder(w).Encode(users)
45    }
46}

10. Membuat OrderService

Ulangi langkah-langkah di atas untuk membuat order_service. Struktur dan kode untuk order_service akan serupa dengan user_service, dengan perbedaan utama pada model dan operasi bisnis yang berbeda.

11. Komunikasi Antar Layanan

Untuk komunikasi antar layanan, kita akan menggunakan HTTP. Misalnya, OrderService dapat berkomunikasi dengan UserService untuk mendapatkan informasi pengguna.

12. Contoh Komunikasi Antar Layanan

Dalam OrderService, buat fungsi untuk mendapatkan pengguna dari UserService:

go
 1package services
 2
 3import (
 4    "encoding/json"
 5    "fmt"
 6    "net/http"
 7    "order_service/models"
 8)
 9
10func GetUser(userID int) (models.User, error) {
11    url := fmt.Sprintf("http://localhost:8000/users/%d", userID)
12    resp, err := http.Get(url)
13    if err != nil {
14        return models.User{}, err
15    }
16    defer resp.Body.Close()
17
18    var user models.User
19    if err := json.NewDecoder(resp.Body).Decode(&user); err != nil {
20        return models.User{}, err
21    }
22    return user, nil
23}

Kesimpulan**

Dalam artikel ini, kita telah membahas dasar-dasar pembangunan aplikasi microservices dengan Golang, mencakup persiapan lingkungan, konfigurasi database, dan komunikasi antar layanan. Dengan mengikuti langkah-langkah ini, Anda dapat membangun aplikasi yang scalable dan maintainable menggunakan arsitektur microservices. Untuk informasi lebih lanjut dan praktik terbaik dalam membangun API yang bersih dan efisien, Anda dapat merujuk ke tutorial Golang RESTful API dan Clean Architecture . Semoga artikel ini membantu Anda dalam memulai pengembangan aplikasi microservices

dengan Golang. Selamat mencoba dan selamat berkoding!

IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar