13 framework Java per microservizi solidi

È stato un lungo viaggio per Java, un linguaggio che è iniziato come lingua franca per la scatola in cima al televisore nei giorni in cui i televisori non erano dotati di Roku o Chromecast integrati. Quindi Java avrebbe posseduto il World Wide Web animando il browser prima che JavaScript arrivasse e lo allontanasse di mano.

Java ha finito per trovare una nicchia nelle server farm, dove una volta c'erano abbastanza diverse architetture di chip e sistemi operativi da rendere convincente la "promessa di scrittura una volta eseguito ovunque". E in quelle server farm in cui Java è sopravvissuto, uno dei preferiti dai negozi IT aziendali dipendenti dall'affidabilità e dagli sviluppatori che amano la digitazione forte.

Nel frattempo, JavaScript in generale e Node.js in particolare hanno sfidato Java sul server, utilizzando il loro elevato throughput e la velocità senza thread per assumere una parte enorme del traffico sul web. Node ha catturato l'immaginazione dei più recenti programmatori lato server offrendo non solo velocità ed efficienza delle risorse, ma anche la semplicità del codice che viene eseguito sia sul client che sul server.

Eppure, nonostante l'aumento della concorrenza, Java continua non solo a sopravvivere, ma ad eccellere. Molti dei team incaricati di sviluppare architetture di microservizi continuano a utilizzare Java. Uno dei motivi principali deve essere perché la tecnologia è stata testata in battaglia da anni in prima linea nell'analisi delle richieste HTTP. Sun ha creato una macchina virtuale solida come una roccia e Oracle continua a nutrirla e supportarla.

Un altro motivo deve essere la continua evoluzione della lingua. Java 8 offre un solido supporto per i linguaggi funzionali come Scala e Kotlin. La JVM è ora una base per molti dei migliori esperimenti nello sviluppo del linguaggio del computer. Decine di nuovi linguaggi possono essere compilati fino al codice byte Java e collegarsi tra loro per far funzionare insieme progetti complessi. Molti degli stack che funzionano senza problemi su una JVM possono essere costruiti da una combinazione di Java e una serie di altri linguaggi.

La ragione principale, tuttavia, deve essere la pura inerzia. Mentre scrivo, 371 lavori per programmatori COBOL sono elencati su Dice. Ci sono molti, molti altri lavori con la parola Java al loro interno. È una sorpresa che i team intelligenti stiano osservando le loro enormi pile di codice Java obsoleto e pensando che la soluzione più semplice sia semplicemente aggiungere una porta secondaria che sputa i dati come strutture dati JSON? Ecco. Il vecchio codice continua a funzionare, ma agisce come un moderno microservizio su queste porte laterali.

Tutte queste opzioni e molte altre assicurano che Java continui a svolgere un ruolo forte e vitale nella rivoluzione dei microservizi. E non sorprende che la comunità open source di Java abbia seguito, creando molte nuove opzioni per i programmatori Java che devono insegnare al loro codice Java a parlare come un microservizio.

Di seguito è riportato un elenco di 13 opzioni open source che gli sviluppatori Java utilizzano per realizzare soluzioni che costituiscono la base delle architetture di microservizi ovunque.

Spring Boot

Il mondo Java crea applicazioni Spring da molto tempo. Spring Boot è una versione particolare di Spring che semplifica notevolmente il processo gestendo molti dettagli di configurazione per te. Spring Boot è stato creato per automatizzare l'avvio di progetti Spring di qualsiasi tipo, non solo microservizi. Per rendere le cose ancora più semplici, una volta che hai finito con l'applicazione, Spring Boot si mescola in un server web e sputa un singolo file JAR che è praticamente tutto ciò di cui hai bisogno tranne la JVM. Consideralo come il contenitore Docker originale.

Tutta questa intelligenza è apprezzata da molte delle persone incaricate di creare microservizi perché tutta la configurazione diventa fastidiosa quando devi farlo più e più volte per ciascuna delle dozzine di microservizi. Se Spring Boot può automatizzarlo, sfornare diverse dozzine di microservizi è molto più semplice.

I microservizi sviluppati con Spring seguono la stessa filosofia MVC delle applicazioni web macro che costruiamo da anni. Il framework gode di tutte le connessioni profonde costruite in anni di sviluppo Java, inclusa l'integrazione con tutti gli archivi dati principali e secondari, i server LDAP e gli strumenti di messaggistica come Apache Kafka. Ci sono anche dozzine di piccole e non così poche funzionalità per mantenere in esecuzione una raccolta di server, funzionalità come Spring Vault, uno strumento per mantenere i segreti, le password e le credenziali necessarie ai server in produzione. Tutti questi vantaggi mostrano perché i programmatori Java si uniscono al carrozzone da molti anni.

Eclipse MicroProfile

Nel 2016, alcuni fan della comunità Java Enterprise si sono guardati intorno e hanno deciso di ripulire tutto il cruft da Java Enterprise Edition in modo che le persone potessero creare semplici microservizi con le parti classiche. Hanno buttato fuori un numero sorprendente di librerie, ma hanno mantenuto il codice per l'elaborazione delle richieste REST, l'analisi di JSON e la gestione dell'inserimento delle dipendenze. Quello che hanno ottenuto, soprannominato Eclipse MicroProfile, è stato veloce e semplice.

Da allora la comunità di MicroProfile ha stretto un patto per rilasciare nuove versioni ogni trimestre, aggiungendo al contempo nuovo codice per mantenere i microservizi funzionanti in modo fluido e sicuro. Il processo di sviluppo e la struttura del codice saranno molto familiari a chiunque abbia vissuto nel mondo Java EE, ma gli infiniti problemi di configurazione sono stati eliminati. È la prova che puoi insegnare ai vecchi cani nuovi trucchi.

Dropwizard

Quando Dropwizard è apparso nel 2011, ha aperto gli occhi agli sviluppatori di Java Enterprise su quanto poco codice fosse davvero necessario. Il framework Dropwizard ha fornito un modello di sviluppo molto semplice con molte delle decisioni importanti prese per te e ha continuato a seguire questo percorso. Aggiungi un po 'di logica aziendale e poi praticamente tutto il resto è configurato per te secondo la convenzione. Il risultato sono file JAR sottili che gli utenti apprezzano per l'avvio rapido.

La limitazione più grande potrebbe essere la mancanza di iniezione di dipendenza. Se vuoi usare l'inserimento delle dipendenze per mantenere il tuo codice pulito e liberamente accoppiato, dovrai aggiungere tu stesso le librerie. Non esiste un modo Dropwizard per farlo, a differenza del mondo Spring. La maggior parte degli altri articoli di lusso, tuttavia, sono ora supportati, inclusi registrazione, controlli sanitari e codice che fornisce resilienza. Non avrai bisogno di fare troppi sacrifici.

WildFly Thorntail

La gente di Red Hat ha creato la propria versione di MicroProfile completa di un ottimo strumento di configurazione. Il framework era originariamente chiamato WildFly Swarm, ma poi è stato ribattezzato Thorntail. Il sito Web Thorntail ti aiuta a creare il tuo file di build Maven semplicemente specificando le funzionalità di cui hai bisogno. Maven poi si occupa di montare il tutto.

Thorntail rileverà anche i componenti principali di cui avrai bisogno scansionando il tuo codice, ma puoi sovrascriverlo con un file BOM (distinta base). Quando sarà tutto in esecuzione, Thorntail eliminerà le parti di Java Enterprise Edition che non verranno utilizzate e creerà un file JAR piccolo e pronto per essere distribuito con un solo comando, una funzionalità che consente al progetto Thorntail di chiamarlo Uber -VASO. È un altro approccio per seguire la tradizione della Java Enterprise Edition senza tenere tutto il bagaglio pesante.

Helidon

Helidon è uscito solo da pochi mesi dai comunicati stampa e dal primo impegno nel repository GitHub, ma il framework sta già attirando il tipo di attenzione che il supporto di Oracle garantisce. Sebbene l'universo Java sia enorme, in gran parte ruota ancora attorno a Oracle. 

Gli architetti di Helidon hanno seguito molti degli stessi temi che si ripetono negli altri progetti qui. Elimina il cruft di Java Enterprise Edition e mantieni il core leggero e basato su servlet che si è guadagnato la fiducia del mondo. Nel caso di Helidon, gli sviluppatori hanno iniziato con Netty e hanno aggiunto codice appena sufficiente per eseguire il routing e la gestione degli errori. Per rendere le cose interessanti, hanno abbracciato due modelli di base per il codice, le cosiddette versioni SE e MP.

Helidon SE sembrerà molto familiare ai programmatori di Node.js con le lunghe catene di chiamate di funzioni unite da punti. Helidon MP sembrerà più familiare ai programmatori Java che utilizzano JAX-RS. Esistono anche alcuni strumenti utili e apprezzati per controllare lo stato di salute dei server o tracciare il flusso di dati attraverso una foresta di microservizi. Questi sono validi motivi per esplorare il potenziale, anche senza il supporto di Oracle.  

Cricket

Un altro framework per lo sviluppo rapido di API è Cricket. Cricket è piccolo nonostante includa diversi extra come un archivio dati di valori-chiave per evitare di connettere un database e uno scheduler per controllare l'elaborazione ripetitiva in background. Non ci sono altre dipendenze che aggiungono complicazioni o lock-in, quindi è abbastanza facile aggiungere il tuo codice a Cricket e avviare un microservizio indipendente.

Jersey

Uno degli approcci standard allo sviluppo di un servizio Web è l'API Java per i servizi Web RESTful (alias JAX-RS), una specifica generale che è stata implementata nel framework Jersey. L'approccio dipende in gran parte dall'utilizzo delle annotazioni per specificare la mappatura del percorso e i dettagli di ritorno. Tutto il resto dall'analisi dei parametri e dal confezionamento del JSON è gestito da Jersey.

Il vantaggio principale di Jersey è che implementa lo standard JAX-RS, una caratteristica abbastanza desiderabile che alcuni sviluppatori combinano Jersey con Spring Boot per goderne entrambi insieme. 

Giocare

Uno dei modi migliori per sperimentare la potenza cross-language della JVM è con il framework Play, una pila di codice Scala che si collega a Java o ad uno qualsiasi degli altri linguaggi JVM. La base è molto moderna, con un modello asincrono e senza stato che non sovraccarica il server con thread infiniti che cercano di tenere traccia degli utenti e dei loro dati di sessione. Ci sono anche una serie di funzionalità extra che possono essere utilizzate per arricchire un sito Web come OpenID, convalida e supporto per il caricamento di file.

La base di codice di Play si è evoluta per più di un decennio, quindi troverai anche echi di tempi dimenticati da tempo come il supporto per XML. Il gioco è sia maturo che agile, una combinazione che può essere rara in natura.

Spavalderia

Costruire un'API può sembrare semplice come scrivere del codice che ascolta su una porta e fornisce risposte, ma gli sviluppatori di Swagger chiedono di essere differenti. Hanno creato un intero linguaggio di specifica API chiamato OpenAPI che puoi utilizzare per precisare cosa farà l'API. Questo può sembrare un passaggio aggiuntivo, ma il team di Swagger ha anche fornito il codice che trasforma questa specifica in test automatizzati, documentazione e altro.

La descrizione semplice e quasi spartana di un'API nel file di configurazione Swagger viene trasformata in codice Java per implementare l'interfaccia, documentare come si comporta e fornire una serie di strumenti per testare il codice costruito al di sotto di essa. Esiste persino un meccanismo per la governance delle API in modo da poter lavorare con le masse non lavate che presto busseranno alla porta della tua API e si aspettano risposte.

Swagger è un ecosistema per le API e non è limitato a Java. Se il tuo team si sposta su Node.js o in una qualsiasi delle decine di altre lingue, c'è un modulo Swagger Codegen in attesa di convertire la tua specifica OpenAPI in un'implementazione in quella lingua.

Restlet

Una delle maggiori differenze tra i vari framework è il numero di connessioni ad altri servizi e biblioteche. Il progetto Restlet offre una delle più ampie raccolte di funzionalità e connessioni. È già integrato con librerie come JavaMail, nel caso in cui il tuo microservizio debba parlare POP, IMAP o SMTP a qualche server di posta e Lucene / Solr, nel caso in cui desideri creare indici ricercabili di grandi blocchi di testo e i metadati avvolti esso.

Le possibilità in Restlet continuano semplicemente perché questo stack generalmente supporta diverse opzioni per ogni parte. Non è necessario utilizzare JSON, ad esempio, perché il codice gestirà XML, CSV, YAML e alcuni altri formati di file. Hai anche diverse opzioni per i modelli per strutturare la tua risposta. Una delle funzionalità extra più ordinate è il client Restlet, che ti consente di testare le tue API dal browser Chrome.

Schiacciare

Il debug dei microservizi è spesso una vera sfida perché le parti sono accoppiate in modo così lasco ed è difficile tenere traccia del flusso di dati attraverso tutti i livelli del sistema. Squash ti consente di impostare punti di interruzione nel codice in esecuzione su un cluster Kubernetes e quindi ricevere tutti i dati nel tuo IDE come se fosse codice in esecuzione localmente. Squash si integra anche con i runtime Node.js e Python nel caso in cui la tua raccolta di microservizi non sia solo Java.

Telepresenza

Un'altra opzione per il debug consiste nell'usare Telepresence per creare un proxy locale per un microservizio su un cluster Kubernetes distante. Le tue chiamate per questo servizio verranno deviate alla versione locale dove puoi impostare punti di interruzione o fare qualsiasi altra cosa tu possa immaginare sulla tua macchina locale.

Zipkin

Zipkin è un meccanismo per registrare gli eventi su vari microservizi e quindi correlare gli eventi in modo che i problemi possano essere isolati e studiati mentre si propagano nella raccolta di macchine. C'è un'implementazione Zipkin per Java e almeno altri sei linguaggi in modo che i sistemi multilingue possano essere affrontati. Alcuni dei framework più sofisticati come Spring hanno già Zipkin integrato in qualche forma.