1.30.0 release notes
12th August 2024
🌟 New features
Outlier Detection for Connections: You can now use
OutlierDetectionto detect unhealthy connections and close them gracefully. #5751 #5763OutlierDetectingRule rule = OutlierDetectingRule .builder() .onServerError() .onException(IOException.class) .onException(WriteTimeoutException.class, OutlierDetectionDecision.FATAL) .build(); OutlierDetection outlierDetection = OutlierDetection .builder(rule) .counterSlidingWindow(Duration.ofSeconds(10)) .counterUpdateInterval(Duration.ofSeconds(1)) .failureRateThreshold(0.5) .build(); ClientFactory .builder() // Apply the OutlierDetection to detect and close unhealthy connections .connectionOutlierDetection(outlierDetection)Automatic value loader: You can now use an
AsyncLoaderto (re)load a value atomically, lazily and asynchronously. #5506 #5590Function<String, CompletableFuture<String>> loader = cache -> { ResponseEntity<String> response = client.prepare().get("/api/v1/items").asString().execute(); return response.thenApply(res -> res.content()); }; AsyncLoader<String> asyncLoader = AsyncLoader .builder(loader) .expireAfterLoad(Duration.ofSeconds(60)) .build(); asyncLoader.get().join();Configurable Response Timeout: You can now use
ResponseTimeoutModeto configure when a response timeout starts for a client. The timeout can be set when a request is started, a connection is acquired or a request is fully sent. #4591 #5793ClientFactory .builder() .responseTimeout(Duration.ofSeconds(5)) // A request will be timed out if the response is not fully received // within 5 seconds. .responseTimeoutMode(ResponseTimeoutMode.FROM_START) .build();Fallback File Extensions: You can now set fallback file extensions in
FileService. This feature is useful when you want to map a RESTful URI to a static resource file. #4542 #5806FileService .builder(rootDir) // '/app/projects' path could be mapped to '<rootDir>/app/projects.html' .fallbackFileExtensions("html") ...Sending Arbitrary Content in gRPC-JSON Transcoding: You can now use google.api.HttpBody to send arbitrary content in gRPC-JSON transcoding. #5311 #5400
rpc ArbitraryHttp(google.api.HttpBody) returns (google.api.HttpBody) { option (google.api.http) = { post: "/v1/arbitrary" }; }Zone-Aware Load Balancing:
XdsEndpointGroupnow supports zone-aware load balancing which prioritizes sending traffic to local zones. #5785 #5808WebSocketService Testing: You can now use
ServerExtension.webSocketClient()to testWebSocketService. #5538 #5765
📈 Improvements
- Armeria client now supports the
Expect: 100-continueheader. #5646 ClientRequestContext.cancel()now cancels the associated request immediately. #5800- The health checking behavior of
XdsEndpointGroupis more aligned with Envoy. #5785 - Subsets now
supports features available in the default load balancer of
XdsEndpointGroup#5801 - New headers from Guava have been added to
HttpHeaderNames. #5789 - Armeria is now compatible with Thrift 0.19 and 0.20.0 #5243 #5822
- Armeria client now silently ignores content instead of raising an exception when content exists for a status that indicates empty content. #5823
🛠️ Bug fixes
- Validation for URI's authority is relaxed to permit underscores (
_). #5814 #5854 - A user can send and receive an HTTP request whose
:pathcontains the following characters now: #5845- TAB (0x09)
- FS (0x1C)
- GS (0x1D)
- RS (0x1E)
- US (0x1F)
- Fixed a potential leak when sending compressed responses. #5858
ResteasyClientnow correctly releasesClientFactorywhen it is closed. #5833- Content decompression exceptions are now properly propagated. #5177 #5620
@Blockingnow correctly works with gRPC-Kotlin stubs #5295 #5399- Fixed
DocServicesidebar to occupy at most 40% of the window width. #5091 #5839 InputStreamcreated fromStreamMessage.toInputStream()now correctly raises an exception if the originalStreamMessageis closed with an exception. #5859ClientRequestContext.isTimedOut()now correctly returnstrueif a DNS query, a session creation or a write operation times out. #4935 #5156
📃 Documentation
☢️ Breaking changes
- Modified the behavior of
Endpoint.withAttrs()to merge the originalAttributeswith the new one. #5802- Instead,
Endpoint.replaceAttrs()is added to replace the entire attributes ofEndpoint.
- Instead,
⛓ Dependencies
- Curator 5.6.0 → 5.7.0
- Dropwizard Metrics 4.2.25 → 4.2.26
- Eureka 2.0.2 → 2.0.3
- GraphQL Kotlin 7.1.1 → 7.1.4
- gRPC Java 1.64.0 → 1.65.1
- Jackson 2.17.1 → 2.17.2
- Jetty 9.4.54 → 9.4.55, 11.0.20 → 11.0.22, 12.0.8 → 12.0.12
- Kafka client 3.7.0 → 3.8.0
- Kubernetes client 6.12.1 → 6.13.1
- Micrometer 1.13.0 → 1.13.2
- Micrometer Tracing 1.2.4 → 1.3.2
- Netty 4.1.110 → 4.1.112
- Prometheus 1.3.0 → 1.3.1
- Reactor 3.6.6 → 3.6.8
- Sangria 4.1.0 → 4.1.1
- Scala 3.4.1 - 3.4.2
- ScalaPB 0.11.15 → 0.11.17
- SLF4J 2.0.12 → 2.0.13
- Spring 6.1.8 → 6.1.11
- Spring Boot 3.3.0 → 3.3.2
- Tomcat 9.0.87 → 9.0.91, 10.1.20 → 10.1.26