0.99.5 release notes
14th May 2020
🌟 New features
Added
Server.blockUntilShutdown()which lets you wait for aServerto close. #2659Server server = Server.builder()...build(); server.start().join(); // Returns when server.close() or closeAsync() is called. server.blockUntilShutdown();Added
SystemInfo.defaultNonLoopbackIpV4Address()which returns the sensible IPv4 address of the current machine. #2679You can now specify authorization credentials conveniently when building a client: #2680
WebClient.builder("https://example.com/api") // Basic .auth(BasicToken.of("admin", "sesame")) // OAuth 1a .auth(OAuth1aToken.of(...)) // OAuth 2 .auth(OAuth2Token.of("token-0123456789abcdef")) .build();New
RetryRuleandRetryRuleWithContentAPI let you define a complex retry policy conveniently. #1634 #2661 #2709Backoff myBackoff = Backoff.exponential(1000, 60000) .withJitter(0.3) .withMaxAttempts(10); RetryRule retryRule = RetryRule.of(RetryRule.builder() .onUnProcessed() .thenBackoff(myBackoff), RetryRule.builder() .onException(ResponseTimeoutException.class) .thenBackoff(), RetryRule.builder() .onStatus(HttpStatus.TOO_MANY_REQUESTS) .thenNoRetry()) RetryingClient.newDecorator(retryRule);CircuitBreakerListenernow has a new event listener methodonInitialized(), which is invoked when a circuit is initialized. By default, it simply delegates toonStateChanged(). #2675You can now register your server to or retrieve the
Endpointsfrom a Eureka registry server, which gives nice integration with Spring Cloud. #707 #2701Use
EurekaUpdatingListenerforServers:Server server = Server.builder()...build(); server.addListener(EurekaUpdatingListener.of("https://my-eureka-registry.com/")); // Automatically registers when the Server starts. server.start().join(); // Automatically deregisters when the Server stops. server.stop().join();Use
EurekaEndpointGroupfor clients:// Periodically retrieves the endpoint list from the registry. EndpointGroup group = EurekaEndpointGroup.of("https://my-eureka-registry/"); group.whenReady().join(); // Sends a request to the endpoints, spreading the load w/ weighted round-robin. WebClient client = WebClient.of(SessionProtocol.HTTP, group); System.err.println(client.get("/some-resource") .aggregate().join() .contentUtf8());
You can now use the gRPC client stubs generated by
grpc-kotlin#2662 #2669Added a new Thrift serialization format
TTEXT_NAMED_ENUM. It is a variant ofTTEXTthat serializes anenumas a string instead of an integer. This can be useful when you need to serialize aTBaseobject into a human-readable JSON. #2706ObjectMapper mapper = new ObjectMapper() mapper.registerModule(new ThriftJacksonModule(/* useNamedEnum */ true)); String json = mapper.writeValueAsString(myTBaseStruct);Added two Spring Boot annotations that inject the current local Armeria port(s) -
@LocalArmeriaPortand@LocalArmeriaPorts, which is useful when you bind at an ephemeral port or more than one port: #2561 #2684@Configuration class MyConfiguration { @LocalArmeriaPort(SessionProtocol.HTTP) int httpPort; @LocalArmeriaPort(SessionProtocol.HTTPS) int httpsPort; @LocalArmeriaPorts List<Integer> ports; }
📈 Improvements
ZooKeeperUpdatingListenernow updates the registry with both host name and IP address by default, so that the client does not have to do a DNS lookup. #2674 #2679- The IP address is retrieved from
defaultNonLoopbackIpV4Address()ofSystemInfo.
- The IP address is retrieved from
🛠️ Bug fixes
- Fixed a bug where more than one thread can consume from a streaming message. #2687 #2683
- You will not get a
NullPointerExceptionanymore when starting aJettyServicewith DEBUG level logging enabled. #2688 #2691 - PING interval now works as expected even if idle timeout is disabled. #2702
- A connection is now closed immediately when PING fails, rather than waiting for idle timeout. #2699
- A request sent to an HTTP/1 server behind an HTTP CONNECT proxy server is now handled properly. #2705 #2698
- An event loop does not block for too long anymore when:
☢️ Breaking changes
BasicToken,OAuth1aTokenandOAuth2Tokenhave been moved tocom.linecorp.armeria.common.auth. #2680- Builder and factory methods of
RetryingClientneed an explicit type parameter forRetryStrategywhen creating with a lambda expression. #2661
⛓ Dependencies
- Dropwizard 2.0.5 → 2.0.9
- Dropwizard Metrics 4.1.5 → 4.1.7, 3.2.5 → 3.2.6
- gRPC 1.28.0 → 1.29.0
- Jackson 2.10.3 → 2.11.0
- java-jwt 3.10.2 → 3.10.3
- Jetty 9.4.27 → 9.4.28
- Micrometer 1.3.6 → 1.5.1
- Netty 4.1.48 → 4.1.50
- Prometheus simpleclient 0.8.1 → 0.9.0
- protobuf-jackson 1.0.0 → 1.1.0
- Reactor 3.3.4 → 3.3.5
- RxJava 3.0.1 → 3.0.3
- snappy-java 1.1.7 → 1.1.7.5
- Spring Boot 2.2.6 → 2.2.7
- Tomcat 9.0.33 → 9.0.35, 8.5.53 → 8.5.55
- ZooKeeper 3.5.7 → 3.5.8
- Shaded dependencies
- Bouncy Castle 1.64 → 1.65
- Caffeine 2.8.1 → 2.8.2
- Guava 28.2 → 29.0
- Example dependencies
- Kotlin 1.3.71 → 1.3.72
- Kotlin Coroutines 1.3.4 → 1.3.6