Pengenalan Microservices
Pengenalan Microservices
Pendahuluan
Bidang teknologi informasi beberapa tahun terakhir mengalami perkembangan yang
sangat cepat. Begitu pula dengan arsitektur pengembangan aplikasi. Secara tradisional,
aplikasi dibangun dengan menggunakan pendekatan monolith, yang berarti semua sistem
berada dalam suatu kesatuan. Dalam aplikasi monolith semua fitur dan service dibungkus
dalam satu aplikasi mulai dari sisi database, server-side maupun client-side.
Pendekatan monolith memang mudah untuk dibuat dan dikembangkan terutama
untuk skala yang relatif kecil. Akan tetapi jika sudah memasuki skala yang luas dan
kompleks maka terdapat beberapa kelemahan, diantaranya:
● Jika aplikasi terlalu besar dan kompleks maka akan sulit pada saat maintenance
● Ukuran aplikasi yang besar akan memperlambat waktu startup
● Harus re-deploy keseluruhan aplikasi pada setiap update
● Adanya bug dalam modul apapun dapat berpotensi menurunkan proses kinerja
aplikasi
● Sulit untuk mengadopsi teknologi baru karena perubahan dalam bahasa dan
framework dapat mempengaruhi seluruh aplikasi.
Untuk mengatasi permasalahan tersebut lahirlah teknologi baru pengembangan
aplikasi yang dinamakan microservices. Dalam pendekatan microservice, aplikasi
dibagi-bagi menjadi service-service yang kecil, dimana setiap service berjalan pada
prosesnya masing-masing. Kumpulan service-service ini bila saling berkomunikasi dapat
menjadi sebuah sistem yang besar. Dalam implementasinya, secara sederhana kita harus
memecah aplikasi yang ingin kita buat secara spesifik dari sisi fungsionalitasnya. Setiap
service dapat bekerja secara independen dan fungsionalitas dari service-service tersebut
dapat dibangun menggunakan teknologi yang berbeda-beda sesuai dengan kebutuhan.
Sehingga hal ini sangat memungkinkan terdapat banyak teknologi dalam satu kesatuan
aplikasi yang besar.
Gambar 1.0 menunjukkan bahwa pada arsitektur monolith semua fungsionalitas aplikasi
berupa User Interface(UI), business logic dan data access layer tergabung menjadi suatu
kesatuan serta menggunakan satu buah database. Sementara itu pada arsitektur
microservice setiap fungsionalitas aplikasi dibuat masing-masing servicenya. Setiap
service-service kecil tersebut dapat berdiri secara independen serta dapat berkomunikasi
dengan service-service lainnya. Database pada setiap service juga dapat berdiri sendiri
ataupun dalam beberapa service menggunakan satu database yang sama.
Secara umum perbedaan antara arsitektur monolith dan microservice adalah sebagai
berikut:
No Monolith Microservice
1. Aplikasi terdiri dari satu kesatuan besar Aplikasi dibagi-bagi menjadi bagian-bagian
kecil berdasarkan fungsionalitasnya
2. Proses maintenance lebih susah ketika Maintenance lebih mudah dan fleksibel
code base aplikasi sudah besar
6. Jika terdapat problem dalam suatu fitur Jika ada problem dalam suatu service
maka dapat mempengaruhi hanya service tersebut yang terganggu,
keseluruhan aplikasi service lain tetap bisa menangani request
7. Waktu update aplikasi membutuhkan Waktu update aplikasi lebih cepat karena
waktu lebih lama karena harus perubahan pada fungsi tertentu tidak
memastikan semua fungsi berjalan berpengaruh pada fungsi lainnya
dengan baik
Implementasi Microservice
Pada contoh implementasi microservice ini kita menggunakan framework Java
Spring Boot dan Netflix OSS sebagai penyedia layanan microservice. Dalam setiap
microservice dibutuhkan dua buah service utama yang dibutuhkan, yaitu registry service dan
gateway service. Sementara untuk service lainnya adalah service REST API biasa yang
menggunakan database postgresql, yaitu book service dan penulis service.
Tree Project:
registry-service
├── Dockerfile (Optional)
├── mvnw
├── mvnw.cmd
├── pom.xml
├── registry-service.sh (Optional)
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── emerio
│ │ └── registryservice
│ │ └── RegistryServiceApplication.java
│ └── resources
│ ├── application-local.properties (Manual Added)
│ └── application.properties
│
└── test
└── java
└── com
└── emerio
└── registryservice
└── RegistryServiceApplicationTests.java
b. Keterangan
Pada registry service hanya terdapat satu kelas utama, yaitu
RegistryServiceApplication.java. Pada kelas tersebut harus ditambahkan anotasi
@EnableEurekaServer untuk menandakan bahwa service tersebut bertindak sebagai
Eureka Server yang berfungsi sebagai tempat mendaftarkan service-service yang
lain. Seluruh pengaturan/konfigurasi service disetting di application.properties. Kita
bisa membuat beberapa profil di properties yang nantinya bisa dipilih pada saat
menjalankan aplikasi.
Pada application.properties terdapat beberapa konfigurasi, meliputi
application name, port aplikasi serta setting lainnya. Berikut contoh tampilan
application.properties pada registry service. Baris dengan tanda # berfungsi sebagai
keterangan dan tidak akan dicompile.
spring.application.name=registry-service
#port-aplikasi
server.port=4321
#agar tidak mendaftarkan dirinya pada eureka server
eureka.client.register-with-eureka=false
#agar tidak mencari service, biasanya di "true" di service agar bisa
berkomunikasi dengan service lain
eureka.client.fetch-registry=false
#untuk menonaktifkan pencetakan log
logging.level.com.netflix.eureka=OFF
logging.level.com.netflix.discovery=OFF
2. Book Service
Book service adalah service REST API biasa yang menggunakan postgresql sebagai
database. Service ini berfungsi untuk menyimpan dan mengolah data-data buku serta
menerapkan fungsi CRUD (Create, Read, Update, dan Delete).
Tree Project:
book-service
├── book-service.sh (Optional)
├── Dockerfile (Optional)
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── rnd
│ │ └── project1
│ │ └── bookservice
│ │ ├── controller
│ │ │ └── BookResource.java
│ │ ├── BookServiceApplication.java
│ │ ├── entity
│ │ │ └── Book.java
│ │ ├── repo
│ │ │ └── BookRepository.java
│ │ └── service
│ │ └── BookRowMapper.java
│ └── resources
│ ├── application-local.properties (Manual Added)
│ ├── application.properties
│ └── schema-postgresql.sql (Manual Added)
└── test
└── java
└── com
└── rnd
└── project1
└── bookservice
└── BookServiceApplicationTests.java
b. Keterangan
- Pada kelas utama perlu ditambahkan anotasi @EnableDiscoveryClient untuk
menandakan bahwa service tersebut mendaftarkan dirinya ke registry service
(Eureka Server).
- Kelas entity (Book.java) merupakan kelas yang berisi atribut buku meliputi id buku,
judul, kategori, jumlah halaman, penulis, tanggal terbit, penerbit, dan sinopsis
buku. Pada kelas ini ditambahkan anotasi @Component.
- Kelas service (BookRowMapper.java) berisi mapping result set dari query data di
database.
- Kelas repository(Book Repository.java) merupakan kelas yang berisi query-query
yang berhubungan dengan database. Pada kelas ini menggunakan anotasi
@Repository, yang menunjukkan kelas tersebut bertindak sebagai repository
database.
- Kelas controller (BookResource.java) merupakan kelas yang berfungsi untuk
menerima dan mengembalikan http request. Pada kelas ini menggunakan anotasi
@RestController.
- Semua konfigurasi dimasukkan di application.properties, meliputi nama service,
port, alamat registry service, konfigurasi database dll.
- Contoh tampilan application.properties pada book service
spring.application.name=book-service
server.port=1313
eureka.client.serviceUrl.defaultZone=http://registry-service:4321/eureka/
eureka.instance.preferIpAddress=true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.instance.leaseExpirationDurationInSeconds=2
eureka.instance.leaseRenewalIntervalInSeconds=1
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:/schema-postgresql.sql
spring.datasource.url=jdbc:postgresql://${pg_host:localhost}:${pg_port:5432}/b
ook_db
spring.datasource.username=${pg_username:postgres}
spring.datasource.password=${pg_password:emerio@123}
- Skema pembuatan database dan table dimasukkan ke dalam
schema-postgresql.sql, berikut tampilannya:
schema-postgresql.sql
DROP TABLE IF EXISTS book;
CREATE TABLE book (
id Bigserial PRIMARY KEY NOT NULL,
judul varchar(100),
kategori varchar(100),
jumlah_halaman INTEGER,
penulis varchar(100),
tanggal_terbit varchar(100),
penerbit varchar(100)
);
Database yang kita buat yaitu book_db dengan tabel book, berisi data id buku,
judul, kategori, jumlah halaman dan penulis.
3. Penulis Service
Penulis service adalah service REST API biasa yang menggunakan postgresql
sebagai database. Service ini berfungsi untuk menyimpan data-data penulis buku serta
menerapkan fungsi CRUD (Create, Read, Update, dan Delete).
Tree Project:
penulis-service
├── penulis-service.sh (Optional)
├── Dockerfile (Optional)
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── emerio
│ │ └── penulisservice
│ │ ├── controller
│ │ │ └── PenulisController.java
│ │ ├── PenulisServiceApplication.java
│ │ ├── entity
│ │ │ └── Penulis.java
│ │ ├── repo
│ │ │ └── PenulisRepojava
│ │ └── service
│ │ └── PenulisRowMapper.java
│ └── resources
│ ├── application-local.properties (Manual Added)
│ ├── application.properties
│ └── schema-postgresql.sql (Manual Added)
└── test
└── java
└── com
└── emerio
└── penuliservice
└── PenulisServiceApplicationTests.java
b. Keterangan
- Pada kelas utama perlu ditambahkan anotasi @EnableDiscoveryClient untuk
menandakan bahwa service tersebut mendaftarkan dirinya ke registry service
(Eureka Server).
- Kelas entity (Penulis.java) merupakan kelas yang berisi atribut penulis buku
meliputi id penulis, nama, jenis kelamin, alamat, no.telp dan email. Pada kelas ini
ditambahkan anotasi @Component.
- Kelas service (PenulisRowMapper.java) berisi mapping result set dari query data
di database.
- Kelas repository (PenulisRepository.java) merupakan kelas yang berisi
query-query yang berhubungan dengan database. Pada kelas ini menggunakan
anotasi @Repository, yang menunjukkan kelas tersebut bertindak sebagai
repository database.
- Kelas controller (PenulisController.java) merupakan kelas yang berfungsi untuk
menerima dan mengembalikan http request. Pada kelas ini menggunakan anotasi
@RestController.
- Semua konfigurasi dimasukkan di application.properties, meliputi nama service,
port, alamat registry service, konfigurasi database dll.
- Contoh tampilan application.properties pada penulis service dengan profil default:
spring.application.name=penulis-service
server.port=1212
eureka.client.serviceUrl.defaultZone=http://registry-service:4321/eureka/
eureka.instance.preferIpAddress=true
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
eureka.instance.leaseExpirationDurationInSeconds=2
eureka.instance.leaseRenewalIntervalInSeconds=1
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:/schema-postgresql.sql
spring.datasource.url=jdbc:postgresql://${pg_host:localhost}:${pg_port:5432}/b
ook_db
spring.datasource.username=${pg_username:postgres}
spring.datasource.password=${pg_password:emerio@123}
- Penulis service ini menggunakan database yang sama dengan book service, yaitu
book_db tetapi menggunakan tabel berbeda yang diberi nama penulis. Berikut
tampilan pada file schema-postgresql.sql:
DROP TABLE IF EXISTS penulis;
CREATE TABLE penulis (
id Bigserial PRIMARY KEY NOT NULL,
nama varchar(100),
jenis_kelamin varchar(100),
alamat varchar(100),
no_telp varchar(100),
email varchar(100)
);
4. Gateway Service
Gateway Service merupakan satu-satunya service yang diketahui oleh frontend.
Service ini menjadi jembatan antara frontend dengan API service, sehingga ketika frontend
membutuhkan service tertentu maka hanya perlu mengakses ke gateway service dan
selanjutnya gateway service akan mengarahkan ke service yang tepat. Untuk membuat
gateway service kita perlu menambahkan dependency spring-cloud-starter-zuul di pom.xml
dan menambahkan anotasi @EnableZuulProxy di main class.
Tree Project:
gateway-service/
├── Dockerfile (Optional)
├── gateway-service.sh (Optional)
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── emerio
│ │ └── gatewayservice
│ │ └── GatewayServiceApplication.java
│ └── resources
│ ├── application-local.properties (Manual Added)
│ └── application.properties
│
└── test
└── java
└── com
└── emerio
└── gatewayservice
└── GatewayServiceApplicationTests.java
b. Keterangan
- Pada gateway service hanya terdapat satu kelas utama, yaitu
GatewayServiceApplication.java. Pada kelas tersebut harus ditambahkan
anotasi @EnableDiscoveryClient untuk menandakan bahwa service tersebut
mendaftarkan dirinya ke registry service (Eureka Server) dan anotasi
@EnableZuulProxy untuk menandakan bahwa service tersebut berfungsi
sebagai gateway service.
- Seluruh pengaturan/konfigurasi service disetting di application.properties. Kita
bisa membuat beberapa profil di properties yang nantinya bisa dipilih pada saat
menjalankan aplikasi.
- Pada application.properties terdapat beberapa konfigurasi, meliputi application
name, port aplikasi serta setting lainnya. Berikut contoh tampilan
application.properties pada registry service. Baris dengan tanda # berfungsi
sebagai keterangan dan tidak akan dicompile.
- Contoh tampilan application.properties pada penulis service dengan profil
default:
spring.application.name=gateway-service
server.port=2121
# Zuul
# end point gateway menuju service
zuul.prefix=/api
# mengatur waktu socket timeout (mili detik)
zuul.host.socket-timeout-millis=60000
# mengatur waktu connetion timeout (mili detik)
zuul.host.connect-timeout-millis=10000
# Book
# path untuk endpoint book service
zuul.routes.book.path=/books/**
# nama atau id book service di eureka
zuul.routes.book.serviceId=book-service
# menonaktifkan strip prefix
zuul.routes.book.stripPrefix=false
# Penulis
# path untuk endpoint penulis service
zuul.routes.penulis.path=/writers/**
# nama atau id penulis service di eureka
zuul.routes.penulis.serviceId=penulis-service
# menonaktifkan strip prefix
zuul.routes.penulis.stripPrefix=false
# Eureka
# alamat eureka server, digunakan untuk mendaftarkan dirinya
eureka.client.serviceUrl.defaultZone=http://registry-service:4321/eureka/
eureka.instance.preferIpAddress=true
# agar mendaftarkan dirinya ke eureka server
eureka.client.register-with-eureka=true
# agar bisa mencari service dan bisa berkomunikasi dengan service lain
eureka.client.fetch-registry=true
# mengatur waktu pengecekan service (up/down), ketika lebih dari yg
ditetapkan, service dinyatakan gagal mendaftarkan diri (default:90)
eureka.instance.leaseExpirationDurationInSeconds=2
# mengatur heartbeat agar service terdaftar dan tampil lebih cepat di eureka
server (default:30)
eureka.instance.leaseRenewalIntervalInSeconds=1
# Ribbon
# mengaktifkan ribbon load balancer
ribbon.eureka.enabled=true
# mengatur waktu connetion timeout
ribbon.ConnectionTimeout=3000
# mengatur waktu read timeout
ribbon.ReadTimeout=60000
2. Book Service
GET http://localhost:1313/books/{id} : mendapatkan data buku dengan id tertentu
GET http://localhost:1313/books : mendapatkan semua data buku yang tersimpan
POST http://localhost:1313/books : menambahkan data buku ke database
PUT http://localhost:1313/books/{id} : mengupdate data buku dengan id tertentu
DELETE http://localhost:1313/books/{id} : menghapus data buku dengan id tertentu
3. Penulis Service
GET http://localhost:1212/writers/{id}: mendapatkan data penulis dengan id tertentu
GET http://localhost:1212/writers : mendapatkan semua data penulis tersimpan
POST http://localhost:1212/writers : menambahkan data penulis ke database
PUT http://localhost:1212/writers/{id} : mengupdate data penulis dengan id tertentu
DELETE http://localhost:1212/writers/{id} : menghapus data penulis dengan id tertentu
4. Gateway Service
Semua endpoint book service dan penulis service dapat dipanggil menggunakan
gateway service dengan satu port yang sama dengan prefix endpoint “/api”. Endpoint
pada gateway service inilah yang selanjutnya dapat diakses oleh frontend.
GET http://localhost:2121/api/books
GET http://localhost:2121/api/writers