Saya sangat baru di Java EE dan saya mencoba memahami konsep antarmuka lokal dan antarmuka jarak jauh.
Dalam versi awal spesifikasi EJB, EJB "diasumsikan" sebagai komponen jarak jauh dan satu-satunya cara untuk memintanya adalah dengan membuat panggilan jarak jauh, menggunakan semantik RMI dan semua overhead yang disiratkan (panggilan jaringan dan objek serialisasi untuk setiap panggilan metode). Klien EJB harus membayar penalti kinerja ini bahkan ketika ditempatkan di mesin virtual yang sama dengan wadah EJB.
Kemudian, Sun menyadari sebagian besar aplikasi bisnis sebenarnya tidak mendistribusikan EJB pada tingkat yang berbeda dan mereka memperbaiki spec (dalam EJB 2.0) dengan memperkenalkan konsep antarmuka lokal sehingga klien yang ditempatkan di mesin virtual yang sama dengan wadah EJB dapat memanggil EJB menggunakan doa metode langsung, benar-benar melewati semantik RMI (dan overhead terkait).
Saya telah diberitahu bahwa salah satu keuntungan besar Java EE adalah mudah untuk menskalakan (yang saya percaya berarti Anda dapat menggunakan komponen yang berbeda pada server yang berbeda)
Java EE dapat menskala, tetapi ini tidak berarti mendistribusikan komponen. Anda bisa menjalankan aplikasi Web + EJB pada sebuah cluster tanpa memisahkan tingkat Web dan tingkat EJB.
Apakah Anda seharusnya menggunakan antarmuka jauh jika Anda mengharapkan aplikasi Anda memiliki komponen yang berbeda pada server yang berbeda? Dan gunakan antarmuka lokal jika aplikasi Anda hanya akan berada di satu server?
Saya ingin ungkapannya seperti ini: gunakan antarmuka jarak jauh jika klien tidak berada dalam JVM yang sama (ini tidak berarti hanya menggunakan satu server / JVM).
(...) Mulailah dengan menggunakan antarmuka lokal, dan secara bertahap tingkatkan ke antarmuka jarak jauh di mana berlaku?
Saya mungkin akan mulai dengan menggunakan antarmuka lokal. Dan seperti yang sudah ditunjukkan, beralih ke antarmuka jarak jauh tidak selalu wajib (Anda dapat mengelompokkan yang dilokasi struktur yang ).
Saya sarankan untuk memeriksa sumber daya yang disebutkan di bawah (2 yang pertama sudah cukup tua tetapi masih relevan, 2 lainnya lebih baru).
Sumber daya
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Ya, memang begitu.Do you, by chance know of good books on this topic?
Sayangnya, tidak, saya tidak tahu sumber daya absolut "ZE", jika ada. Saya telah menambahkan lebih banyak sumber daya dengan beberapa referensi.Meskipun saya setuju dengan sebagian besar dari apa yang ditulis di atas, saya ingin sedikit memperbaiki ide "bagaimana memulai".
Saran saya kepada Anda adalah untuk tidak pernah memprogram secara langsung ke antarmuka EJB dalam kode Anda. Selalu gunakan antarmuka reguler, berorientasi bisnis, program untuk itu (artinya, minta metode panggilan kode Anda pada antarmuka berorientasi bisnis) dan berikan kode "lem" EJB sebagai implementasi yang dapat dicolokkan. Program Anda harus fokus pada logika bisnis, dan bukan pada detail implementasi seperti EJB.
Dengan begitu, Anda dapat dengan mudah beralih antara implementasi jarak jauh dan lokal - dan jika Anda menggunakan wadah IoC seperti Spring, Anda dapat melakukannya dengan hanya menggunakan konfigurasi.
Catatan khusus tentang beralih dari lokal ke jarak jauh: perhatikan bahwa ada beberapa perbedaan semantik antara keduanya. Sebagai contoh, memanggil metode EJB melalui "antarmuka jarak jauh" menghasilkan argumen yang dilewatkan oleh nilai, sementara memanggil melalui "antarmuka lokal" menghasilkan argumen yang dilewatkan oleh referensi. Ini adalah perbedaan utama ; jadi jika Anda "mulai dengan lokal", pastikan bahwa Anda merancang sistem Anda dengan cara yang mengambil semantik "jarak jauh" menjadi pertimbangan juga.
Jika desain Anda mengandalkan metode EJB mengubah objek yang lewat, maka akan sulit bagi Anda untuk "beralih ke jarak jauh" nanti; bahkan mungkin mustahil.
Semoga berhasil.
sumber
Menurut EJB Spec 3.2, EJB dapat berupa lokal atau jarak jauh . Antarmuka bisnis tidak bisa bersifat lokal dan jarak jauh pada saat yang sama.
@Local
kacang beranotasi hanya dapat diakses jika berada dalam aplikasi yang sama.@Remote
kacang beranotasi dapat diakses di aplikasi yang berbeda, berada di jvms yang berbeda atau di server aplikasi.Jadi hal-hal penting yang perlu diingat adalah:
@Remote
anotasi, maka semua antarmuka yang diimplementasikan harus jauh.@Local
anotasi ditentukan, maka semua antarmuka yang diimplementasikan diasumsikan lokal.sumber
@Local
untuk memohon EJB di aplikasi lain (JAR, WAR, EAR), tetapi JVM yang sama?Ini dapat menjawab kekhawatiran Anda:
Sumber: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
sumber