blaapps - servidor de aplicaciones
DESCRIPTION
Blaapps es un Framework LigeroFue mi Proyecto de Fin de Carrera, y esta es la presentación con la que lo defendí.TRANSCRIPT
![Page 1: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/1.jpg)
SERVIDOR DEAPLICACIONES DISTRIBUIDAS
Víctor Jiménez Cerrada [email protected]://www.blaapps.org
Hola! Soy Víctor Jiménez Cerrada, desarrollador de BlaappsBlaapps es un framework para desarrollar apliaciones distribuidas.
![Page 2: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/2.jpg)
Q & A
Conclusiones
Demo
Blaapps
Servidores de Aplicaciones30"
![Page 3: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/3.jpg)
Q & A
Conclusiones
Demo
Blaapps
Servidores de Aplicaciones
Para entrar en contexto, veamos qué son los servidores de aplicaciones...
![Page 4: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/4.jpg)
SERVIDORES DE APLICACIONES
En la actualidad existen diversos servidores de aplicaciones...
![Page 5: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/5.jpg)
OBJETIVO: REDUCIR COSTES
Tareas Comunes:
•Persistencia
•Colas de mensajes
•Seguridad
•Conexiones
•...
Aplicación
Aplicación
Aplicación
Una empresa utiliza el servidor de aplicaciones para reducir costes de desarrollo.El servidor de aplicaciones realiza tareas comunes para varias aplicaciones.
![Page 6: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/6.jpg)
UN POCO DE HISTORIA…
1800-19601970's 1980's 1990's
Tarjetas Perforadas
∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎ ∎
Hardware
En las primeras máquinas se utilizaban tarjetas perforadas para darle las instrucciones.
![Page 7: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/7.jpg)
UN POCO DE HISTORIA…
1800-19601970's
1980's 1990's
Programación Estructurada
open file;while (reading not finished) { read some data; if (error) { }}process read data;
Hardware
La PE permitió dar instrucciones en un lenguaje más humano.Se sigue trabajando con la máquina.
![Page 8: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/8.jpg)
UN POCO DE HISTORIA…
1800-19601970's
1980's 1990's
Sistemas Operativos
Hardware
open file;while (reading not finished) { read some data; if (error) { }}process read data;
S.O.
Con la difusión de los sistemas operativos el desarrollador se abstrae del Hardware.
![Page 9: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/9.jpg)
UN POCO DE HISTORIA…
1800-1960 1970's1980's
1990's
Programación Orientada a Objetos
HardwareS.O.
La POO permite crear abstracciones aún más cercanas a la forma de pensar humana.
![Page 10: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/10.jpg)
UN POCO DE HISTORIA…
1800-1960 1970's 1980's1990's
Frameworks
HardwareS.O.
Fra
me
wo
rk
La mayoría de las apps realizan las mismas tareas:Conexión a base de datos, gestión de las acciones del usuario...Un Framework implementa estas funciones para el desarrollador. El desarollador sólo se centra en su aplicación.
![Page 11: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/11.jpg)
OBJETIVO: REDUCIR COSTES
Tareas Comunes:
•Persistencia
•Colas de mensajes
•Seguridad
•Conexiones
•...
Aplicación
Aplicación
Aplicación
Los servidores de aplicaciones son Frameworks.De nuevo, el objetivo es reducir costes.A parte de que se desarrolla menos código, desarrollar se hace más fácil, por tanto se necesitan menos expertos.
![Page 12: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/12.jpg)
OBJETIVO: REDUCIR COSTES
Si mi plataforma es tan fácil de desarrollar, que hasta un mono puede aprenderla...
![Page 13: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/13.jpg)
OBJETIVO: REDUCIR COSTES
Por el precio de un experto, puedo pagar a varios monos.
![Page 14: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/14.jpg)
Q & A
Conclusiones
Demo
Blaapps
Servidores de Aplicaciones
Ahora hablemos de Blaapps
![Page 15: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/15.jpg)
Muchas veces veo los Servidores de Aplicaciones como grandes dinosaurios: Grandes y pesados.Tienen muchas funcionalidades, son muy robustos y por ello son ideales para aplicaciones empresariales...
![Page 16: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/16.jpg)
Sin embargo Blaapps, es como una rana feliz.
![Page 17: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/17.jpg)
BLAAPPS
• Ligero
• Rápido
• Fácil de utilizar
•Modular
Es ligero y muy rápido. (Arranca en menos de 3 segundos)Es fácil de utilizar (Ahora lo veremos)Y es flexible, puede aumentar de funcionalidad mediante módulos...
![Page 18: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/18.jpg)
BLAAPPS
![Page 19: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/19.jpg)
BLAAPPS CORE
Sistemas mínimos:
• Cargador de Módulos
• Configuración
• Registros
•Mensajería
•MBean Server
Blaapps está formado por 4 sistemas principales...
![Page 20: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/20.jpg)
BLAAPPS MODULES
Funcionalidades extra:
•Objetos Remotos (RMI)
• Persistencia (JPA)
De momento hay desarrollados dos módulos...
![Page 21: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/21.jpg)
¿CÓMO SE USA?Blaapps Core
Antes hemos comentado que Blaapps es fácil de usar, veámoslo...
![Page 22: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/22.jpg)
@Module(! name = "HiWorld",! description = "An example module",! version = @Version(revision=5) // 0.5.0.0)public class HiWorld {
! @Log ! private Logger log;
! @AfterDeployment! public void sayHello() {! ! log.info("Hello world!");! }
! ...}
Esto sería un Módulo de blaapps.
![Page 23: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/23.jpg)
@Module(! name = "HiWorld",! description = "An example module",! version = @Version(revision=5) // 0.5.0.0)public class HiWorld {
! @Log ! private Logger log;
! @AfterDeployment! public void sayHello() {! ! log.info("Hello world!");! }
! ...}
![Page 24: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/24.jpg)
@Module(! name = "HiWorld",! description = "An example module",! version = @Version(revision=5) // 0.5.0.0)public class HiWorld {
! @Log ! private Logger log;
! @AfterDeployment! public void sayHello() {! ! log.info("Hello world!");! }
! ...}
Inyección de dependencias
![Page 25: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/25.jpg)
@Module(! name = "HiWorld",! description = "An example module",! version = @Version(revision=5) // 0.5.0.0)public class HiWorld {
! @Log ! private Logger log;
! @AfterDeployment! public void sayHello() {! ! log.info("Hello world!");! }
! ...}
Ciclo de vida de un módulo.
![Page 26: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/26.jpg)
blaapps librariesblaapps librariesblaapps libraries
blaapps
HiWorld.jar
bin
conf
deploy
lib
blaapps-launcher.jar
blaapps libraries
blaapps.properties
Meteríamos esa clase en blaapps/deploy/HiWorld.jar
![Page 27: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/27.jpg)
$ cd blaapps/bin$ java -jar blaapps-kernel-launcher.jar ../conf/
y arrancaríamos blaapps...
![Page 28: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/28.jpg)
$ cd blaapps/bin$ java -jar blaapps-kernel-launcher.jar ../conf/Loading Libraries/opt/blaapps/bin/../lib[...]Libraries LoadedINFO [Blaapps-Core]: Starting Deployer...INFO [Blaapps-Core]: Loading Module HiWorldINFO [HiWorld]: Hello World!INFO [Blaapps-Core]: Module HiWorld LoadedINFO [Blaapps-Core]: Deployer Started
y arrancaríamos blaapps...
![Page 29: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/29.jpg)
$ cd blaapps/bin$ java -jar blaapps-kernel-launcher.jar ../conf/Loading Libraries/opt/blaapps/bin/../lib[...]Libraries LoadedINFO [Blaapps-Core]: Starting Deployer...INFO [Blaapps-Core]: Loading Module HiWorldINFO [HiWorld]: Hello World!INFO [Blaapps-Core]: Module HiWorld LoadedINFO [Blaapps-Core]: Deployer Started.quitINFO [Blaapps-Core]: Deployer Shutdown...INFO [Blaapps-Core]: Unloading ModuleINFO [Blaapps-Core]: Module HiWorld UnloadedINFO [Blaapps-Core]: Deployer Stopped$
y arrancaríamos blaapps...
![Page 30: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/30.jpg)
• @Module
• @Version
• @Dependency
CORE ANNOTATIONSDeployer
Tres son las anotaciones necesarias para definir la metainformación de un módulo...
![Page 31: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/31.jpg)
Logger log = Logger.getLogger(“HiWorld”);log.info(“Hola Mundo!”);
INFO [HiWorld]: Hola Mundo!
CORE ANNOTATIONSRegistros
Se puede obtener un logger programáticamente...
![Page 32: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/32.jpg)
@LogLogger log;log.info(“Hola Mundo!”);
INFO [HiWorld]: Hola Mundo!
CORE ANNOTATIONSRegistros
Pero Blaapps también puede crearlo por nosotros...
![Page 33: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/33.jpg)
@Inbox("evento")private void onMessage(Message message)
@Inbox("evento")private MessageStorage inbox;
CORE ANNOTATIONSMensajería
Las colas de mensajes están formadas por dos partes: Los buzones de recepción y de envío.Los buzones de recepción se pueden crear mediante la anotación @Inbox.
![Page 34: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/34.jpg)
MailBoxMBean mailbox = ! ! ! ! MainDeployerFactory.getServerMessageQueue();
Message message = new Message(this, true, atmnt1);
mailbox.sendMessage(“evento”, message);
CORE ANNOTATIONSMensajería
Para enviar un mensaje al servidor, utilizamos el enviador del servidor...
![Page 35: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/35.jpg)
@Confprivate Properties conf;
• Configuración por defecto
defaults.properties
• Configuración del usuario
carpeta "conf"
CORE ANNOTATIONSConfiguración
Blaapps permite cargar la configuración de un módulo con @Conf@Conf junta la configuración por defecto de ese módulo con la definida por el usuario.
![Page 36: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/36.jpg)
@ManagementServerprivate MBeanServer server;
public PersistenceModule() {! ObjectName persistenceName = new ObjectName(name);! server.registerMBean(this, persistenceName);}
• clase ManagementProxy
CORE ANNOTATIONSConfiguración
Blaapps inicia un MBeanServer para registrar elementos de gestión.Todos los módulos publican una interfaz de gestión.La clase ManagementProxy permite utilizar de manera fácil un MBean.
![Page 37: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/37.jpg)
¿CÓMO SE USA?Blaapps Modules
Pasemos a ver los módulos de blaapps
![Page 38: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/38.jpg)
MODULE ANNOTATIONSPersistencia
• JPA Annotations
@PersistenceContext@Entity
@Module( !name = "test",! ! ! ! version = @Version(revision=5),! ! ! ! description = "Testing persistence",! ! ! ! dependency = @Dependency(! ! ! ! ! ! parentName = "Blaapps-Persistence",! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! policy = DependencyPolicy.REQUIRED! ! ! ! ))public class Module01 {
! @PersistenceContext! private EntityManager em;!
Primero vamos a hablar del módulo de persistencia.Permite usar JPA en un módulo para acceder a una base de datos.Acepta las anotaciones JPA.
![Page 39: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/39.jpg)
• JPA Annotations
@PersistenceContext@Entity
@Module( !name = "test",! ! ! ! version = @Version(revision=5),! ! ! ! description = "Testing persistence",! ! ! ! dependency = @Dependency(! ! ! ! ! ! parentName = "Blaapps-Persistence",! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! policy = DependencyPolicy.REQUIRED! ! ! ! ))public class Module01 {
! @PersistenceContext! private EntityManager em;!
Persistencia
Para poder usar las clases del módulo de persistencia, tenemos que indicarlo como dependencia.
![Page 40: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/40.jpg)
MODULE ANNOTATIONSObjetos Remotos
• RMI Objects
@BStateless@BRemote
El módulo de objetos remotos ofrece un mecanismo sencillo de publicación de clases RMI
![Page 41: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/41.jpg)
@Module(! name="test-remote-1",! ! ! ! version=@Version(revision=5),! ! ! ! description = "Testing Remote",! ! ! ! dependency = @Dependency(! ! ! ! ! ! ! parentName = "Blaapps-Remote",! ! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! ! policy = DependencyPolicy.REQUIRED! ! ! ! ))public class Module01 {!! ! ...
Objetos Remotos
En el módulo en el que definamos los objetos RMI, tenemos que indicar Blaapps-remote como dependencia.
![Page 42: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/42.jpg)
public interface DummyRemote! ! ! ! ! ! ! ! extends Remote, Serializable {
! int getFive() throws RemoteException;
}
@BStateless(DummyRemote.class)public class DummyRemoteObject implements DummyRemote {
! @Override! public int getFive(){! ! return 5;! }!
}
Objetos Remotos
En este módulo definimos una interfaz pública y una clase que la implementa.La clase debe ser compatible con RMI.Marcamos con @BStateless el interfaz público que implementa.
![Page 43: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/43.jpg)
@Module(! name = "test-remote-2",! ! ! ! version = @Version(revision=5),! ! ! ! description = "Testing Remote",! ! ! ! dependency = {! ! ! ! ! ! @Dependency(! ! ! ! ! ! ! ! parentName = "Blaapps-Remote",! ! ! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! ! ! policy = DependencyPolicy.REQUIRED),! ! ! ! ! ! @Dependency(! ! ! ! ! ! ! ! parentName = "test-remote-1",! ! ! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! ! ! policy = DependencyPolicy.REQUIRED)! ! ! ! })public class Module02 {
! @BRemote("test-remote-1")! private DummyRemote dummy;
! @AfterDeployment! public void testRemote(){! ! if (dummy.getFive() == 5) {! ! ! // Remote Module Works
! ! }! }
Objetos Remotos
En otro módulo, donde queramos usar el objeto remoto recién definido,marcamos como dependencias "Blaapps-remote" y el módulo anterior.
![Page 44: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/44.jpg)
Objetos Remotos
@Module(! name = "test-remote-2",! ! ! ! version = @Version(revision=5),! ! ! ! description = "Testing Remote",! ! ! ! dependency = {! ! ! ! ! ! @Dependency(! ! ! ! ! ! ! ! parentName = "Blaapps-Remote",! ! ! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! ! ! policy = DependencyPolicy.REQUIRED),! ! ! ! ! ! @Dependency(! ! ! ! ! ! ! ! parentName = "test-remote-1",! ! ! ! ! ! ! ! version = @Version(revision=5),! ! ! ! ! ! ! ! comparator = Comparation.EQUAL,! ! ! ! ! ! ! ! policy = DependencyPolicy.REQUIRED)! ! ! ! })public class Module02 {
! @BRemote("test-remote-1")! private DummyRemote dummy;
! @AfterDeployment! public void testRemote(){! ! if (dummy.getFive() == 5) {! ! ! // Remote Module Works
! ! }! }
Con la anotación @BRemote inyectamos una referencia a un objeto remoto
![Page 45: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/45.jpg)
3 RETOS
• Aislamiento
• Inyección de Dependencias
•Nuevas Instancias
Durante el desarrollo de blaapps el equipo de desarrollo se ha encontrado con 3 grandes retos.El primero de ellos fue el asegurar el aislamiento entre módulos.
![Page 46: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/46.jpg)
AISLAMIENTOProblema
Usuarios Jabber
collections-commons-3.2.1.jar
collections-commons-2.1.1.jar
Si dos módulos utilizan distintas versiones de la misma librería o clase,se tiene que asegurar el que cada módulo utilice su versión.
![Page 47: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/47.jpg)
AISLAMIENTOClassLoaders
Usuarios JabberUsuarios ClassLoader Jabber ClassLoader
Blaapps ClassLoader
Bootstrap ClassLoader
lib lib
Una forma de solucionarlo es encerrando a cada módulo en un hilo con su propio class loader.
![Page 48: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/48.jpg)
AISLAMIENTOClassLoaders
Usuarios JabberUsuarios ClassLoader Jabber ClassLoader
Blaapps ClassLoader
Bootstrap ClassLoader
lib lib
lib
Problema: ¿Qué pasa si blaapps utiliza una versión diferente de la librería?
![Page 49: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/49.jpg)
AISLAMIENTOClassLoaders
Usuarios JabberUsuarios ClassLoader Jabber ClassLoader
Blaapps ClassLoader
Bootstrap ClassLoader
lib lib
lib
Problema: ¿Qué pasa si blaapps utiliza una versión diferente de la librería?
![Page 50: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/50.jpg)
AISLAMIENTOClassLoaders
Usuarios JabberUsuarios ClassLoader Jabber ClassLoader
Blaapps ClassLoader
Bootstrap ClassLoader
lib lib
lib
Problema: ¿Qué pasa si blaapps utiliza una versión diferente de la librería?
![Page 51: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/51.jpg)
AISLAMIENTOClassLoaders
Usuarios JabberUsuarios ClassLoader Jabber ClassLoader
Blaapps ClassLoader
Bootstrap ClassLoader
lib lib
lib
Problema: ¿Qué pasa si blaapps utiliza una versión diferente de la librería?
![Page 52: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/52.jpg)
AISLAMIENTOIsolationClassLoader
Usuarios JabberUsuarios IsolationClassLoader
Jabber IsolationClassLoader
Blaapps IsolationClassLoader
Bootstrap ClassLoader
lib lib
lib
Solución: Creamos un classloader propio que invierta el orden en el que se buscan las clases.
![Page 53: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/53.jpg)
AISLAMIENTOIsolationClassLoader
Usuarios JabberUsuarios IsolationClassLoader
Jabber IsolationClassLoader
Blaapps IsolationClassLoader
Bootstrap ClassLoader
lib lib
lib
Solución: Creamos un classloader propio que invierta el orden en el que se buscan las clases.
![Page 54: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/54.jpg)
AISLAMIENTOIsolationClassLoader
Usuarios JabberUsuarios IsolationClassLoader
Jabber IsolationClassLoader
Blaapps IsolationClassLoader
Bootstrap ClassLoader
lib lib
lib
Solución: Creamos un classloader propio que invierta el orden en el que se buscan las clases.
![Page 55: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/55.jpg)
AISLAMIENTOIsolationClassLoader
Usuarios
Permisos
Usuarios IsolationClassLoader
Permisos IsolationClassLoader
Blaapps IsolationClassLoader
Bootstrap ClassLoader
Usuarios
UsuariosPermisos
Además, si un módulo depende de otro, su classloader mantiene sus clases, y una copia de las clases de otro módulo.Se tiene que forzar a los módulos a interactuar con sus interfaces públicos.Problema: ¿Qué pasa si se tiene que usar una misma versión de una clase en dos módulos?
![Page 56: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/56.jpg)
AISLAMIENTOSharedClassLoader
Usuarios
Permisos
Usuarios IsolationClassLoader
Permisos IsolationClassLoader
Usuarios
UsuariosPermisos
Shared ClassesUsuarios Shared Clases Permisos Shared Clases
Solución: Se mantiene un espacio de clases compartidas, donde el desarrollador puede publicar clases.Las clases compartidas sólo se cargan una vez en memoria.
![Page 57: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/57.jpg)
AISLAMIENTOSharedClassLoader
Usuarios
Permisos
Usuarios IsolationClassLoader
Permisos IsolationClassLoader
Usuarios
UsuariosPermisos
Shared ClassesUsuarios Shared Clases Permisos Shared Clases
Solución: Se mantiene un espacio de clases compartidas, donde el desarrollador puede publicar clases.Las clases compartidas sólo se cargan una vez en memoria.
![Page 58: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/58.jpg)
AISLAMIENTOSharedClassLoader
Usuarios
Permisos
Usuarios IsolationClassLoader
Permisos IsolationClassLoader
Usuarios
UsuariosPermisos
Shared ClassesUsuarios Shared Clases Permisos Shared Clases
Solución: Se mantiene un espacio de clases compartidas, donde el desarrollador puede publicar clases.Las clases compartidas sólo se cargan una vez en memoria.
![Page 59: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/59.jpg)
EntityManager em = new EntityManager(?????);
• ¿Quién gestiona la configuración?
INYECCIÓN DE DEPENDENCIAS
Si el desarrollador es el responsable de crear conexiones a la base de datos, también tiene que gestionar la configuración.Blaapps se encarga de crear conexiones a datos, pero, ¿cómo obtiene el desarrollador una?Uno de los retos de Blaapps ha sido facilitar la creación de este tipo de objetos.
![Page 60: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/60.jpg)
EntityManager em = Persistence.getEM();
INYECCIÓN DE DEPENDENCIAS
Inversión del control
Una Factoría.Problema: Genera código acoplado.
![Page 61: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/61.jpg)
EntityManager em;
public void setEm(EntityManager em) {! this.em = em;}
INYECCIÓN DE DEPENDENCIAS
Inversión del control
Inversión de control.Problema: ¿Cómo sabe Blaapps que tiene que inyectar?
![Page 62: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/62.jpg)
@PersistenceContextEntityManager em;
INYECCIÓN DE DEPENDENCIAS
Programación Orientada a Aspectos
Inyección de dependencias -> POAProblema: ¿Cómo hacer un set a ese campo?
![Page 63: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/63.jpg)
for (Field field : clazz.getDeclaredFields()) {! if (! ! field.isAnnotationPresent(PersistenceContext.class)!&&! ! EntityManager.class.isAssignableFrom(field.getType())! ) {! ! field.setAccessible(true);! ! field.set(obj, createEntityManager());! }}
INYECCIÓN DE DEPENDENCIAS
API Reflection
Solución: API Reflection
![Page 64: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/64.jpg)
NUEVAS INSTANCIASNotificando clases cargadas
ClassLoaderEjecuciónloadClass()
lib.jar
Blaapps necesita saber cuándo se cargan nuevas clases, y se crean nuevos objetos.De esta manera, registra componentes e inyecta campos.Blaapps sabe cuándo se carga una clase, se lo chiva el ClassLoader.El ClassLoader manda un mensaje cada vez que se carga una clase.
![Page 65: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/65.jpg)
NUEVAS INSTANCIASNotificando clases cargadas
ClassLoaderEjecuciónloadClass()
lib.jar
MessageQueue
classLoaded()
Blaapps necesita saber cuándo se cargan nuevas clases, y se crean nuevos objetos.De esta manera, registra componentes e inyecta campos.Blaapps sabe cuándo se carga una clase, se lo chiva el ClassLoader.El ClassLoader manda un mensaje cada vez que se carga una clase.
![Page 66: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/66.jpg)
NUEVAS INSTANCIASNotificando clases cargadas
ClassLoaderEjecuciónloadClass()
lib.jar
MessageQueue
classLoaded()
Deployer Deployer Deployer
Blaapps necesita saber cuándo se cargan nuevas clases, y se crean nuevos objetos.De esta manera, registra componentes e inyecta campos.Blaapps sabe cuándo se carga una clase, se lo chiva el ClassLoader.El ClassLoader manda un mensaje cada vez que se carga una clase.
![Page 67: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/67.jpg)
NUEVAS INSTANCIAS
?Notificando nuevas instancias
Pero... ¿Cómo sabemos cuándo se crea una instancia de un Objeto?No hay ninguna forma de saberlo.Bueno, una sí, si nos lo dice el propio objeto...
![Page 68: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/68.jpg)
NUEVAS INSTANCIASJavassist
ClassLoaderEjecuciónloadClass()
lib.jar
public class Class {! public Class(){
! }}
Javassist
inject()
Code
MessageQueue
newInsance()
En lugar de cargar en memoria la clase directamente, usaremos javassist.Javassist es una librería que nos permite alterar los bytecodes de una clase.Cada vez que se carga una clase, se añade un código al principio constructor.Cuando se ejecuta, se lanza una notificación de que se ha creado la instancia.
![Page 69: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/69.jpg)
NUEVAS INSTANCIASJavassist
ClassLoaderEjecuciónloadClass()
lib.jar
public class Class {! public Class(){
! }}
Javassist
inject()Code
En lugar de cargar en memoria la clase directamente, usaremos javassist.Javassist es una librería que nos permite alterar los bytecodes de una clase.Cada vez que se carga una clase, se añade un código al principio constructor.Cuando se ejecuta, se lanza una notificación de que se ha creado la instancia.
![Page 70: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/70.jpg)
Q & A
Conclusiones
Demo
Blaapps
Servidores de Aplicaciones
Demo T
ime!
![Page 71: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/71.jpg)
Q & A
Conclusiones
Demo
Blaapps
Servidores de Aplicaciones
![Page 72: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/72.jpg)
LO APRENDIDO
• Funcionamiento Interior de Java
• ClassLoaders
• Threads
• Programación orientada a Aspectos
• Integración continua
• Maven, JUnit, Bitten, Trac
![Page 73: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/73.jpg)
FUTURO
• Estabilidad
• Funcionalidad
• Comunidad
![Page 74: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/74.jpg)
• α → β → RC → GA
• Pruebas de unidad
• Librerías externas
FUTUROEstabilidad
Actualmente se considera que blaapps está en estado Alpha.Se plantea pasar a Beta en la siguiente versión.
![Page 75: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/75.jpg)
• Escritorio
•Web
• ¿Comunidad?
FUTUROFuncionalidad
La funcionalidad futura pasará por ampliar horizontes.Facilitar el desarrollo de todo tipo de aplicaciones. Servidor, web y Escritorio.Pero será la comunidad, aquellos que usen y desarrollen blaapps, los que decidan por dónde irá el proyecto.
![Page 76: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/76.jpg)
FUTUROComunidad
http://www.blaapps.org
La comunidad ya dispone de una página web donde colaborar.
![Page 77: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/77.jpg)
BLAAPPS
•Modular
• Ligero
• Rápido
• Fácil de utilizar
Blaapps es ligero y flexible. Y además utiliza tecnologías estándar.Migrar de Blaapps a un servidor mayor no es problema.Modificar Blapps para que escale no es problema.En definitiva, es ideal para proyectos que empiezan. Crea algo muy rápido, y luego hazlo crecer.
![Page 78: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/78.jpg)
BLAAPPS
•Modular
• Ligero
• Rápido
• Fácil de utilizar
STARTUPS
Blaapps es ligero y flexible. Y además utiliza tecnologías estándar.Migrar de Blaapps a un servidor mayor no es problema.Modificar Blapps para que escale no es problema.En definitiva, es ideal para proyectos que empiezan. Crea algo muy rápido, y luego hazlo crecer.
![Page 79: Blaapps - Servidor de Aplicaciones](https://reader033.vdocuments.net/reader033/viewer/2022060115/557af13ed8b42a25358b526e/html5/thumbnails/79.jpg)
Víctor Jiménez Cerrada [email protected]://www.blaapps.org
SERVIDOR DE APLICACIONES DISTRIBUIDAS
(BLAAPPS)
¡GRACIAS!