当前位置: 首页 > 知识库问答 >
问题:

Apache AVRO with Rest

沃弘图
2023-03-14

我正在评估将Apache AVRO用于我的泽西岛REST服务。我正在使用带有泽西岛REST的Springboot。

目前我接受JSON作为使用Jackson对象映射器转换为JavaPojos的输入。

我看了不同的地方,但我找不到任何使用Apache AVRO与泽西终端的例子。

我找到了这个Github存储库(https://github.com/FasterXML/jackson-dataformats-binary/),它有Apache AVRO插件。

我仍然找不到任何关于如何集成它的好例子。有人在泽西使用Apache AVRO吗?如果是,有什么我可以使用的例子吗?

共有2个答案

武琛
2023-03-14

有一个关于如何在JAX-RS REST服务中使用avro的全面演示(我写的)。avro的JAX-RS消息体读取器和编写器是在实现的,它们确实支持avro二进制、json、惯用json和csv(如果适用)。它们确实提供了对模式演化和投影的完全支持(通过http accept头)。有一系列文章详细解释了中演示的概念。此外,此演示项目在GKE上实时运行,您可以在上浏览openapi。Avro在项目中被用于所有内容、日志、度量和分析。

孙德本
2023-03-14

首先,需要做两件事:

  1. 在Avro模式格式之后,您需要开发一个自定义的对象映射器

应该是这样的:

@Provider
public class AvroMapperProvider implements ContextResolver<ObjectMapper> {

    final AvroMapper avroMapper = new AvroMapper();

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return avroMapper;
    }
}

将应用程序配置为使用Jackson作为消息处理程序:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
         super(JacksonFeature.class,AvroMapperProvider.class);
    }
}

或者,您可以实现一个自定义的MessageBodyReader和MessageBodyWriter,允许您在进出过程中直接处理有效负载:

public class AvroMessageReader implements MessageBodyReader<Person> {

    AvroSchema schema;

    final AvroMapper avroMapper = new AvroMapper();

    public AvroMessageReader(){
        schema = avroMapper.schemaFor(Person.class); //generates an Avro schema from the POJO class.
    }

    @Override
    public boolean isReadable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) {
        return type == Person.class; //determines that this reader can handle the Person class.
    }

    @Override
    public Person readFrom(Class<Person> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, String> mm, InputStream in) throws IOException, WebApplicationException {
        return avroMapper.reader(schema).readValue(in);
    }

}

这里,我们从一个假想的Person类生成一个avro模式。JAX-RS运行时将根据isReadable的响应选择此读取器。

然后,您可以将MessageBodyWorkers组件注入到服务实现类中:

@Path("app")
public static class BodyReaderTest{

    @Context
    private MessageBodyWorkers workers;

    @POST
    @Produces("avro/binary")
    @Consumes("avro/binary")
    public String processMessage() {

        workers.getMessageBodyReader(Person.class, Person.class, new Annotation[]{}, MediaType.APPLICATION_JSON_TYPE);
    }
 }

回答您的最后一个评论:将处理程序上的mime类型设置为推荐的avro/二进制应该可以做到这一点。

 类似资料:

相关问答

相关文章

相关阅读