Java EE 7 en producción: Manteniendo las luces encendidas
Una
de las cosas más importantes que hacer en esta etapa del ciclo de vida
de Java EE es destacar las historias de adopción con éxito en una
cadencia regular. La comunidad ha estado haciendo eso por mucho tiempo, incluso en JavaOne. Varias de estas historias están curadas en Zeef.
Sayo
Oladeji recientemente acordó compartir una historia de adopción muy
genial sobre un sistema de misión crítica para Eko Electricity - uno de
los mayores proveedores de servicios públicos de Lagos. Sayo tenía una serie de cosas interesantes que decir acerca de Java EE vale la pena prestar atención. He destacado pasajes específicos que realmente se destacan.
¿Puede presentarse amablemente?
Soy Sayo Oladeji, ingeniero de software de Crown Interactive y cofundador de Hextremelabs. Comencé a programar hace sólo 10 años y, a través de los años, he
tenido oportunidades de trabajar en Java SE, ME y EE, y otros lenguajes
JVM, como Groovy y Kotlin, así como tecnologías no Java como C # y
Javascript.
Gestiono una gran cantidad de integraciones con sistemas de terceros
como motores de lotería, pasarelas de pago, sistemas de soporte
empresarial, etc.
¿Puede describir la aplicación que utiliza Java EE? ¿Que hace tu compañía?
Crown Interactive es un importante proveedor de tecnología en el espacio de servicios públicos en Nigeria. En
la actualidad ofrecemos la tecnología de gestión de ciclo de ingresos
(RCM) de extremo a extremo para EK Electricity Distribution PLC (EKEDP),
que sirve a la mitad de Lagos. Para
ponerlo en perspectiva, Lagos tiene una población de 21 millones (2016)
y el crecimiento de alrededor de 85 personas por hora! Además de los servicios públicos, también contamos con un sistema de
lotería, un servicio de medios bajo demanda y algunas otras
aplicaciones.
¿Por qué eligió Java EE?
Cuando comenzamos a construir nuestros sistemas, teníamos mucha experiencia en Java EE a bordo. Nuestro consultor también era un socio de JBoss. Java EE es un estándar probado y JBoss EAP nos proporciona muchas cosas fuera de la caja. Estos
incluyen soporte para servicios web, clustering, transacciones,
concurrencia, almacenamiento en caché, mensajería, así como un rico
ecosistema de herramientas; La mayoría siendo de código abierto. No fue una decisión muy difícil de tomar.
¿Cómo utiliza la aplicación Java EE?
Comenzamos a construir el sistema de una manera multi-arrendatario, orientado al servicio desde el primer día. Ahora estamos rompiendo algunos de los módulos en microservicios a medida que surgen las necesidades.
Usamos JAX-WS muy fuertemente debido al tipo de integraciones que hacemos. JAX-WS
+ NetBeans hace que las integraciones de SOAP sean una experiencia
agradable, probablemente aún más agradable y definitivamente más rápida
que REST debido a la naturaleza de auto-documentación de SOAP (WSDL). Las cadenas de manipuladores nos permiten realizar preocupaciones
transversales como leer sobres SOAP entrantes y extraer metadatos como
información de autenticación e inquilino.
Utilizamos JPA a través del tablero para el acceso de datos.
Utilizamos JMS para una comunicación fiable y poco acoplada entre
servicios con ActiveMQ como intermediario de mensajes y un adaptador de
recursos instalado para WildFly para que WildFly administre las
conexiones con el intermediario.
Utilizamos JAX-RS para las API de REST, que respaldan nuestra interfaz web AngularJS.
Utilizamos EJB para manejar nuestra lógica empresarial básica y también para la comunicación entre nuestros microservicios. Por ejemplo, nuestro portal unificado de colecciones (UCG) es un módulo compuesto por 8 microservicios. Una de ellas publica un EJB que coordina las interacciones entre las restantes. La relación jerárquica entre estos módulos también está bien
representada en el código fuente como un proyecto Maven multi-módulo.
Sobre todo, utilizamos CDI en gran medida. Por ejemplo, nuestras configuraciones se gestionan de forma centralizada en una base de datos. Leemos
esto en un caché Infinispan (envíos con WildFly) en el inicio, y de
ahí, los productores de CDI los inyectan en frijoles usando
calificadores. Esto se hace de una manera segura. El C en CDI es la cosa más fresca. Los miembros del frijol se inyectan basados en el contexto, muy importante para un sistema multi-tenant. Un
filtro JAX-RS o una cadena de manejadores JAX-WS configura información
contextual antes de que la ejecución llegue a nuestros beans y los
productores que estén adaptados al contexto inyecten configuración
específica del contexto. No queremos facturar al socio equivocado ni cargar la plantilla de mensaje incorrecto, por ejemplo.
¿Cómo fue su experiencia general con Java EE? ¿Lo usarías de nuevo?
Mi experiencia general con Java EE ha sido muy buena. Java EE + Maven + NetBeans + IntelliJ IDEA es una combinación realmente buena. Existen plugins adecuados para configurar nuestro servidor y manejar
nuestras implementaciones, generar documentos API desde los puntos
finales REST, generar entidades JPA desde el esquema de la base de datos
y así sucesivamente.
Es
muy rápido y fácil conseguir un proyecto de trabajo en funcionamiento
con Java EE 7. Casi todo es POJO y orientado a anotaciones y los
archivos WAR generados son pequeños. EE 7 es de hecho ligero. Antes de usar un servidor completo de Java EE, he usado plataformas
basadas en Java como AppEngine y Tomcat, pero generalmente he encontrado
que los servidores EE completos como WildFly son mucho más productivos.
De
hecho, con el complemento WildFly Maven + plugin Docker, es muy fácil
hacer un entorno totalmente funcional y preparado para la nube desde el
archivo pom.xml mvn clean install –P prod.
Esto también es excelente para el propósito de la documentación. Simplemente mirando las fuentes, puede decir con confianza cómo se va a ejecutar la aplicación. He tenido un gran tiempo en desarrollo con Java EE 7, y voy a hacer nuevos proyectos con él.
El lenguaje de programación Java
Java - una isla de Indonesia, un tipo de café, y un lenguaje de programación. Tres significados muy diferentes, cada uno en diferentes grados de importancia. La mayoría de los programadores, sin embargo, están interesados en el lenguaje de programación Java. En tan sólo unos pocos años (desde finales de 1995), Java ha tomado la comunidad de software por la tormenta. Su éxito fenomenal ha convertido a Java en el lenguaje de programación de más rápido crecimiento jamás visto. Hay un montón de bombo sobre Java, y lo que puede hacer. Muchos programadores y usuarios finales están confundidos acerca de lo que es exactamente, y lo que Java ofrece.
Java es un lenguaje revolucionario
Las propiedades que hacen que Java sea tan atractivo están presentes en otros lenguajes de programación. Muchos idiomas son ideales para ciertos tipos de aplicaciones, incluso más que Java. Pero Java reúne todas estas propiedades en un solo idioma. Este es un avance revolucionario para la industria del software.
Echemos un vistazo a algunas de las propiedades con más detalle:
- orientado a objetos
- portátil
- Multihilo
- Recogida automática de basura
- seguro
- Red y "Internet" consciente
- Simplicidad y facilidad de uso
Orientado a objetos
Muchos lenguajes antiguos, como C y Pascal, eran lenguajes procedurales. Los procedimientos (también llamados funciones) eran bloques de código que formaban parte de un módulo o aplicación. Los
procedimientos pasaron parámetros (tipos de datos primitivos como
números enteros, caracteres, cadenas y números de coma flotante). El código fue tratado por separado para los datos. Tuvieron que pasar alrededor de las estructuras de datos, y los procedimientos podrían modificar fácilmente su contenido. Esto fue una fuente de problemas, ya que partes de un programa podrían tener efectos imprevistos en otras partes. Seguimiento de qué procedimiento fue culpable desperdició una gran
cantidad de tiempo y esfuerzo, sobre todo con los grandes programas.
En algún lenguaje de procedimiento, incluso podría obtener la ubicación de memoria de una estructura de datos. Armado con esta ubicación, podría leer y escribir en los datos más adelante o sobrescribir accidentalmente el contenido.
Java es un lenguaje orientado a objetos. Un lenguaje orientado a objetos se ocupa de objetos. Los objetos contienen datos (variables de miembro) y código (métodos). Cada
objeto pertenece a una clase particular, que es un plano que describe
las variables miembro y los métodos que ofrece un objeto. En Java, casi todas las variables son un objeto de algún tipo u otro - incluso cadenas. La programación orientada a objetos requiere una forma diferente de
pensar, pero es una mejor manera de diseñar software que la programación
de procedimientos.
Hay muchos lenguajes orientados a objetos populares disponibles hoy en día. Algunos como Smalltalk y Java están diseñados desde el principio para estar orientados a objetos. Otros, como C ++, están parcialmente orientados a objetos y parcialmente procesales. En C ++, todavía puede sobrescribir el contenido de estructuras de datos y objetos, haciendo que la aplicación se bloquee. Afortunadamente, Java prohíbe el acceso directo a los contenidos de la memoria, lo que lleva a un sistema más robusto.
Portátil
La
mayoría de los lenguajes de programación están diseñados para un
sistema operativo y una arquitectura de procesador específicos. Cuando
el código fuente (las instrucciones que componen un programa) se
compilan, se convierte en código de máquina que se puede ejecutar sólo
en un tipo de máquina. Este proceso produce código nativo, que es extremadamente rápido.
Otro tipo de lenguaje es el que se interpreta. El código interpretado es leído por una aplicación de software (el intérprete), que realiza las acciones especificadas. El código interpretado a menudo no necesita ser compilado - se traduce como se ejecuta. Por esta razón, el código interpretado es bastante lento, pero a
menudo portátil a través de diferentes sistemas operativos y
arquitecturas de procesador.
Java toma lo mejor de ambas técnicas. El código Java se compila en un código de máquina neutral de la plataforma, que se llama Java bytecode. Un tipo especial de intérprete, conocido como Java Virtual Machine (JVM), lee el bytecode y lo procesa. La Figura 1 muestra un desmontaje de una pequeña aplicación Java. El
bytecode, indicado por la flecha, se representa en forma de texto aquí,
pero cuando se compila se representa como bytes para conservar el
espacio.
El enfoque de Java ofrece algunas grandes ventajas sobre otros lenguajes interpretados. En
primer lugar, el código fuente está protegido de la vista y la
modificación - sólo el bytecode debe ponerse a disposición de los
usuarios. En
segundo lugar, los mecanismos de seguridad pueden escanear bytecode
para detectar signos de modificación o código dañino, complementando los
otros mecanismos de seguridad de Java. Sin
embargo, lo más importante es que el código Java se puede compilar una
vez y ejecutarse en cualquier combinación de máquina y sistema operativo
que admita una máquina virtual Java (JVM). Java puede funcionar en Unix, Windows, Macintosh, e incluso el piloto de la palma. Java puede incluso ejecutarse dentro de un navegador web, o un servidor web. Ser
portátil significa que la aplicación sólo tiene que ser escrita una vez
- y luego puede ejecutarse en una gama más amplia de máquinas. Esto ahorra mucho tiempo y dinero.
Multihilo
Si
alguna vez ha escrito aplicaciones complejas en C, o PERL,
probablemente habrá encontrado el concepto de múltiples procesos antes. Una aplicación puede dividirse en copias independientes, que se ejecutan simultáneamente. Cada copia replica código y datos, lo que resulta en un mayor consumo de memoria. Obtener las copias para hablar juntos puede ser complejo y frustrante. La creación de cada proceso implica una llamada al sistema operativo, que también consume tiempo de CPU adicional.
Un mejor modelo es utilizar múltiples subprocesos de ejecución, conocidos como subprocesos para abreviar. Los hilos pueden compartir datos y código, facilitando el intercambio de datos entre instancias de subprocesos. También utilizan menos memoria y sobrecarga de la CPU. Algunos lenguajes, como C ++, tienen soporte para los subprocesos, pero son complejos de usar. Java tiene soporte para múltiples subprocesos de ejecución construidos directamente en el lenguaje. Los hilos requieren una manera diferente de pensar, pero se pueden entender muy rápidamente. Soporte de subprocesos en Java es muy simple de usar, y el uso de subprocesos en aplicaciones y applets es bastante común.
Recolección automática de basura
No, no estamos hablando de sacar la basura (aunque una computadora que literalmente podría hacer que sería algo ordenado). El término recolección de basura se refiere a la recuperación del espacio de memoria no utilizado. Cuando las aplicaciones crean objetos, la JVM asigna espacio de memoria para su almacenamiento. Cuando el objeto ya no es necesario (no existe ninguna referencia al
objeto), el espacio de memoria se puede recuperar para su uso posterior.
Los idiomas como C + + obligan a los programadores a asignar y desasignar la memoria de datos y objetos manualmente. Esto agrega complejidad adicional, pero también causa otro problema - pérdidas de memoria. Cuando los programadores olvidan desasignar memoria, la cantidad de memoria libre disponible se disminuye. Los programas que con frecuencia crean y destruyen objetos pueden eventualmente descubrir que no queda memoria. En Java, el programador está libre de tales preocupaciones, ya que la JVM realizará la recolección automática de objetos basura.
Seguro
La seguridad es un gran problema con Java. Dado que los applets de Java se descargan de forma remota y se ejecutan en un navegador, la seguridad es una gran preocupación. No querríamos que los applets lean nuestros documentos personales, eliminen archivos o causen daño. En
el nivel de API, hay fuertes restricciones de seguridad en el acceso a
archivos y redes para applets, así como el soporte de firmas digitales
para verificar la integridad del código descargado. En el nivel de bytecode, se realizan comprobaciones para hacks obvios, como manipulación de pila o bytecode no válido. Los
fuertes mecanismos de seguridad en Java ayudan a proteger contra
violaciones inadvertidas o intencionales de seguridad, pero es
importante recordar que ningún sistema es perfecto. El
eslabón más débil de la cadena es la máquina virtual Java en la que se
ejecuta: una JVM con conocidas debilidades de seguridad puede ser
propensa a atacar. También vale la pena señalar que, si bien ha habido algunas
deficiencias identificadas en JVM, son raras, y por lo general se fijan
rápidamente.
Red y "Internet" consciente
Java fue diseñado para ser "Internet" consciente, y para apoyar la programación de red. La API de Java proporciona un amplio soporte de red, desde sockets y direcciones IP, a URL y HTTP. Es extremadamente fácil escribir aplicaciones de red en Java, y el código es completamente portátil entre plataformas. En lenguajes como C / C ++, el código de red debe ser reescrito para diferentes sistemas operativos, y suele ser más complejo. El soporte de red de Java ahorra mucho tiempo y esfuerzo.
Java
también incluye soporte para una programación de red más exótica, como
la invocación de métodos remotos (RMI), CORBA y Jini. Estas tecnologías de sistemas distribuidos hacen de Java una opción atractiva para sistemas distribuidos grandes.
Simplicidad y facilidad de uso
Java extrae sus raíces del lenguaje C ++. C ++ es ampliamente utilizado, y muy popular. Sin
embargo, se considera un lenguaje complejo, con características como
herencia múltiple, plantillas y punteros que son contraproducentes. Java, por otro lado, está más cerca de un lenguaje "puro" orientado a objetos. El acceso a los punteros de memoria se elimina, y las referencias de objeto se utilizan en su lugar. Se ha eliminado el soporte para la herencia múltiple, lo que se presta a diseños de clase más claros y más sencillos.La
biblioteca de E / S y de red es muy fácil de usar, y la API de Java
proporciona a los desarrolladores mucho código de ahorro de tiempo (como
redes y estructuras de datos). Después de usar
Java por un tiempo, la mayoría de los desarrolladores se resisten a
volver a otros idiomas, debido a la sencillez y elegancia de Java.
Resumen
Java ofrece a los desarrolladores muchas ventajas. Mientras que la mayoría de estos están presentes en otros idiomas, Java combina todos estos juntos en un solo idioma. El rápido crecimiento de Java ha sido nada menos que fenomenal, y no muestra signos (¡aún!) De desaceleración. En la columna del mes que viene, hablaré más sobre el corazón de Java: la Máquina Virtual Java.