Apa itu microservice dan apa perbedaannya dengan monolitik ?
Monolitik: Bayangkan sebuah restoran di mana hanya ada satu chef yang memasak semua jenis makanan: makanan pembuka, hidangan utama, dessert, minuman, dll.
Chef ini harus menguasai semua resep dan teknik memasak, dan jika dia sedang sibuk dengan satu tugas, tugas lainnya mungkin terlambat. Jika chef ini sakit, seluruh restoran tidak bisa beroperasi.
Microservices: Sekarang bayangkan restoran yang memiliki beberapa chef spesialis.
Ada chef khusus untuk makanan pembuka, chef lain untuk hidangan utama, chef lain untuk dessert, dan barista untuk minuman. Setiap chef hanya fokus pada tugasnya dan tidak terganggu dengan pekerjaan lain. Jika chef dessert sedang sakit, hidangan utama dan makanan pembuka masih bisa disajikan tanpa gangguan.
Dalam konteks software development
Monolitik: Semua fitur dan fungsionalitas aplikasi ada dalam satu kode besar. Jika ada masalah dengan satu fitur, seluruh aplikasi bisa terpengaruh. Mengupdate satu bagian mungkin memerlukan pengujian ulang dari seluruh aplikasi.
Microservices: Setiap fitur atau fungsionalitas aplikasi adalah layanan independen. Layanan ini berkomunikasi satu sama lain tetapi beroperasi secara independen. Jika ada masalah dengan satu layanan, layanan lainnya tetap berfungsi. kita bisa mengupdate satu layanan tanpa mengganggu yang lain.
Dengan analogi restoran ini, kita bisa melihat bagaimana microservices memungkinkan spesialisasi, fleksibilitas, dan ketahanan dalam operasi. Setiap "chef" atau service yang memiliki tanggung jawab yang jelas dan dapat bekerja dengan efisien dalam kapasitasnya.
Buat models di apps
from django.contrib.auth.models import User
class MovieData(models.Model):
name = models.CharField(max_length=200)
duration = models.FloatField()
rating = models.FloatField()
typ = models.CharField(max_length=200, default='action')
image = models.ImageField(upload_to='Image/', default='Images/None/Noimg.jpg')
def __str__(self):
return self.name
class Review(models.Model):
movie = models.ForeignKey(MovieData, on_delete=models.CASCADE, related_name='reviews')
user = models.ForeignKey(User, on_delete=models.CASCADE)
comment = models.TextField()
rating = models.FloatField()
def __str__(self):
return f"Review for {self.movie.name} by {self.user.username}"
Buat file serializers.py
from rest_framework import serializers
from .models import MovieData, Review
class MovieSerializer(serializers.ModelSerializer):
image = serializers.ImageField(max_length=None, use_url=True)
class Meta:
model = Moviedata
fields = ['id', 'name', 'duration', 'rating', 'typ', 'image']
class ReviewSerializer(serializers.ModelSerializer):
class Meta:
model = Review
fields = ['id', 'movie', 'user', 'comment', 'rating']
Lalu buat views.py
Di urls.py projectimport requests
from rest_framework import viewsets
from rest_framework.response import Response
from .models import Review
from .serializers import ReviewSerializer
class ReviewViewSet(viewsets.ModelViewSet):
queryset = Review.objects.all()
serializer_class = ReviewSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
movie_data = self.get_movie_data(instance.movie_id)
response_data = {
'movie': movie_data,
'review': ReviewSerializer(instance).data
}
return Response(response_data)
def get_movie_data(self, movie_id):
access_token = self.get_access_token()
headers = {
'Authorization': f'Bearer {access_token}'
}
movie_data = requests.get(f'http://localhost:8000/film/movies/{movie_id}/', headers=headers).json()
return movie_data
def get_access_token(self):
token_url = "http://localhost:8000/o/token/"
data = {
'grant_type': 'client_credentials',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET',
'scope': 'read'
}
response = requests.post(token_url, data=data)
return response.json().get('access_token')
urls.py project
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('film/', include('film.urls')),
]
urls.py apps
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MovieViewSet, ReviewViewSet
router = DefaultRouter()
router.register(r'movies', MovieViewSet)
router.register(r'reviews', ReviewViewSet)
urlpatterns = [
path('', include(router.urls)),
]
Untuk mengimplementasikan OAuth2 dengan Django, kita perlu menggunakan paket django-oauth-toolkit.
Berikut adalah langkah-langkah untuk menginstal dan mengkonfigurasi OAuth2 dengan Django:
1. Instalasi django-oauth-toolkit:
pip install django-oauth-toolkit
2. Tambahkan oauth2_provider ke INSTALLED_APPS di settings.py:
INSTALLED_APPS = [
...
'oauth2_provider',
]
3. Tambahkan oauth2_provider ke MIDDLEWARE:
MIDDLEWARE = [
...
'oauth2_provider.middleware.OAuth2TokenMiddleware',
]
4. Jalankan Migrasi:
python manage.py migrate oauth2_provider
Setelah menjalankan migrasi, kita akan memiliki tabel-tabel yang diperlukan untuk menyimpan aplikasi OAuth2, token, dan lain-lain.
5. Buat Aplikasi OAuth2:
Buka panel admin Django (http://localhost:8000/admin/).
Pergi ke bagian OAUTH2_PROVIDER dan klik Applications.
Klik Add Application.
Isi detail aplikasi:
User: Pilih user yang akan menjadi pemilik aplikasi ini (biasanya admin atau user sistem).
Redirect uris: Kosongkan saja untuk alur "client credentials".
Client Type: Pilih Confidential. Ini berarti aplikasi kita memerlukan client_secret untuk mendapatkan token.
Authorization Grant Type: Pilih Client credentials. Alur ini digunakan untuk server-to-server authentication tanpa intervensi user.
Name: Beri nama untuk aplikasi kita, misalnya "Review Service".
Setelah kita menyimpan, kita akan melihat Client id dan Client secret yang telah dibuat untuk aplikasi kita. Catat keduanya.
6. Gunakan Client id dan Client secret:
Gantikan 'YOUR_CLIENT_ID' dan 'YOUR_CLIENT_SECRET' di kode kita dengan nilai yang kita dapatkan dari langkah di atas.
7. Konfigurasi OAuth2:
kita dapat menyesuaikan perilaku OAuth2 dengan menambahkan konfigurasi khusus di settings.py.
Misalnya, kita dapat mengatur masa berlaku token, jenis-jenis grant yang diizinkan, dll.
8. Proteksi API kita:
Untuk memastikan bahwa hanya aplikasi yang terotentikasi yang dapat mengakses API kita, tambahkan decorator @protected_resource() ke view yang ingin kita lindungi.
Dengan langkah-langkah di atas, kita sekarang memiliki sistem otentikasi OAuth2 yang berfungsi dengan Django.
Aplikasi kita sekarang dapat meminta token dengan menggunakan client_id dan client_secret dan menggunakan token tersebut untuk mengakses API yang dilindungi.
Setiap aplikasi OAuth2 yang kita buat di panel admin Django akan memiliki client_id dan client_secret yang unik.
Ini memungkinkan kita untuk mengatur hak akses dan batasan yang berbeda untuk setiap aplikasi.