【问题标题】:Design dilemma on notifications Microservice using REST使用 REST 的通知微服务设计困境
【发布时间】:2016-07-27 01:01:06
【问题描述】:

我正在创建一个微服务,负责执行由其他接口和微服务触发的所有通知(例如电子邮件、短信)。这是为了集中所有通知逻辑和处理。通过调用其 rest web 服务 url 来触发通知操作。

现在这是我的困境。我应该为每种类型的请求创建一个 url 还是为所有请求创建一个 url?

例如

选项1

@Path("{sourceId}/registationEmail")
@Path("{sourceId}/forgotPasswordEmail")
@Path("{sourceId}/productionTicketEmail")
@Path("{sourceId}/registationSms")
@Path("{sourceId}/forgotPasswordSms")
@Path("{sourceId}/productionTicketSms")

选项 2

@Path("{sourceId}/email")
@Path("{sourceId}/sms")

这里的问题是我们使用@BeanParam 作为输入,所以每种类型的通知都会有一组不同的输入值。这是我们决定选择选项 2 的主要问题,还是有办法在 REST 配置中解决这个问题?

【问题讨论】:

    标签: web-services rest restful-architecture restful-url


    【解决方案1】:

    看看Richardson Maturity Model level 1,我会说你最多有2个资源(又名选项2),并且两者都可以有一个类型属性。当然,它们会有一组不同的输入值,但所有这些电子邮件类型都应该具有相同的属性,对吧(发件人、收件人、主题、正文等)?如果它的外观和行为与其他 2 个端点相同,那么拥有一个单独的端点是没有意义的。

    【讨论】:

    • 问题是构造邮件内容的处理逻辑是由这个Notifications web服务来完成的,所以我们不能把构造好的消息体作为输入发送给这个服务,只有需要的参数构造消息体
    • 那么有什么问题呢?除了拥有 body 属性,您将拥有几个较小的 (?),不同的,每个 email/sms 类型具有不同的值;只要所有电子邮件都需要类似的参数(类型/名称,而不是实际值),就可以通过具有通用模型的单个端点提供服务
    • 问题是每种电子邮件类型都需要一组不同的输入数据。因此,您可以重用相同的 BeanParam 输入。
    【解决方案2】:

    我会选择选项 2:

    @Path("{sourceId}/email")
    @Path("{sourceId}/sms")
    

    它看起来比其他选项好得多。


    我不知道你的完整 URI 是什么样的,但我会得到类似 /sources/{sourceId}/email/sources/{sourceId}/notification/email 的东西。

    你的请求可能是这样的:

    POST /sources/{sourceId}/email HTTP/1.1
    Host: example.com
    Content-Type: application/json
    
    {
      "to": "mail@example.com",
      "subject": "Question 38602123",
      "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    }
    

    您没有提供有关输入内容的详细信息。没有关于您正在使用的依赖项的详细信息。因此很难猜测并为您提供明确的答案。

    您提到了@BeanParam,所以我假设您正在使用 JAX-RS 及其实现之一,例如 Jersey。如果您使用 JSON 或 XML 来表示您的资源,那么您很可能使用的是 Jackson。

    因此,要处理不同的输入,您可以使用继承和 Jackson 多态反序列化。有一些注解,例如 @JsonTypeInfo@JsonSubTypes 可以解决问题。

    【讨论】:

    • 所有电子邮件模板都由通知 Web 服务管理,因此无法将格式化的消息发送到服务。每种电子邮件类型也有一组不同的输入,因此使用单个 @BeanParam 类最终会拥有很多属性来处理每次通知所需的所有数据输入
    • @DavoinShowerhandles 你为什么不在你的问题中添加一个例子?
    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 2017-06-25
    • 2022-06-28
    • 2021-06-20
    • 2019-05-29
    • 2019-09-09
    • 2017-09-21
    • 2019-04-09
    相关资源
    最近更新 更多