1.30.0 release notes

12th August 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

📃 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