Laravel Mikroservis Mimarisi

L

Mikroservis Mimarisi Nedir?

Mikroservis mimarisi, uygulamaların küçük, bağımsız servisler (mikroservisler) halinde geliştirilmesi yaklaşımıdır. Her bir mikroservis, uygulama içinde belirli bir görev üzerine odaklanır ve diğer mikroservislerle HTTP tabanlı arayüzler veya mesajlaşma protokolleri gibi hafif iletişim mekanizmaları aracılığıyla haberleşir.

Tasarım Deseni

Yukarıdaki diyagram, tek yönlü etkileşim katmanının controller → service → repository → model sırasıyla ilerlediğini gösterir. Her katman, yalnızca aynı katmandaki ya da daha alt seviyedeki sınıflarla etkileşime girebilir.

Controllers

Verileri istenilen çıktıya işlemek için kullanılan katmandır. Bu çıktı, HTML ya da API için JSON formatında olabilir. Bu katmanda herhangi bir iş mantığı barındırmamız gerekmez. Sadece parametreleri servise göndermemize izin verilir ve servisin kendi içinde yeni parametreler oluşturmasına izin verilmez.

Service

Sistem mantığının işlendiği katmandır ve çıktısı hâlâ veridir. Burada service sadece controller'dan parametre alabilir, kendi içinde parametre oluşturmasına izin verilmez. Service katmanında repository (depo) ile etkileşim kurabiliriz, bu repository modeli bağlayan bir yapıdır. Ayrıca servisin içerisinde tüm iş mantığını tanımlayabiliriz.

Service sınıfını daha iyi hale getirmek için önce bir interface (arayüz) sınıfı oluşturabilirsiniz.

Örnek:

<?php 

namespace App\Services;

use Illuminate\Support\Facades\Request;

interface UserServiceInterface {

    public function get();
    public function create(Request $request);
    
}

?>

Ardından ana sınıf:

<?php 

namespace App\Services;

use App\Repositories\UserRepository;

class UserService implements UserServiceInterface {

    protected $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function get() {
        $this->userRepository->get();
    }

    public function create($request) {
        // herhangi bir şey yap
    }

    public function getNumber() {
        return "Req-001";
    }

}

?>

Repository

Veri kaynaklarıyla etkileşim kurmak için kullanılan katmandır. Bu veri kaynakları veritabanı, önbellek (cache), oturum (session), Redis, API vb. olabilir. Repository katmanında, sadece veri kaynaklarından veri çekmek ya da bu kaynaklarla etkileşim kurmak için ek yöntemler veya fonksiyonlar oluştururuz.

Repository sınıfını daha iyi hale getirmek için önce bir interface (arayüz) sınıfı oluşturabilirsiniz.

Örnek:

<?php 

namespace App\Repositories;

interface UserRepositoryInterface {
    
    public function get();
    public function create($data);
}

?>

Ardından ana sınıf:

<?php 

namespace App\Repositories;

use App\Models\User;

class UserRepository implements UserRepositoryInterface {

    protected $model;

    public function __construct(User $user)
    {
        $this->model = $user;
    }

    public function get() {
        return $this->model->get();
    }

    public function create($request) {
        // herhangi bir şey yap
    }

}

?>

Gerekli başlatmayı gerçekleştirmek için Laravel’in dependency injection yöntemini kullanabiliriz.

Model

Veritabanı yapısı bilgilerini ve veritabanıyla doğrudan ilişkili olan veri işleme işlemlerini (ilişkiler, varsayılan değerler, veri formatları vb.) saklamak için kullanılan katmandır.

Klasör Yapısı

Eğer service-repository desenini kullanıyorsanız, kodunuzu unit test ile test edebilirsiniz.

Öncelikle şu komutu yazın:

php artisan make:test UserTest

Artık UserTest.php adlı yeni bir dosyanın oluşturulduğunu görebilirsiniz.

Kod:

<?php

namespace Tests\Feature;

use App\Services\UserService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class UserTest extends TestCase
{
    /**
     * Temel bir özellik testi örneği.
     *
     * @return void
     */
    public function test_call_user()
    {
        $userService = $this->app->make(UserService::class);
        $this->assertEquals('Req-001', $userService->getNumber());
    }
}

Sonuç:

 

 

By Aydın Yağız

Aydın Yağız

Teknolojiye olan tutkumla inovasyonu destekler, kullanıcı deneyimini önceliklerim arasına alırım. Kendi yeteneklerimi ve bilgilerimi paylaşarak, daha geniş bir topluluğun faydalanmasını sağlarım. İş birliği içinde hareket ederek, geleceğin teknoloji dünyasına katkıda bulunmayı hedeflerim. Sizi de bu heyecan verici yolculuğa davet ediyor, fikirlerinizi paylaşmaya ve teknolojiye dair sınırları zorlamaya teşvik ediyorum. Birlikte büyüyelim ve yeni ufuklara açılalım!

İletişime Geçin

Kodlama dünyasına adım atın ve deneyimlerinizi paylaşın. Siz de bu aktif topluluğa katılarak yeni bağlantılar kurun, fikir alışverişinde bulunun ve bilgi birikiminizi artırın.

Özelleştir

Farklı yazı tipleri ve renk seçenekleriyle stilinizi kişiselleştirin. Aşağıdaki örneklerden birini deneyerek sizin için en uygun olanı seçin.

Yazı Tipi Örnekleri

Renk Örnekleri