Quarkus 和 Infinispan:获胜组合
Infinispan 15.0 最近发布了,带来了 Quarkus 也已采纳的一系列增强功能。让我们深入探讨这篇博客文章,重点介绍 Infinispan 和 Quarkus 的重大更新和改进。
序列化 API 改进
Infinispan 可以处理各种序列化格式,但 Protobuf 作为最兼容的格式脱颖而出,它提供了对所有 Infinispan Cache 功能的完全访问。它通过 Protostream 库提供支持。使用 Protostream 5,您不仅可以获得 Protobuf 3 的支持,还可以获得更简单、更用户友好的 API。
@Proto
仅使用 @Proto
注解即可使用 Protostream 序列化类、枚举或记录。如果您想更具体地说明需要序列化的内容,仍然可以使用 @Protofield
注解。但是,使用一个注解即可自动处理默认模式设置。此功能非常有用,尤其是在您的模式频繁更改且需要经常刷新数据时。
@Proto
public record Author(String name, String surname) {
}
@ProtoSchema
用于定义模式的注解已重命名为 @ProtoSchema
。因此,现在您将使用 @ProtoSchema
而不是 @AutoProtoSchemaBuilder
来指定模式。这有助于阐明其目的和用法。
@ProtoSchema(includeClasses = { Book.class, Author.class }, schemaPackageName = "book_sample")
interface BookStoreSchema extends GeneratedSchema {
}
模式的编程定义
如果您需要以编程方式定义模式,Protostream 5 现在为此目的提供了 API。这允许您根据需要动态地在代码中定义模式。
@Produces
Schema magazineSchema() {
return new Schema.Builder("magazine.proto")
.packageName("magazine_sample")
.addMessage("Magazine")
.addField(Type.Scalar.STRING, "name", 1)
.addField(Type.Scalar.INT32, "publicationYear", 2)
.addField(Type.Scalar.INT32, "publicationMonth", 3)
.addRepeatedField(Type.Scalar.STRING, "stories", 4)
.build();
}
此外,之前计划弃用和删除的 MessageMarshaller
类已恢复,可以继续安全地用于实现自定义编组。
对 Mock 的支持
在 Quarkus 3.9 之前,由于 Search API 的原因,无法使用 @QuarkusTest
和 @QuarkusMock
来 Mock RemoteCache
bean,因为它们是 Singleton
作用域。但是,从 Quarkus 3.9 开始,它们的作用域已更改为 ApplicationScoped
,从而实现了对测试的完全 Mock。
此外,Search API 也得到了增强。现在,我们可以直接使用 RemoteCache
接口中公开的方法来执行搜索。
@Inject
@Remote("books")
RemoteCache<String, Book> booksCache; (1)
...
Query<Book> query = booksCache.query("from book_sample.Book b where b.authors.name like '%" + name + "%'"); (2)
List<Book> list = query.execute().list(); (3)
1 | Books cache is injected |
2 | Use query method directly on the books cache |
3 | Retrieve the list as usual |
Infinispan Cache 扩展
从 Quarkus 3.11 开始,Infinispan Cache 扩展中的缓存注解已被弃用。Infinispan 现在提供了一个新的缓存扩展。
通过将 quarkus-cache
依赖项替换为 quarkus-infinispan-cache
,您可以使用 quarkus-cache
扩展中的 @CacheResult
、@CacheInvalidate
和 @CacheInvalidateAll
注解,同时将数据存储在 Infinispan Server 中。
@GET
@Path("/{country}/{city}/{name}")
@CacheResult(cacheName = "fruits")
public ExpensiveFruitsResponse getExpensiveFruitsResponse(@PathParam("country") @CacheKey String country,
@PathParam("city") @CacheKey String city,
@PathParam("name") @CacheKey String name,
@QueryParam("metadata") String metadata) {
invocations.incrementAndGet();
String id = UUID.randomUUID().toString();
String description = String.format("Fruit in city %s, with name %s", city, name);
return new ExpensiveFruitsResponse(id, description, metadata);
}
请在 Infinispan Cache Extension Guide 中阅读有关此内容的全部信息。
Infinispan 和 Quarkus LangChain4j 集成
现在,您可以在 Quarkus LangChain4j 扩展中使用 Infinispan 作为 Embedding Store。由于与 Hibernate Search 的特殊集成,Infinispan 具有全文功能。此外,从 Hibernate Search 7.1 开始,支持向量搜索。这意味着您可以使用 Infinispan Server 作为 LLM 应用程序的 Embedding 存储。请在 文档 中阅读有关此内容的全部信息。
加入我们
我们非常重视您的反馈,所以请报告错误,提出改进建议…… 让我们一起构建伟大的东西!
如果您是 Quarkus 用户或只是好奇,请不要害羞,加入我们热情的社区
-
在 GitHub 上提供反馈;
-
编写一些代码并 推送 PR;
-
在 Stack Overflow 上提问。