Skip to main content
info

You're seeing the release note of an old version. Check out the latest release note.

v1.30.0

August 12, 2024

🌟 New features

  • Outlier Detection for Connections: You can now use OutlierDetection to detect unhealthy connections and close them gracefully. #5751 #5763

    OutlierDetectingRule 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 AsyncLoader to (re)load a value atomically, lazily and asynchronously. #5506 #5590

    Function<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 ResponseTimeoutMode to 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 #5793

    ClientFactory
    .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 #5806

    FileService
    .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: XdsEndpointGroup now supports zone-aware load balancing which prioritizes sending traffic to local zones. #5785 #5808

  • WebSocketService Testing: You can now use ServerExtension.webSocketClient() to test WebSocketService. #5538 #5765

📈 Improvements

🛠️ Bug fixes

  • Validation for URI's authority is relaxed to permit underscores (_). #5814 #5854
  • A user can send and receive an HTTP request whose :path contains the following characters now: #5845
    • TAB (0x09)
    • FS (0x1C)
    • GS (0x1D)
    • RS (0x1E)
    • US (0x1F)
  • Fixed a potential leak when sending compressed responses. #5858
  • ResteasyClient now correctly releases ClientFactory when it is closed. #5833
  • Content decompression exceptions are now properly propagated. #5177 #5620
  • @Blocking now correctly works with gRPC-Kotlin stubs #5295 #5399
  • Fixed DocService sidebar to occupy at most 40% of the window width. #5091 #5839
  • InputStream created from StreamMessage.toInputStream() now correctly raises an exception if the original StreamMessage is closed with an exception. #5859
  • ClientRequestContext.isTimedOut() now correctly returns true if a DNS query, a session creation or a write operation times out. #4935 #5156

📃 Documentation

  • Added a gRPC reverse proxy server example. #2353 #5722

☢️ Breaking changes

⛓ 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

🙇 Thank you

This release was possible thanks to the following contributors who shared their brilliant ideas and awesome pull requests:

@trustin@seonWKim@patcher454@KarboniteKream@Dogacel@minwoox@Be-poz@jrhee17@injae-kim@thomasbruggink@moromin@kojilin@eottabom@ikhoon

Like Armeria?
Star us ⭐️

×