Saya sedang membaca dokumentasi Spring Cloud Netflix ketika saya menemukan cara untuk berbagi antarmuka antara server HTTP dan kliennya. Mereka menggunakan contoh ini untuk layanan microser, meskipun tidak ada alasan mengapa itu tidak dapat meluas ke komunikasi HTTP umum:
// The shared interface, in a common library
public interface UserService {
@RequestMapping(method = GET, value = "/users/{id}")
User getUser(@PathVariable long id);
}
// The controller, on the server
@RestController
public class UserResource implements UserService {
}
// The same interface used for the client
@FeignClient("users")
public interface UserClient extends UserService {
}
Ini mendefinisikan antarmuka yang digunakan sebagai server (Pegas @RestController
mengubahnya menjadi server HTTP) dan klien (Feign @FeignClient
mengaturnya untuk penggunaan klien HTTP). Implementasi server dan kelas klien dapat digunakan dalam proyek terpisah tetapi masih menggunakan antarmuka yang sama untuk memastikan bahwa jenisnya cocok.
Namun, di bawah contoh mereka menempatkan peringatan berikut:
Catatan: Pada umumnya tidak disarankan untuk berbagi antarmuka antara server dan klien. Ini memperkenalkan kopling ketat, dan juga sebenarnya tidak berfungsi dengan Spring MVC dalam bentuk saat ini (pemetaan parameter metode tidak diwariskan).
OK, jadi tidak terintegrasi dengan baik sekarang ... tetapi bagian itu muncul setelah peringatan terhadap kode berbagi dan memperkenalkan sambungan antara server dan klien, yang menurut mereka lebih penting. Mengapa menurut mereka itu ide yang buruk untuk berbagi antarmuka dengan cara ini?
Tanpa itu, Anda kehilangan kemampuan untuk menjamin bahwa server dan klien saling mengirim data yang mereka berdua bisa mengerti. Anda bisa menambahkan bidang ke satu tetapi tidak yang lain dan hanya menemukan ketidakcocokan sampai runtime. Menurut saya, ini bukan memperkenalkan kopling, tetapi hanya mengungkapkan kopling yang sudah ada. Apakah kebutuhan untuk membuat server benar-benar independen lebih besar daripada kebutuhan untuk memberi tahu mereka jenis data apa yang akan mereka terima?
sumber
Jawaban:
Alasan seperti yang dinyatakan dalam komentar adalah bahwa hal itu menghasilkan penggandengan erat platform klien Anda ke platform server Anda. Di sini, itu berarti klien Anda diharuskan untuk menggunakan bahasa / platform yang Anda gunakan di server untuk memahami kontrak yang diharapkan dari server Anda. Perhatikan bahwa ada perbedaan antara berbagi kode yang sama (artefak bahasa / platform tertentu) dan menyepakati kontrak tertentu.
Banyak proyek yang sebaliknya menggunakan dokumentasi untuk kontrak mereka. Contoh permintaan dan tanggapan dalam format netral (misalnya JSON) di atas protokol standar (misalnya REST). (Lihat Stripe API docs , misalnya). Karena tidak praktis untuk menulis kontrak berbasis kode untuk setiap platform klien yang mungkin Anda ingin gunakan atau izinkan. Yang lain lagi menggunakan alat manajemen API untuk mendefinisikan kontrak netral .
Contoh Anda menambahkan bidang adalah masalah yang terpisah - contoh mengapa penting untuk kontrak versi API. Biarkan klien menggunakan versi yang mereka dirancang. Versi API baru yang tidak kompatibel mundur ada di samping yang lama. Klien untuk versi yang lama terus bekerja sampai timnya memperbaruinya atau sampai Anda menghentikan versi yang lama (setelah periode penghentian / migrasi). Lihat Perubahan Paralel .
Mengikuti (saran implisit dalam) membantu klien dan server untuk berevolusi dengan cara dan langkah yang masuk akal untuk masing-masing. Jika Anda dapat secara wajar menjamin bahwa server dan klien Anda akan selalu berbagi bahasa / platform yang sama DAN berkembang pada kecepatan yang sama, maka menggunakan artefak kode khusus bahasa dan platform karena kontrak Anda mungkin akan baik-baik saja. Namun, ini mungkin bukan harapan yang masuk akal, terutama untuk proyek-proyek yang menargetkan Netflix OSS (sesuatu yang khusus ditujukan untuk skalabilitas dan kinerja cloud, dengan semua kerumitan yang diperlukan).
sumber