v1.40.0
June 18, 2026
🌟 New features
- Outlier-Detecting Endpoint Group: You can now wrap any
EndpointGroupwithOutlierDetectingEndpointGroupto automatically eject failing endpoints from rotation using per-endpoint circuit breakers. #6224 #6757EndpointGroup delegate = ...;OutlierDetectingEndpointGroup group =OutlierDetectingEndpointGroup.builder(delegate).failureRateThreshold(0.3).circuitOpenWindow(Duration.ofSeconds(20))....build();WebClient client =WebClient.builder(SessionProtocol.HTTPS, group).decorator(group.asDecorator()) // 👈👈👈.build(); - Async gRPC Exception Handler:
GrpcExceptionHandlerFunctionnow supports asynchronous error handling viaGrpcExceptionHandlerFunction.applyAsync(). OverrideapplyAsync()to perform non-blocking work during gRPC error response handling. #6697 #6717GrpcService.builder().addService(myService).exceptionHandler(new GrpcExceptionHandlerFunction() {...@Overridepublic CompletableFuture<Status> applyAsync( // 👈👈👈RequestContext ctx, Status status,Throwable cause, Metadata metadata) {return myAsyncStatusMapping.check(status, cause);}}).build(); - Thrift 0.23.0 Support: Armeria now supports Apache Thrift 0.23.0 via the new
thrift0.23module. A newThriftProtocolDecoratorAPI lets you customize theTProtocolused for serialization and deserialization. For example, you can use Thrift 0.23'sTLegacyUuidProtocolDecoratorfor legacy UUID wire format compatibility. #6762ThriftProtocolDecorator decorator =ThriftProtocolDecorator.ofTProtocolDecorator(TLegacyUuidProtocolDecorator::new); // 👈👈👈THttpService service =THttpService.builder().addService(myHandler).protocolDecorator(decorator).build();ThriftClients.builder(uri).protocolDecorator(decorator).build(MyService.Iface.class); - Connection Acceptor: You can now accept or reject connections at the transport level
before any request processing begins using
ConnectionAcceptor. The newConnectionContextexposes TLS ClientHello metadata (SNI hostname, ALPN protocols) and per-connection attributes, enabling connection-level policies such as blocking by SNI or remote address. #6788Server.builder().connectionAcceptor(ConnectionAcceptor.of(ctx -> { // 👈👈👈return !"blocked.example.com".equals(ctx.sniHostname());})).build(); - xDS Credential Injector Filter: xDS extension factories can now build reactive filter
pipelines that depend on external resources like SDS secrets. The new
CredentialInjectorFilterFactoryinjects credentials from SDS-backed generic secrets into outgoing HTTP requests, supporting theenvoy.filters.http.credential_injectorfilter type. #6785 - Endpoints created by
KubernetesEndpointGroupnow carry their originatingPodandNodeas endpoint attributes. This can be retrieved viaKubernetesResourceAccess. #6814
📈 Improvements
- Fetching Athenz policies has been optimized by using ETags. When policies haven't changed, the server returns 304 Not Modified, avoiding redundant policy verification. #6780
🛠️ Bug fixes
StaticEndpointGroup.selectNow()no longer returnsnullwhenwhenReady()is complete and endpoints are available. #6786- Binary fields in
TTextProtocolnow correctly respectByteBufferposition and limit instead of serializing the entire backing array. #5768 #6773 GrantedOAuth2AccessToken.toString()no longer leaks OAuth2 access and refresh tokens in log output. #6787- xDS retry now correctly re-selects endpoints on each retry attempt. Previously, retries always reused the same endpoint because the retry decorator was placed after endpoint selection. #6798
☢️ Breaking changes
- Apache Thrift 0.23.0 changes the UUID wire format, breaking compatibility with older
Thrift peers. Use
TLegacyUuidProtocolDecoratorviaThriftProtocolDecoratorto restore the legacy behavior. #6762
⛓ Dependencies
- Athenz 1.12.40 → 1.12.42
- BlockHound 1.0.16.RELEASE → 1.0.17.RELEASE
- Dropwizard Metrics 4.2.38 → 4.2.39
- Jackson 2.21.3 → 2.22.0
- Javassist 3.21.0-GA → 3.31.0-GA
- Kotlin 2.3.21 → 2.4.0
- Kotlin Coroutines 1.10.2 → 1.11.0
- Kubernetes Client 7.6.1 → 7.7.0
- Logback 1.5.32 → 1.5.34
- MCP 1.1.2 → 1.1.3
- Micrometer 1.16.5 → 1.17.0
- Micrometer Tracing 1.6.5 → 1.7.0
- Netty 4.2.13.Final → 4.2.15.Final
- OkHttp 5.3.2 → 5.4.0
- Prometheus 1.6.1 → 1.7.0
- Protobuf 4.34.1 → 4.35.0
- Reactor 3.8.5 → 3.8.6
- Reactor Kotlin 1.3.0 → 1.3.1
- SLF4J 2.0.17 → 2.0.18
- Spring Framework 7.0.7 → 7.0.8
🙇 Thank you
This release was possible thanks to the following contributors who shared their brilliant ideas and awesome pull requests:







