1.2.0 release notes

22nd October 2020

🌟 New features

  • You can now bind a GrpcService to a custom route path. #3072 #3083 This is useful if you want to serve an unframed gRPC service with RESTful routes.

    ServerBuilder sb = ...
    sb.service(GrpcService.builder()
                          // Bind 'getProfile()' method to '/v1/api/users/profile'
                          .addService("/v1/api/users/profile", userService,
                                      UserServiceGrpc.getProfile())
                          // Bind 'getFriends()' method to '/v1/api/users/friends'
                          .addService("/v1/api/users/friends", userService,
                                      UserServiceGrpc.getFriends())
                          .build());
  • You can now use DecodingService for decoding a compressed request. #1521 #3087

  • You can now use HttpResponse.ofRedirect() for easily sending a redirect response. #914 #3059

    // The status is HttpStatus.TEMPORARY_REDIRECT.
    HttpResponse.ofRedirect("/new-location");
    HttpResponse.ofRedirect("/new-location/%s", someVar);
    // Redirect with the specified redirection status.
    HttpResponse.ofRedirect(HttpStatus.MOVED_PERMANENTLY, "/new-location");
  • You can now choose a path when a Thrift/gRPC service has more than one path in the DocService. #2167 #3024

  • You can now cancel a service's request or client's response with CancellationException or any Throwable using RequestContext.cancel() or RequestContext.cancel(Throwable). #3046 #3080

    ClientRequestContext cctx = ...;
    // Cancel a client's response with ResponseCancellationException
    cctx.cancel();
    cctx.cancel(new RuntimeException("A custom error message"));
    
    ServiceRequestContext sctx = ...;
    // Cancel a service's request with RequestCancellationException
    sctx.cancel();
    sctx.cancel(new RuntimeException("A custom error message"));

📈 Improvements

  • Do not launch two servers if both armeria-spring-boot2-autoconfigure and armeria-spring-boot2-webflux-autoconfigure are in the class path. #3056 #3102
  • You no longer see a previously selected input when the input box of Go to menu is clicked. #3095

🛠️ Bug fixes

  • You now get proper 404 Not Found status when routeDecorator() is used and the endpoint of the request doesn't exist. #3120
  • You no longer see duplicated MDC keys anymore when armeria-logback is applied. #3044 #3105
  • You can now get the normal response even though the request is not fully sent. #3115
  • You can now use milliseconds as an interval unit in EurekaEndpointGroup. #3108
  • You no longer see UNKNOWN error code while sending stream messages with Reactive gRPC stub. #3090 #3099
  • TTEXT_NAMED_ENUM now correctly serializes enums when used inside maps. #3091
  • BraveClient and BraveService do not override the default (Client|Server)(Request|Response)Parser anymore. #3023 #3111
  • Armeria client now sets the default path(/) properly if a path is empty. #3098
  • You no longer see an outdated JS bundle in the browser when the DocService page is rebuilt. #3094

🏚️ Deprecations

  • The following methods have been deprecated in favor of their millis-accepting versions: #3108
    • registryFetchIntervalSeconds()
    • leaseDurationSeconds()
    • renewalIntervalSeconds()
  • The following methods have been deprecated in favor of their *Cancelling and *Cancelled versions: #3080
    • whenResponseTimingOut()
    • whenResponseTimedOut()
    • whenRequestTimingOut()
    • whenRequestTimedOut()

⛓ Dependencies

  • Brave 5.12.6 → 5.12.7
  • Caffeine 2.8.5 → 2.8.6
  • Dropwizard 1.3.24 → 1.3.25
  • Dropwizard Metrics 4.1.12.1 → 4.1.13
  • Eureka 1.9.26 → 1.10.7
  • gRPC-Java 1.32.1 → 1.33.0
  • Guava 29.0 → 30.0
  • java-jwt 3.10.3 → 3.11.0
  • Jetty 9.4.31 → 9.4.32
  • Micrometer 1.3.12 → 1.3.14
  • Netty 4.1.52 → 4.1.53
  • RxJava2 2.2.19 → 2.2.20
  • RxJava3 3.0.6 → 3.0.7
  • Spring Boot 2.1.16 → 2.1.17
  • Spring 5.1.17 → 5.1.18
  • Tomcat8 8.5.57 → 8.5.58
  • Tomcat9 9.0.38 → 9.0.39

🙇 Thank you