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ç:
