Arsitektur microservice membagikan model domain

12

Mari kita asumsikan bahwa kita memiliki aplikasi Boot Musim Semi yang menggunakan arsitektur layanan microser. Setiap layanan memiliki model domain sendiri, tetapi setiap layanan harus mereferensikan objek domain pengguna. Apa yang akan menjadi pendekatan terbaik tentang cara mengatasi masalah ini? Apakah lebih baik untuk setiap layanan untuk hanya memiliki userId dan kemudian, ketika diperlukan, meminta layanan pengguna untuk detail pengguna, atau akan lebih baik untuk memiliki perpustakaan domain bersama untuk semua layanan microser?

pengguna1176999
sumber
1
Selalu lebih baik memiliki satu sumber kebenaran , kapan pun memungkinkan.
Robert Harvey
@RobertHarvey Bagaimana pengaruhnya terhadap kegigihan polyglot? Apakah menggunakan pustaka bersama untuk semua objek domain masih berarti bahwa setiap layanan Microsoft dapat memiliki basis datanya sendiri?
user1176999
Belum pernah mendengar istilah itu sebelumnya, tetapi melihat definisi itu, saya akan mengatakan bahwa itu tidak mempengaruhi kegigihan polyglot sama sekali, kecuali sejauh mana teknologi yang Anda pilih untuk menyimpan data yang ingin Anda masukkan pengguna.
Robert Harvey

Jawaban:

12

Jika Anda memang menggunakan layanan-layanan microser untuk mendapatkan keuntungan dari skalabilitas, kopling longgar, dan modifikasi independen yang mudah dari masing-masing layanan, Anda harus tetap menggunakannya semaksimal mungkin.

Arsitektur keseluruhan

Saya pikir pendekatan terbaik adalah:

  • memiliki layanan mikro untuk manajemen informasi pengguna umum;
  • menyimpan informasi pengguna khusus microservice (mis. profil, otorisasi, preferensi) di setiap microservice (menggunakan rujukan dari id umum)

Bacaan tambahan:

  • Artikel ini menjelaskan dengan sangat baik arsitektur dan pemikiran seperti ini, dengan kasus otorisasi tertentu.
  • Artikel ini menjelaskan tantangan dan solusi untuk manajemen identitas pengguna, untuk menghindari semua layanan untuk mengakses repositori yang sama.
  • Artikel ini menjelaskan cara menggunakan JWT untuk meneruskan identitas pengguna di antara layanan (mencatat bahwa beberapa informasi dasar dapat diberikan dalam token id, yang menghindari keharusan untuk menanyakan layanan pengguna satu lagi setelah login, setidaknya untuk yang sangat mendasar informasi).

Berbagi kode

Sekarang jika Anda menyetujui solusi di atas, kami memiliki layanan microservice (enkapsulasi model domain untuk pengguna) dan semua layanan lainnya adalah konsumen dari microservice yang sama. Pertanyaannya adalah untuk mengetahui apakah Anda ingin:

  • baik setiap layanan mikro untuk menemukan kembali kode konsumen, mengikuti dogma pemisahan yang kuat untuk memungkinkan siklus rilis yang fleksibel dan berbeda,
  • atau untuk membagikan kode konsumen sebagai bagian dari perpustakaan, mengingat informasi mendasar ini merupakan perpanjangan dari pola infrastruktur "sasis" .

Saya tidak akan mengambil posisi yang jelas tentang hal itu, karena ada perang pendapat tentang topik pembagian kode ini, dan saya tidak berpikir bahwa saya berada dalam posisi untuk mengambil posisi objektif. Ini sudah ada beberapa bacaan tambahan:

  • Artikel ini menganggap tidak ada solusi terbaik, dan semuanya tergantung pada tujuan Anda
  • Posisi artikel ini adalah bahwa berbagi kode adalah buruk hanya jika membuat sambungan yang kuat, dan berbagi kode dapat membawa beberapa sinergi
  • Artikel ini (dari orang-orang yang mengimplementasikan microservices pada skala) bersikeras perlunya memiliki bangunan terpisah, dan potensi masalah penonaktifan kode lama. Memiliki perpustakaan bersama untuk dikonsumsi dengan manajemen versi yang solid tidak mencegah praktik yang baik ini.

Pendapat saya sendiri tentang itu adalah bahwa Anda TIDAK HARUS BERBAGI kode antara penyedia-pengguna dan konsumen-pengguna, untuk menghindari penggabungan yang ketat. Namun Anda DAPAT BERBAGI kode konsumsi-pengguna antara konsumen jika Anda memiliki manajemen versi yang kuat. Pendekatan ini akan memiliki beberapa keunggulan:

  • Layanan pelanggan yang berbeda dapat dibuat dengan versi berbeda dari kode konsumsi pengguna yang digunakan bersama (selama versi tersebut kompatibel dengan penyedia-pengguna independen). Fleksibilitas yang sama dengan menciptakan kembali roda tetapi produktivitas lebih tinggi.
  • Anda dapat mengubah layanan penyedia pengguna Anda secara mandiri tanpa berdampak pada konsumen.
  • Jika bug ditemukan di sisi konsumsi, Anda bisa memperbaikinya sekali dan menggunakan semua konsumen sebagai yang paling sesuai (terima kasih kepada manajemen versi). Ini bahkan dapat mengarah pada kualitas layanan yang lebih tinggi.
  • Jika karena alasan Anda wajib memperbarui API penyedia-pengguna, Anda dapat menggunakan konsumsi pengguna yang diperbarui dengan lebih cepat. Jika Anda menjaga layanan penyedia lama dan baru aktif selama transisi, kemungkinan berbagi ini dapat memungkinkan untuk menonaktifkan versi yang lebih lama dari penyedia konsumen.
Christophe
sumber
1

Saya akan menghindari perpustakaan bersama jika mungkin. Tanyakan pada diri sendiri sifat-sifat pengguna apa yang dibutuhkan setiap layanan? Seringkali ada domain inti di mana sebagian besar perilaku di sekitar pengguna akan hidup, dengan domain pendukung sering hanya membutuhkan userId.

Jika layanan Anda memerlukan detail lain tentang pengguna, lihat beberapa saran di sini mengenai cara menangani situasi seperti itu

a25bedc5-3d09-41b8-82fb-ea6c353d75ae
sumber