EJB'ler - Uzak ve / veya yerel arayüzler ne zaman kullanılır?


180

Java EE'de çok yeniyim ve Yerel arabirimler ve Uzak arabirimler kavramını anlamaya çalışıyorum. Java EE'nin en büyük avantajlarından birinin ölçeklendirmenin kolay olduğu söylendi (ki bu da farklı bileşenleri farklı sunucularda dağıtabileceğiniz anlamına geliyor). Uzak ve Yerel arayüzler devreye giriyor mu? Uygulamanızın farklı sunucularda farklı bileşenlere sahip olmasını bekliyorsanız Uzak arayüzler kullanmanız mı gerekiyor? Ve uygulamanız yalnızca bir sunucuda kalacaksa Yerel arayüzler kullanılsın mı?

Yukarıdaki varsayımlarım doğruysa, trafik hacminin ne olacağından emin olmadığınız yeni bir uygulama için Yerel veya Uzak arabirimlerin kullanılıp kullanılmayacağını nasıl seçersiniz? Yerel arabirimleri kullanarak başlayın ve uygulanabilir olduğunda yavaş yavaş Uzak arabirimlere yükseltilsin mi?

Herhangi bir açıklama ve öneri için teşekkürler.

Yanıtlar:


186

Java EE'de çok yeniyim ve Yerel arabirimler ve Uzak arabirimler kavramını anlamaya çalışıyorum.

EJB spesifikasyonunun ilk versiyonlarında, EJB'lerin uzak bileşenler olduğu varsayıldı ve bunları çağırmanın tek yolu, RMI semantiği ve ima ettiği tüm yükü kullanarak (her biri için bir ağ çağrısı ve nesne serileştirmesi) bir uzaktan çağrı yapmaktı. yöntem çağrısı). EJB müşterileri, EJB konteyneri ile aynı sanal makineye yerleştirildiklerinde bile bu performans cezasını ödemek zorunda kaldılar.

Daha sonra Sun, çoğu iş uygulamasının aslında EJB'leri farklı bir katmana dağıtmadığını fark etti ve Yerel arayüzler kavramını sunarak spesifikasyonu (EJB 2.0'da) sabitlediler, böylece EJB konteyneri ile aynı sanal makinede bulunan istemciler EJB'leri arayabilir doğrudan yöntem çağırma, tamamen RMI semantiği (ve ilgili yükü) atlayarak.

Java EE'nin en büyük avantajlarından birinin ölçeklendirmenin kolay olması söylendi (ki bu da farklı bileşenleri farklı sunucularda dağıtabileceğiniz anlamına geliyor)

Java EE ölçeklendirilebilir, ancak bu mutlaka bileşenlerin dağıtılması anlamına gelmez . Web katmanını ve EJB katmanını ayırmadan bir kümede Web + EJB uygulaması çalıştırabilirsiniz.

Uygulamanızın farklı sunucularda farklı bileşenlere sahip olmasını bekliyorsanız Uzak arayüzler kullanmanız mı gerekiyor? Ve uygulamanız yalnızca bir sunucuda kalacaksa Yerel arayüzler kullanılsın mı?

Ben böyle ifade: istemci aynı JVM (bu sadece bir sunucu / JVM kullanmak anlamına gelmez) değilse uzak arabirimleri kullanın.

(...) Yerel arabirimleri kullanarak başlayın ve uygulanabilir olduğunda yavaş yavaş Uzak arabirimlere yükseltilsin mi?

Muhtemelen Yerel arayüzleri kullanarak başlardım. Zaten ima gibi, uzak arayüzleri geçiş (bir küme her zaman zorunlu değildir collocated yapıyı).

Aşağıda belirtilen kaynakları kontrol etmenizi öneririm (ilk 2 tanesi oldukça eski ama yine de alakalı, 2 tanesi daha yeni).

kaynaklar


2
Bu soruyu ilginç buldum. "Uzak arabirimlere geçmek kesinlikle zorunlu değil" ile ne demek istediniz? Bu, aynı JVM'nin dışına yeni bir istemci eklediğinizde, uzak bir arayüz yapmanız gerekmediği anlamına mı geliyor?
mohamida

2
@Josek Teşekkürler, hoşuna gitti @mohamida Ben ifadelerde hafif bir değişiklik yaptım. Demek istediğim, ortak bir yapıyı kümeleyebileceğiniz.
Pascal Thivent

1
Cevap ve ek kaynaklar için teşekkürler, çok yardımcı oldular. Bir web uygulamasını ölçeklendirmenin birkaç yolu var gibi görünüyor ... yani bileşenleri dağıtmak (farklı katmanları farklı JVM'lere ayırmak olarak mı alıyorum?) Veya yük dengeleme (tüm uygulamanın sayısız sunucu?) ve her ikisinin bir kombinasyonunu kullanabileceğinizi varsayalım? Bu konuyla ilgili iyi kitapları tesadüfen biliyor musunuz? Tekrar teşekkürler!
Brian DiCasa

2
@Brian It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?Evet, aynen öyle. Do you, by chance know of good books on this topic?Ne yazık ki, hayır, varsa "ZE" mutlak kaynak bilmiyorum. Yine de bazı referanslarla daha fazla kaynak ekledim.
Pascal Thivent

ilk kaynak bağlantısı öldü
Viacheslav Dobromyslov

48

Yukarıda yazılanların çoğuna katılıyorum, ancak "nasıl başlanacağı" fikirlerini biraz düzeltmek istiyorum.

Benim size önerim asla etmektir hiç Kodunuzdaki EJB arayüzleri doğrudan programlamak. Her zaman düzenli, iş odaklı bir arayüz kullanın, buna programlayın (yani, kod çağırma yöntemlerinizi iş odaklı arayüzde bulundurun) ve EJB "tutkal" kodunu takılabilir bir uygulama olarak sağlayın. Programınız EJB gibi uygulama ayrıntılarına değil, iş mantığına odaklanmalıdır.

Bu şekilde, uzak ve yerel uygulamalar arasında kolayca geçiş yapabilirsiniz - ve Spring gibi bir IoC kapsayıcısı kullanıyorsanız, bunu yalnızca yapılandırma yoluyla yapabilirsiniz.

Yerelden uzaktan kumandaya geçiş hakkında özel bir not: ikisi arasında birkaç anlamsal fark olduğunu unutmayın. Örneğin, bir EJB yöntemini "uzak arabirimi" aracılığıyla çağırmak, bağımsız değişkenlerin değere göre iletilmesine neden olurken, "yerel arabirim" yoluyla çağrılarak, bağımsız değişkenler başvuruya göre iletilir. Bu büyük bir farktır; "yerel" ile başlıyorsanız, sisteminizi "uzak" anlambilimi de dikkate alacak şekilde tasarladığınızdan emin olun.

Tasarımınız, aktarılan nesneleri değiştiren EJB yöntemlerine dayanıyorsa, daha sonra "uzaktan kumandaya geçmeniz" zor olacaktır; belki de imkansız.

İyi şanslar.


2
etkili java başına değişebilirliği en aza indirmek için başka bir neden gibi geliyor. Bu, EJB'lerle RMI tipi arayüz için "uzaktan kumandaya geçme" esnekliğine yardımcı olur mu?
Thufir

19

EJB Spec 3.2'ye göre bir EJB yerel veya uzak olabilir . Bir iş arabirimi aynı anda hem yerel hem de uzak olamaz.

@Local açıklamalı çekirdeklere yalnızca aynı uygulamadaysa erişilebilir.

@Remote açıklamalı çekirdeklere farklı uygulamalarda veya uygulama sunucularında ikamet ederek erişilebilir.

Akılda tutulması gereken önemli şeyler:

  1. Bir fasulye sınıfı @Remoteek açıklama içeriyorsa, uygulanan tüm arabirimler uzak olmalıdır.
  2. Bean sınıfı ek açıklama içermiyorsa veya @Localek açıklama belirtilirse, uygulanan tüm arabirimin yerel olduğu varsayılır.
  3. Hiçbir arabirim içermeyen bir fasulye için açıkça tanımlanan tüm arabirimler @Local olarak bildirilmelidir.
  4. EJB 3.2 sürümü, yerel ve uzak arabirimlerin açıkça tanımlanması gereken durumlar için daha fazla ayrıntı düzeyi sağlama eğilimindedir.

1
Soru: @LocalBaşka bir uygulamada (JAR, WAR, EAR) fakat aynı JVM'de bir EJB'yi çağırmak için kullanabilir misiniz ?
Carlitos Way

@PritamBanerjee Carlitos Wa hakkında herhangi bir fikir, ben de aynı sorunla karşı karşıyayım. EJB farklı küme ve istemci sunucu uygulaması farklı bir kümedir.
Govi S

@GovindaSakhare Bundan pek emin değilim. Üzgünüz :(
Pritam Banerjee

7

Bu, endişelerinize cevap verebilir:

Genel olarak, çekirdeği dağıtılmış ortamlarda kullanmayı planladığınız durumlarda Enterprise Java Bean'inizin uzaktan istemci görünümüne ihtiyacı olacaktır. Özellikle, bunlar üzerinde çalışacak istemcinin farklı bir Java Sanal Makinesi'nde (JVM) olacağı durumlardır. Uzak istemci görünümünde, uzak ev arabiriminden ve / veya uzak bileşen arabiriminden herhangi bir yöntemin çağrılması, uzaktan yöntem çağırma (RMI) yoluyla gerçekleştirilecektir.

Bir EJB, yalnızca diğer kurumsal fasulyelerin veya müşterilerin sadece tek bir JVM içinde fasulyeye hitap edeceğinin garantilenmesi durumunda yerel müşteri görünümünü kullanabilir. Bu durumda, bu erişim RMI yerine doğrudan yöntem çağrılarıyla gerçekleştirilir.

Kaynak: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.