Project ini didasarkan pada penerapan/implementasi design CQRS (Command Query Responsibility Segregation). Dalam beberapa sumber dijelaskan bahwa cqrs adalah penerapan even sourcing yang membagi tanggung jawab antara (minimal 2 service) proses write & read. Dalam hal ini proses write biasa disebut dengan command, sementara proses read disebut dengan query. Anda bisa mencari tau lebih banyak dan detail terkait pro cons design ini diinternet. Pada project ini tidak dijelaskan lebih detail tentang apa itu CQRS.
Pada project ini sinkronisasi data antar service di distribusikan menggunakan message broker menggunakan N.A.T.S. Berikut ini tech stack yang digunakan dalam project:
- Microservices dikemas kedalam konsep MonoRepo
- Event Driven dengan message broker
- Golang (Programming Language)
- Service Command :
- Fiber (Http Framework)
- Mysql (Database)
- N.A.T.S (Message Broker)
- GORM (Sql ORM)
- Database Migration Script
- Etc...
- Service Query :
- Fiber (Http Framework)
- TypeSense (Search Engine)
- N.A.T.S (Message Broker)
- Etc...
Demo applikasi Command dan Query. Skenario :
- Command Service : Create Article (Via Postman)
- Query Service : Consume message from (subject) article created, lalu lakukan insert data ke TypeSense.
- Monitoring Dashboard TypeSense (https://bfritscher.github.io/typesense-dashboard/)
- Query Service : Get Article By ID (Via Postman)
- Query Service : Search Article (Filter author & query:title & body) (Via Postman)
Screencast.from.21-08-23.01.00.41.webm
Work directory : deployment
- Masuk ke lokasi docker file
cd deployment
- build docker images : Mysql
sudo docker-compose -f 'docker-compose.mysql.yaml' up
- build docker images : NATS
sudo docker-compose -f 'docker-compose.nats.yaml' up
- build docker images : TypeSense
mkdir typesense-data
sudo docker-compose -f 'docker-compose.typesense.yaml' up
- Konfigurasi TypeSense Setelah proses installasi typesense pada docker berhasil, lakukan langkah pembuatan collection. Anda dapat melakukan ini dengan mudah melalui link https://bfritscher.github.io/typesense-dashboard/#/ Login dengan API KEY yang tertera di configurasi .env file.
Buat collection dengan schema :
{
"name": "articles",
"fields": [
{
"name": "author",
"type": "string",
"facet": false,
"optional": false,
"index": true,
"sort": false,
"infix": false,
"locale": ""
},
{
"name": "title",
"type": "string",
"facet": false,
"optional": false,
"index": true,
"sort": false,
"infix": false,
"locale": ""
},
{
"name": "body",
"type": "string",
"facet": false,
"optional": false,
"index": true,
"sort": false,
"infix": false,
"locale": ""
},
{
"name": "created",
"type": "int64",
"facet": false,
"optional": false,
"index": true,
"sort": true,
"infix": false,
"locale": ""
}
],
"default_sorting_field": "",
"enable_nested_fields": false,
"symbols_to_index": [],
"token_separators": []
}
Work directory : /command
- Masuk ke folder command
cd command
- Execute script migration untuk pembuatan table article
go run main.go migrateup
- Jalankan Applikasi Command Service
go run main.go command
- Output : Akan tampil display seperti ini pada terminal.
┌───────────────────────────────────────────────────┐
│ GCNT-COMMAND-SERVICE │
│ Fiber v2.48.0 │
│ http://127.0.0.1:1111 │
│ (bound on host 0.0.0.0 and port 1111) │
│ │
│ Handlers ............. 5 Processes ........... 1 │
│ Prefork ....... Disabled PID ............. 28610 │
└───────────────────────────────────────────────────┘
Work directory : /query
- Masuk ke folder query
cd query
- Jalankan Applikasi Command Service
go run main.go query
- Output : Akan tampil display seperti ini pada terminal.
┌───────────────────────────────────────────────────┐
│ GCNT-QUERY-SERVICE │
│ Fiber v2.48.0 │
│ http://127.0.0.1:2222 │
│ (bound on host 0.0.0.0 and port 2222) │
│ │
│ Handlers ............. 8 Processes ........... 1 │
│ Prefork ....... Disabled PID ............. 29127 │
└───────────────────────────────────────────────────┘
work directory : /doc
Lakukan import file json ke postman untuk melanjutkan pengujian http request.
Location :
/command/internal/handler
/query/internal/handler
Generate Mock :
cd command
make generate-mock
cd query
make generate-mock
Run UnitTest Cvg
cd command
make run-unittest-cvg
cd query
make run-unittest-cvg