, 9 min read
Kita akan belajar bagaimana membuat aplikasi microservices menggunakan Nest JS dan GRPC menggunakan Monorepo (Single Repository)
Microservices adalah suatu pendekatan dalam pengembangan perangkat lunak yang memecah aplikasi menjadi komponen-komponen yang lebih kecil, independen, dan terisolasi. Setiap komponen, yang disebut sebagai layanan mikro, beroperasi secara mandiri dan memiliki tanggung jawab terbatas dalam fungsionalitas aplikasi secara keseluruhan.
Arsitektur microservices sering kali digunakan dalam konteks pengembangan aplikasi skala besar yang kompleks dan membutuhkan fleksibilitas dan skalabilitas yang tinggi. Dengan memecah aplikasi menjadi layanan mikro yang lebih kecil, pengembang dapat mengelola kompleksitas dengan lebih baik, meningkatkan kemampuan untuk melakukan perubahan, dan mempercepat siklus pengembangan.
Pada gambar diatas adalah contoh arsitektur microservices dimana terdapat banyak service yang saling berkaitan namun masing - masing service berdiri sendiri.
Ada banyak cara supaya antar service bisa saling berkomunikasi contohnya adalah menggunakan:
Pada contoh kali ini kita akan menggunakan RPC sebagai metode komunikasi antar service.
Kita akan menggunakan GRPC (Google Remote Procedure Call) yang kembangkan oleh google.
gRPC adalah sebuah kerangka kerja (framework) open-source yang digunakan untuk membuat aplikasi terdistribusi berbasis layanan dengan menggunakan Remote Procedure Call (RPC). RPC adalah protokol yang memungkinkan komunikasi antara komponen aplikasi yang berjalan pada komputer yang berbeda melalui jaringan.
gRPC menggunakan protokol komunikasi HTTP/2 sebagai dasar untuk mentransfer data antara klien dan server. Ini berarti gRPC dapat mengambil keuntungan dari fitur-fitur canggih yang disediakan oleh HTTP/2 seperti multiplexing, kompresi header, dan streaming.
gRPC sering digunakan dalam pengembangan aplikasi yang memerlukan komunikasi antara komponen yang terdistribusi secara efisien dan handal. Misalnya, dalam sistem mikroservis, gRPC dapat digunakan untuk menghubungkan antara layanan mikro yang berbeda.
Kali ini kita akan membuat Project Nest JS menggunakan Monorepo artinya satu repo terdiri dari banyak service yang berdiri sendiri.
Jika belum memahami arsitektur Monorepo silahakan buka https://www.mistercoding.com/post/perbedaan-monorepo-dan-multi-repo
Pertama buka terminal dan jalankan perintah
nest new latihan-microservices-grpc
Setelah itu kita akan menjadikan aplikasi Nest menjadi Monorepo
Kurang lebih aplikasi kita akan seperti berikut ini:
Buat service app1, app2, app3
Masuk kedalam project "latihan-microservices-grpc"
cd latihan-microservices-grpc
Kemudian buat service app1, app2,app2 dengan menjalankan perintah:
nest g app app1
nest g app app2
nest g app app3
Maka struktur folder menjadi seperti
Jalankan perintah
yarn add @nestjs/microservices @grpc/grpc-js @grpc/proto-loader
proto/app1/app1.proto
syntax = "proto3"; package app1; service HeroesService { rpc FindOne (HeroById) returns (HeroApp) {} } message HeroById { int32 id = 1; } message HeroApp { string app = 1; Hero data = 2; } message Hero { int32 id = 1; string name = 2; }
edit apps/app1/main.ts menjadi
import { NestFactory } from '@nestjs/core'; import { App1Module } from './app1.module'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.createMicroservice<MicroserviceOptions>( App1Module, { transport: Transport.GRPC, options: { url:"0.0.0.0:50001", package: 'app1', protoPath: process.cwd() + '/proto/app1/app1.proto', }, }, ); app.listen(); } bootstrap();
edit apps/app1/src/app1.controller.ts
import { Controller, Get } from '@nestjs/common'; import { App1Service } from './app1.service'; import { GrpcMethod } from '@nestjs/microservices'; import { Metadata, ServerUnaryCall } from '@grpc/grpc-js'; @Controller() export class App1Controller { constructor(private readonly app1Service: App1Service) {} @Get() getHello(): string { return this.app1Service.getHello(); } @GrpcMethod('HeroesService', 'FindOne') async findOne( data: any, metadata: Metadata, call: ServerUnaryCall<any, any>, ) { const items = [ { id: 1, name: 'John' }, { id: 2, name: 'Doe' }, ]; return { app: 'app1', data: items.find(({ id }) => id === data.id), }; } }
Jalankan servie app1 menggunakan CLI
yarn start:dev app1
Buka dan edit file "apps/latihan-microservice-grpc/src/app.module.ts
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ClientsModule, Transport } from '@nestjs/microservices'; @Module({ imports: [ ClientsModule.register([ { name: 'APP1', transport: Transport.GRPC, options: { url:"0.0.0.0:50001", package: 'app1', protoPath: process.cwd() + '/proto/app1/app1.proto', }, }, ]), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
Edit app.controller
import { Controller, Get, Inject, OnModuleInit } from '@nestjs/common'; import { AppService } from './app.service'; import { Observable } from 'rxjs'; import { ClientGrpc } from '@nestjs/microservices'; interface HeroesService { findOne(data: { id: number }): Observable<any>; } @Controller() export class AppController implements OnModuleInit { private heroesService: HeroesService; constructor( @Inject('APP1') private client: ClientGrpc, private readonly appService: AppService, ) {} onModuleInit() { this.heroesService = this.client.getService<HeroesService>('HeroesService'); } @Get() getHello(): string { return this.appService.getHello(); } @Get('hero1') async getHero() { return await this.heroesService.findOne({ id: 1 }); } }
Selamat, kita sudah berhasil membuat Nest JS Microservices menggunakan GRPC.
Untuk App2, App3, cara nya sama seperti cara di atas.
Related Posts
Nest JS : Speed Up API with Cache Redis
Meningkatkan perfoma API dengan Cache menggunakan Redis dengan contoh menggunakan Database PostgreSQL dan Prisma
Nest JS Micoservices with GRPC and Monorepo
Kita akan belajar bagaimana membuat aplikasi microservices menggunakan Nest JS dan GRPC menggunakan Monorepo (Single Repository)
Rate limiting Nest JS
Rate limiter adalah sebuah mekanisme yang digunakan untuk mengatur laju atau frekuensi akses terhadap suatu sumber daya atau layanan. Tujuannya adalah untuk mencegah penyalahgunaan atau kelebihan beban terhadap sistem tersebut
Upload gambar pada Framwork Nest JS
Pada tutorial kali ini Kita akan belajar mengupload gambar pada Framwork Nest JS dan menseting supaya file bisa di akses menggunakan HTTP
NestJS Prisma Multi Connections
Prisma adalah Modern ORM yang memungkinakan kita membuat koneksi dan Query ke database menjadi lebih mudah dan lebih sederhana di bandingkan kalau kita tanpa menggunakan ORM.
Membuat Multi Thread atau Cluster mode pada nest JS (10x lebih cepat)
Node JS / Nest JS memiliki cara kerja Single Thread yang artinya hanya bisa menjalankan tugas satu persatu sehingga pada saat ada banyak tugas yang sedang di kerjakan harus bergantian beda dengan Multi Thread yang bisa menjalankan tugas secara bersamaan.
Membuat CRUD Rest API dengan Database MySQL Nest JS
Pada tutorial kali ini Kita akan belajar membuat CRUD Rest API dengan Database MySQL Nest JS supaya kita lebih memahami alur dari framework Nest JS
Konsep penting yang wajib di ketahui di dalam Framework NestJS
Pada tutorial kali ini Kita akan memahami Konsep penting yang wajib di ketahui di dalam Framework NestJS
Berkenalan dengan NestJS dan cara install NestJS
Pada tutorial kali ini kita akan berkenalan dengan NestJS, memahami cara kerja NestJS dan cara menginstall NestJS
Tags