|
| 1 | +--- |
| 2 | +date: 2025-11-28 |
| 3 | +--- |
| 4 | + |
| 5 | +## 🌟 New features |
| 6 | + |
| 7 | +- **Model Context Protocol (MCP) Server**: You can now build [MCP](https://modelcontextprotocol.io/) services on top of Armeria using the `armeria-ai-mcp` module. #6513 #6492 |
| 8 | + ```java |
| 9 | + // Create an MCP server transport |
| 10 | + var transport = |
| 11 | + ArmeriaStreamableServerTransportProvider |
| 12 | + .builder() |
| 13 | + .jsonMapper(...) |
| 14 | + .contextExtractor(...) |
| 15 | + .build(); |
| 16 | + // Build the MCP server with your tools and resources |
| 17 | + McpServer mcpServer = McpServer.async(transport) |
| 18 | + .tools(myTool) |
| 19 | + .resources(myResource) |
| 20 | + .build(); |
| 21 | + // Serve MCP via Armeria |
| 22 | + Server server = |
| 23 | + Server.builder() |
| 24 | + .service("/mcp/message", transport.httpService()) // 👈👈👈 |
| 25 | + .build(); |
| 26 | + ``` |
| 27 | +- **Retry Limiting**: You can now limit retry requests using <type://RetryLimiter> to prevent system overload during prolonged service degradation. #6409 |
| 28 | + ```java |
| 29 | + RetryRule rule = ... |
| 30 | + RetryConfig config = |
| 31 | + RetryConfig.builder(rule) |
| 32 | + .retryLimiter(RetryLimiter.concurrencyLimiting(3)) // 👈👈👈 |
| 33 | + .build(); |
| 34 | + var retryingClient = RetryingClient.newDecorator(config); |
| 35 | + ``` |
| 36 | +- **JSON-RPC 2.0 Protocol Support**: You can now build [JSON-RPC](https://www.jsonrpc.org/) services using the `armeria-jsonrpc` module. #6504 #6487 #6289 |
| 37 | + ```java |
| 38 | + JsonRpcService jsonRpcService = JsonRpcService |
| 39 | + .builder() |
| 40 | + .methodHandler("echo", (ctx, req) -> { |
| 41 | + // handle the request |
| 42 | + }) |
| 43 | + .build(); |
| 44 | + |
| 45 | + ServerBuilder sb = Server |
| 46 | + .builder() |
| 47 | + .service("/json-rpc", jsonRpcService); // 👈👈👈 |
| 48 | + ``` |
| 49 | +- **Support for Multipart Requests with Duplicate Names**: You can now handle multipart requests that contain multiple parts with the same form field name. #6419 #6430 |
| 50 | + ```java |
| 51 | + @Post("/upload") |
| 52 | + public void upload(@Param("file") List<MultipartFile> files) { // 👈👈👈 |
| 53 | + ... |
| 54 | + } |
| 55 | + ``` |
| 56 | +- **AnnotatedService with JSpecify**: You can now use <type://AnnotatedService> with [JSpecify](https://jspecify.dev/)'s `@Nullable` annotations. #6454 #6457 |
| 57 | + ```java |
| 58 | + public class MyAnnotatedService { |
| 59 | + @Get("/hello") |
| 60 | + public String hello(@org.jspecify.annotations.Nullable String value) { |
| 61 | + ... |
| 62 | + } |
| 63 | + } |
| 64 | + ``` |
| 65 | +- **HTTP Compression Algorithm Control**: You can now configure which compression algorithms to use with <type://EncodingService>. #6390 #6398 |
| 66 | + ```java |
| 67 | + EncodingService encodingService = |
| 68 | + EncodingService.builder() |
| 69 | + .encoderFactories( // 👈👈👈 |
| 70 | + StreamEncoderFactories.GZIP, |
| 71 | + StreamEncoderFactories.DEFLATE, |
| 72 | + new MyCustomBrotliEncoderFactory()) |
| 73 | + .build(); |
| 74 | + ``` |
| 75 | +- **Athenz Authentication Metrics**: `armeria-athenz` exports metrics of your Athenz-secured services by default. #6423 #6517 |
| 76 | + - You may also configure the metrics: |
| 77 | + ```java |
| 78 | + var ztsBaseClient = |
| 79 | + ZtsBaseClient.builder(ztsUri) |
| 80 | + .enableMetrics(meterRegistry, meterIdPrefixFunction) // 👈👈👈 |
| 81 | + ... |
| 82 | + .build(); |
| 83 | + // For services |
| 84 | + var decoratorFactory = AthenzServiceDecoratorFactory |
| 85 | + .builder(ztsBaseClient) |
| 86 | + .meterIdPrefix(myMeterIdPrefix) // 👈👈👈 |
| 87 | + ... |
| 88 | + .build(); |
| 89 | + // For clients |
| 90 | + var athenzClient = AthenzClient |
| 91 | + .builder(ztsBaseClient) |
| 92 | + .meterIdPrefix(myMeterIdPrefix) // 👈👈👈 |
| 93 | + ... |
| 94 | + .newDecorator(); |
| 95 | + ``` |
| 96 | +- **Multipart File Upload Encoding Configuration**: You can now configure how multipart filenames are decoded. #6465 |
| 97 | + - Use `-Dcom.linecorp.armeria.defaultMultipartFilenameDecodingMode` with `utf_8`, `iso_8859_1`, or `url_decoding`. |
| 98 | +- **SAML RelayState Length Configuration**: You can now configure the maximum length for SAML RelayState parameters. #6381 |
| 99 | + ```java |
| 100 | + SamlServiceProvider sp = |
| 101 | + SamlServiceProvider |
| 102 | + .builder() |
| 103 | + .relayStateMaxLength(256) // 👈👈👈 Default is 80 |
| 104 | + ... |
| 105 | + ``` |
| 106 | + |
| 107 | +## 📈 Improvements |
| 108 | + |
| 109 | +- Comprehensive improvements to the `armeria-xds` module. #6470 #6469 #6468 #6474 #6475 #6403 #6366 #6461 |
| 110 | + - Improved logs and metrics for better observability. |
| 111 | + - `protoc-gen-validate` is applied for all xDS resources by default. |
| 112 | + - Support for Envoy's `RetryPolicy` has been added. |
| 113 | + |
| 114 | +## 🛠️ Bug fixes |
| 115 | + |
| 116 | +- <type://ServiceRequestContext> validation has been improved to avoid false-positive exceptions. #6420 #6479 |
| 117 | + - Pushing a <type://ServiceRequestContext>-based <type://RequestContext> to a thread that does not already have a <type://ServiceRequestContext> no longer emits an <type://IllegalStateException>. |
| 118 | +- Resolved duplicate decorator registration in <type://ZtsBaseClient> when using <type://ArmeriaAutoConfiguration>. #6424 |
| 119 | +- <type://ContentPreviewerFactory> no longer unnecessarily logs content for binary types. #6485 |
| 120 | +- Trailers-only gRPC responses no longer include incorrect `Content-Length` headers #6511 |
| 121 | +- A closing WebSocket session no longer sends an unnecessary `RST_STREAM` frame. #6375 |
| 122 | +- <type://RejectedRouterHandler#FAIL> correctly throws an exception when duplicate routes are detected. #6498 #6499 |
| 123 | +- JSON formatting has been fixed in the <type://DocService> debug console. #6434 |
| 124 | +- <type://DocService> no longer sends `Content-Type` headers for HTTP methods that don't have request bodies. #6442 |
| 125 | +- A warning log is no longer emitted for certificates missing both a Subject Alternative Name (SAN) and a Common Name (CN). #6477 |
| 126 | +- `armeria-logback`'s MDC export works correctly when `-Dcom.linecorp.armeria.warnNettyVersions` is set to false. #6428 |
| 127 | + |
| 128 | +## ☢️ Breaking changes |
| 129 | + |
| 130 | +- The default decoding mode for multipart request filenames is now UTF-8 instead of ISO-8859-1. |
| 131 | + - For the previous behavior, set the system property `-Dcom.linecorp.armeria.defaultMultipartFilenameDecodingMode=iso_8859_1`. #6465 |
| 132 | +- Dropwizard 1.x integration is no longer supported. #6515 |
| 133 | + |
| 134 | +## ⛓ Dependencies |
| 135 | + |
| 136 | +- Athenz 1.12.21 → 1.12.29 |
| 137 | +- Bouncy Castle 1.81 → 1.82 |
| 138 | +- Brotli4j 1.18.0 → 1.20.0 |
| 139 | +- GraphQL Java 24.2 → 25.0 |
| 140 | +- gRPC Java 1.74.0 → 1.77.0 |
| 141 | +- Jackson 2.19.2 → 2.20.1 |
| 142 | +- Jetty 10.0.20 → 10.0.26, 11.0.25 → 11.0.26 |
| 143 | +- Kotlin 2.1.10 → 2.2.21 |
| 144 | +- Kotlin Coroutines 1.10.1 → 1.10.2 |
| 145 | +- Kubernetes Client 7.3.1 → 7.4.0 |
| 146 | +- Logback 1.5.18 → 1.5.21 |
| 147 | +- Micrometer 1.15.2 → 1.16.0 |
| 148 | +- Micrometer Context Propagation 1.1.3 → 1.2.0 |
| 149 | +- Micrometer Tracing 1.5.2 → 1.6.0 |
| 150 | +- Netty 4.2.6.Final → 4.2.7.Final |
| 151 | +- Prometheus 1.3.10 → 1.4.3 |
| 152 | +- Protobuf 3.25.5 → 3.25.8, 4.29.3 → 4.33.1 |
| 153 | +- Protobuf Jackson 2.7.0 → 2.8.1 |
| 154 | +- Reactor Core 3.7.8 → 3.8.0 |
| 155 | +- Reactor Kotlin Extensions 1.2.3 → 1.3.0 |
| 156 | +- RxJava 3.1.11 → 3.1.12 |
| 157 | +- Sangria 4.2.10 → 4.2.15 |
| 158 | +- ScalaPB 0.11.17 → 0.11.20 |
| 159 | +- ScalaPB JSON 0.12.1 → 0.12.2 |
| 160 | +- Spring 6.2.9 → 6.2.14 |
| 161 | +- Spring Boot 3.5.7 → 3.5.8 |
| 162 | +- Tomcat 10.1.31 → 10.1.49 |
| 163 | + |
| 164 | + |
| 165 | +## 🙇 Thank you |
| 166 | + |
| 167 | +<ThankYou usernames={[ |
| 168 | + '0x1306e6d', |
| 169 | + 'chickenchickenlove', |
| 170 | + 'hirakida', |
| 171 | + 'ikhoon', |
| 172 | + 'jrhee17', |
| 173 | + 'minwoox', |
| 174 | + 'patcher454', |
| 175 | + 'schiemon', |
| 176 | + 'sh-cho', |
| 177 | + 'triberraar', |
| 178 | + 'trustin' |
| 179 | +]} /> |
0 commit comments