0% menganggap dokumen ini bermanfaat (0 suara)
86 tayangan12 halaman

Pengenalan Microservices

Dokumen tersebut membahas tentang pengenalan microservices. Microservices merupakan salah satu arsitektur pengembangan aplikasi yang memisahkan aplikasi menjadi beberapa servis kecil yang independen dan berkomunikasi. Pendekatan ini memiliki beberapa keuntungan seperti fleksibilitas, skalabilitas, dan mudah dipertahankan dibandingkan pendekatan monolithik. Dokumen tersebut juga menjelaskan konsep dasar dan ilustrasi perbedaan antara microservices dan

Diunggah oleh

Ardi
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
86 tayangan12 halaman

Pengenalan Microservices

Dokumen tersebut membahas tentang pengenalan microservices. Microservices merupakan salah satu arsitektur pengembangan aplikasi yang memisahkan aplikasi menjadi beberapa servis kecil yang independen dan berkomunikasi. Pendekatan ini memiliki beberapa keuntungan seperti fleksibilitas, skalabilitas, dan mudah dipertahankan dibandingkan pendekatan monolithik. Dokumen tersebut juga menjelaskan konsep dasar dan ilustrasi perbedaan antara microservices dan

Diunggah oleh

Ardi
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 12

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.

Konsep Dasar Microservice


Pada dasarnya microservice merupakan salah satu bentuk arsitektur pengembangan
aplikasi yang tersusun atas kumpulan service-service kecil yang independen dan dapat
berkomunikasi antara satu dengan yang lainnya untuk membentuk suatu kesatuan aplikasi.
Setiap service tersusun atas blok-blok kecil, terpisah dan fokus pada tugas-tugas dan fungsi
tertentu dalam pembangunan sistem aplikasi.
Pada arsitektur microservice, memungkinkan setiap service dengan fungsionalitas
tertentu dapat dibangun menggunakan teknologi yang berbeda-beda baik dari segi bahasa
maupun framework yang digunakan. Hal ini tentunya menjadikan pengembangan aplikasi
sangat fleksibel dan dapat mengaplikasikan teknologi sesuai dengan kebutuhan. Sangat
berbeda bila dibandingkan dengan arsitektur monolith, di mana kita sulit menerapkan
teknologi baru pada aplikasi yang sudah dibangun. Ini dikarenakan arsitektur monolith terdiri
dari suatu kesatuan sehingga untuk menyesuaikan dengan teknologi baru harus merombak
keseluruhan aplikasi secara besar-besaran. Sekarang ini banyak developer yang menyadari
hal tersebut, sehingga banyak yang beralih ke arsitektur microservice untuk proses
pengambangan aplikasinya.
Berikut ini adalah gambaran ilustrasi perbedaan antara arsitektur monolith dan
microservice:

Gambar 1.0 Perbedaan arsitektur monolith dan microservice

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

3. Hanya menggunakan satu bahasa Setiap service dapat dibangun


pemrograman menggunakan bahasa dan framework
yang berbeda

4. Proses pengembangan aplikasi lebih Proses pengembangan aplikasi lebih


susah karena harus merombak fleksibel, misal hanya perlu
keseluruhan code mengembangkan satu service saja

5. Sulit untuk kolaborasi tim development Memudahkan kolaborasi tim development,


karena aplikasi terdiri dari satu setiap service bisa dikerjakan oleh tim
kesatuan code development yang berbeda

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.

1. Registry Service(Eureka Server)


Registry Service adalah tempat mendaftarkan seluruh service pada microservice.
Tujuannya agar memudahkan ketika ingin memanggil service tertentu, kita hanya butuh
mencarinya melalui registry service. Registry Service menggunakan dependency
spring-cloud-starter-eureka-server di pom.xml dan menggunakan anotasi
@EnableEurekaServer pada main class. Sementara itu untuk service yang lainnya
menggunakan anotasi @EnableDiscoveryClient pada main class dan dependency
spring-cloud-starter-eureka di pom.xml untuk terhubung ke Eureka server.

a. Buatlah project dengan struktur seperti dibawah ini:


https://start.spring.io/
group : com.emerio
artifact : registry-service
dependency : Web, Eureka Server

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).

a. Buatlah projek dengan struktur seperti di bawah ini


https://start.spring.io/
group : com.rnd.project1
artifact : book-service
dependency : Web, Eureka Discovery Client, spring-boot-starter-jdbc, postgresql

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).

a. Buatlah projek dengan struktur seperti di bawah ini


https://start.spring.io/
group : com.emerio
artifact : penulis-service
dependency : Web, Eureka Discovery Client, spring-boot-starter-jdbc, postgresql

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.

a. Buatlah projek dengan struktur seperti di bawah ini


https://start.spring.io/
group : com.emerio
artifact : gateway-service
dependency : Web, Eureka Discovery Client, Ribbon, Zuul

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

Cara menjalankan microservice (contoh untuk profil local di application.properties)


1. Jalankan registry-service
mvn clean install spring-boot:run -D spring-boot.run.profiles=local -D maven.test.skip=true
2. Jalankan book-service
Sebelum dijalankan pastikan bahwa database postgresql di local laptop ataupun docker
sudah dinyalakan terlebih dahulu
mvn clean install spring-boot:run -D spring-boot.run.profiles=local -D maven.test.skip=true
3. Jalankan penulis-service
mvn clean install spring-boot:run -D spring-boot.run.profiles=local -D maven.test.skip=true
4. Jalankan gateway-service
mvn clean install spring-boot:run -D spring-boot.run.profiles=local -D maven.test.skip=true

Endpoint untuk masing-masing service


1. Registry Service
GET http://localhost:4321/eureka/​ : melihat service yang terdaftar di Eureka Server

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

Anda mungkin juga menyukai