0.99.0 release notes

30th March 2020

🌟 New features

  • You can now make your client connect via a SOCKS 4, SOCKS 5 or HTTP CONNECT proxy server. #2321 #2496
    ClientFactory.builder()
                 .proxyConfig(ProxyConfig.socks4(socksProxyServer.address()))
                 .build();
  • You can now configure to send PING on idle HTTP/2 connections. #1263 #2409
    ClientFactory.builder()
                 .http2PingTimeoutMillis(3000)
                 .build();
  • You can now make an alias for the pre-defined MDC key when using RequestContextExportingAppender. #2512 #2531
    <export>request_id=req.id</export> <!-- request_id is an alias for the built-in property. -->
    <export>my_foo_bar=attr:com.example.Foo#ATTR_BAR</export>    <!-- my_foo_bar is an alias. -->
  • You can now set an example path and queries for DocService. #2195 #2546
  • You can now customize the default log name of a service. #2626
    sb.route().addRoute(...).defaultLogName("name").build(service);
  • You can now access a parent log from a child log using RequestLogAccess.parent(). #2599
  • gRPC client now supports gRPC CallCredentials. #2619 #2622
  • You can now send customized responses from ThrottlingService using ThrottlingAcceptHandler and ThrottlingRejectHandler. #2482 #2503
  • You can now use advanced throttling algorithm based on Token-Bucket rate-limiting and Bucket4j library. #2566
  • You can now create your own storage to store RequestContext. #2514 #2610
    // You should implement `RequestContextStorageProvider` and use SPI to return the `RequestContextStorage`.
    public class CustomizedStorageProvider implements RequestContextStorageProvider {
        @Override
        public RequestContextStorage newStorage() {
            return new CustomizedStorage();
        }
    }

📈 Improvements

  • You can now set timeout using TimeoutMode. #2535 #2571

    // Before
    ctx.extendResponseTimeoutMillis(10000);
    ctx.setResponseTimeoutAfterMillis(10000);
    
    // After
    ctx.setResponseTimeoutMillis(TimeoutMode.EXTEND, 10000);
    ctx.setResponseTimeoutMillis(TimeoutMode.SET_FROM_NOW, 10000);
    • set(Request|Response)Timeout is now undeprecated.

🛠️ Bug fixes

  • DNS resolution is timed out after queryTimeoutMillis. #2623
  • You can now return Single<HttpResponse> or Maybe<HttpResponse> in an annotated service. #2624
  • You can now register and monitor Reactor Scheduler with Prometheus in Armeria Server. #2612
  • RequestLog.name and some other properties are copied to the child log in RetyringClient. #2551 #2560
  • You no longer see ClosedStreamException due to the stream creation reversal. #2597
  • IllegalStateException is not raised anymore while building a WebFlux response. #2613
  • Annotated service's log name is always set. #2626

🏚️ Deprecations

  • Deprecated ZooKeeperUpdatingListener.nodeValueCodec() in favor of ZooKeeperUpdatingListener.codec(). #2552

☢️ Breaking changes

  • Most of the deprecated APIs are gone. #2543

    • If you have trouble finding APIs to replace, please upgrade to 0.98.7 first and use your IDE's advanced feature to search deprecated APIs. Then, you can easily upgrade to 0.99.0.
  • armeria-dropwizard is now for Dropwizard 2. If you want to use Dropwizard 1.3.x, use armeria-dropwizard1. #2556

  • armeria-rxjava is now for RxJava 3. If you want to use RxJava 2, use armeria-rxjava2. #2378 #2501

  • ClientBuilder.path(path) is now gone. #2525 #2538

    • If you want to specify the path other than /, you should specify it when creating ClientBuilder.
      // before
      Clients.builer(SessionProtocol.HTTP, Endpoint.of("127.0.0.1"))
             .path("/foo");
      // after
      Clients.builer(SessionProtocol.HTTP, Endpoint.of("127.0.0.1"), "/foo");
  • ClosedSessionException now extends ClosedStreamException. #2596 #2616

  • AuthSuccessHandler<HttpRequest, HttpResponse> and AuthFailureHandler<HttpRequest, HttpResponse> now don't have type parameters.

  • The meter name armeriaBlockingTaskExecutor is now blockingTaskExecutor with the prefix armeria.executor.

  • RequestContext.set*TimeoutAfter*() or extend*Timeout*() methods have been removed. Call set*Timeout*() with a TimeoutMode specified instead.

⛓ Dependencies

  • Brave 5.9.5 -> 5.10.2
  • bucket4j-core 4.10.0
  • Curator 4.2.0 -> 4.3.0
  • java-jwt 3.10.0 -> 3.10.1
  • jetty-alpn-agent 2.0.9 -> 2.10.0
  • Micrometer 1.3.5 -> 1.4.0
  • Netty 4.1.37.Final -> 4.1.48.Final
    • netty-tcnative-boringssl-static 2.0.29.Final -> 2.0.30.Final
  • Opensaml 3.4.3 -> 3.4.5
  • Reactor 3.3.3.RELEASE -> 3.3.4.RELEASE
  • Retrofit 2.7.2 -> 2.8.0
  • RxJava 3.0.0 -> 3.0.1
  • Spring Boot 2.2.4 -> 2.2.5
    • Spring2.1 2.1.12.RELEASE -> 2.1.13.RELEASE
  • Tomcat 9.0.31 -> 9.0.33
    • Tomcat8.5 8.5.51 -> 8.5.53
  • Zookeeper 3.5.7 -> 3.6.0

🙇 Thank you