Http2 SpringBoot Jetty

52 views
Skip to first unread message

Alex

unread,
Feb 24, 2022, 2:22:55 AM2/24/22
to JUG Torino - JVM User Group Torino
Ciao,
volevo usare http2 con Conscrypt con un applicatiovo Spring boot 2.6.3 + jetty 9.4.44 (compreso in Spring Boot) + Azul jdk 17 Alpine e dopo aver configurato tutto,
aggiunto in Maven
<dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative-boringssl-static</artifactId>
      <version>2.0.0.Final</version>
</dependency>
... lancio e mi arriva :

ext.ApplicationContextException: Unable to start web server; nested exception is java.lang.IllegalStateException: An 'org.eclipse.jetty:jetty-alpn-*-server' dependency is required for HTTP/2 support.
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577) ~[spring-context-5.3.14.jar:5.3.14]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.2.jar:2.6.2]
        at it.eutelsat.sandvinereplicator.spring.Application.main(Application.java:29) ~[classes/:na]
 Caused by: java.lang.IllegalStateException: An 'org.eclipse.jetty:jetty-alpn-*-server' dependency is required for HTTP/2 support.
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.createAlpnServerConnectionFactory(SslServerCustomizer.java:156) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.createHttp2ServerConnector(SslServerCustomizer.java:142) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.createServerConnector(SslServerCustomizer.java:103) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.createConnector(SslServerCustomizer.java:88) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.customize(SslServerCustomizer.java:77) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.customizeSsl(JettyServletWebServerFactory.java:225) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getWebServer(JettyServletWebServerFactory.java:168) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:182) ~[spring-boot-2.6.2.jar:2.6.2]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:160) ~[spring-boot-2.6.2.jar:2.6.2]
        ... 8 common frames omitted
 Caused by: java.lang.IllegalStateException: No Server ALPNProcessors!
        at org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory.<init>(ALPNServerConnectionFactory.java:52) ~[jetty-alpn-server-9.4.44.v20210927.jar:9.4.44.v20210927]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer.createAlpnServerConnectionFactory(SslServerCustomizer.java:153) ~[spring-boot-2.6.2.jar:2.6.2]
        ... 16 common frames omitted
        Suppressed: java.lang.UnsatisfiedLinkError: /tmp/libconscrypt_openjdk_jni-linux-x86_6416443245032090000.so: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /tmp/libconscrypt_openjdk_jni-linux-x86_6416443245032090000.so)
                at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ~[na:na]
                at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388) ~[na:na]
                at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232) ~[na:na]
                at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:174) ~[na:na]
                at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389) ~[na:na]
                at java.base/java.lang.Runtime.load0(Runtime.java:755) ~[na:na]
                at java.base/java.lang.System.load(System.java:1953) ~[na:na]
                at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:52) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
                at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
                at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:297) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeLibraryLoader$1.run(NativeLibraryLoader.java:289) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
                at org.conscrypt.NativeLibraryLoader.loadLibraryFromHelperClassloader(NativeLibraryLoader.java:289) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:262) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeLibraryLoader.loadFromWorkdir(NativeLibraryLoader.java:201) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeLibraryLoader.load(NativeLibraryLoader.java:162) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:106) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:50) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:64) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:58) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:51) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.conscrypt.OpenSSLProvider.<init>(OpenSSLProvider.java:47) ~[conscrypt-openjdk-uber-2.5.2.jar:2.5.2]
                at org.eclipse.jetty.alpn.conscrypt.server.ConscryptServerALPNProcessor.init(ConscryptServerALPNProcessor.java:46) ~[jetty-alpn-conscrypt-server-9.4.44.v20210927.jar:9.4.44.v20210927]
                at org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory.<init>(ALPNServerConnectionFactory.java:72) ~[jetty-alpn-server-9.4.44.v20210927.jar:9.4.44.v20210927]
                ... 17 common frames omitted
  Suppressed: java.lang.UnsatisfiedLinkError: /tmp/libconscrypt_openjdk_jni-linux-x86_6416443245032090000.so: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /tmp/libconscrypt_openjdk_jni-linux-x86_6416443245032090000.so)
                        at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
                        at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:388)
                        at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:232)
                        at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:174)
                        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389)
                        at java.base/java.lang.Runtime.load0(Runtime.java:755)
                        at java.base/java.lang.System.load(System.java:1953)
                        at org.conscrypt.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:52)
                        at org.conscrypt.NativeLibraryLoader.loadLibraryFromCurrentClassloader(NativeLibraryLoader.java:318)
                        at org.conscrypt.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:273)
                        ... 27 common frames omitted

Cambiando distribuzione e mettendo Centos funziona che mi fa pensare fortemente che manca qualcosa che devo installare in Alpine
Usando Centos la mia immagine docker cresce da 141 Mb vs 265 MB e per uniformità di distribuzione con tutto il resto volevo cercare di tenere Alpine.


Qualcuno ha già fatto questa strada e mi sa dire i pacchetti da aggiungere alla Alpine per far funzionare il tutto ?
PS : Ho provato con Alpine e Spring boot a NON usare Conscrypt  ma la parte java di Jetty per http2 e tutto funziona.

Grazie e Buona giornata



Simone Bordet

unread,
Feb 24, 2022, 5:15:23 AM2/24/22
to Alex, JUG Torino - JVM User Group Torino
Ciao,

On Thu, Feb 24, 2022 at 8:22 AM 'Alex' via JUG Torino - JVM User Group
Torino <jugt...@googlegroups.com> wrote:
> Cambiando distribuzione e mettendo Centos funziona che mi fa pensare fortemente che manca qualcosa che devo installare in Alpine
> Usando Centos la mia immagine docker cresce da 141 Mb vs 265 MB e per uniformità di distribuzione con tutto il resto volevo cercare di tenere Alpine.
>
>
> Qualcuno ha già fatto questa strada e mi sa dire i pacchetti da aggiungere alla Alpine per far funzionare il tutto ?
> PS : Ho provato con Alpine e Spring boot a NON usare Conscrypt ma la parte java di Jetty per http2 e tutto funziona.

Nel PS dici "ma la parte... tutto funziona", il "ma" sembra indicare
un problema? Oppure tutto funziona?

Penso che sia solo un problema di Alpine (musl vs glibc).
Hai visto questo?
https://stackoverflow.com/questions/66963068/docker-alpine-executable-binary-not-found-even-if-in-path

La risposta sembra essere informativa anche per il tuo caso.

--
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless. Victoria Livschitz

Alex

unread,
Feb 24, 2022, 6:33:16 AM2/24/22
to Simone Bordet, JUG Torino - JVM User Group Torino
Ciao Simone,
la parte nel PS funziona ;-).
Domani provo a vedere se la soluzione che segnali funziona e vi faccio sapere.
Ti faccio una domanda perchè non ho avuto anche tempo di stressare la soluzione Conscrypt ... ci sono evidenti guadagni di performance vs quello fatto con la versione java  ?

Grazie molte


Simone Bordet

unread,
Feb 24, 2022, 7:28:17 AM2/24/22
to Alex, JUG Torino - JVM User Group Torino
Ciao,

On Thu, Feb 24, 2022 at 12:33 PM Alex <gandal...@yahoo.com> wrote:
>
> Ciao Simone,
> la parte nel PS funziona ;-).
> Domani provo a vedere se la soluzione che segnali funziona e vi faccio sapere.
> Ti faccio una domanda perchè non ho avuto anche tempo di stressare la soluzione Conscrypt ... ci sono evidenti guadagni di performance vs quello fatto con la versione java ?

Ci sono guadagni di performance e memory usage se usi Conscrypt, e non banali.

Detto questo, i benchmark che abbiamo fatto noi riguardavano solo TLS
(l'applicazione era triviale).
Se hai una app che spende tempo e CPU e I/O, i guadagni che puoi avere
da TLS vengono schiacciati e sinceramente non so se sia importante.
Di solito preferiamo fare offload di TLS in un proxy/loadbalancer e
lavorare in clear text.

Detto questo, in Conscrypt ci sono alcune funzionalità che mancano (se
non ricordo male, riguardo SNI) e il rischio che l'intera JVM vada in
crash perché fai chiamate a codice nativo, senza menzionare che il GC
lavora peggio (tante chiamate native), ecc.
Ti dico che abbiamo clienti che se menzioni "puoi usare questa
libreria nativa ..." ti guardano come se fossi impazzito (il rischio
di crash della JVM non è neanche da prendere in considerazione per
loro).

Alex

unread,
Feb 28, 2022, 4:31:35 AM2/28/22
to Simone Bordet, JUG Torino - JVM User Group Torino
Ciao,
aggiungendo

apk add gcompat

su Alpine ... http2 con conscrypt funziona alla grande.

Grazie dell'aiuto Simone

Buona giornata



Il giovedì 24 febbraio 2022, 11:15:24 CET, Simone Bordet <simone...@gmail.com> ha scritto:


Reply all
Reply to author
Forward
0 new messages