使用REST的通知微服务设计困境

时间:2016-07-27 01:01:07

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

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

现在这是我的两难选择。我应该为每种类型的请求制作一个网址还是为所有网址制作一个网址?

e.g。

OPTION1

@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配置中解决这个问题?

2 个答案:

答案 0 :(得分:0)

Richardson Maturity Model level 1,我会说你最多有2个资源(也就是选项2),两者都有一个类型属性。当然,他们会有一组不同的输入值,但所有这些电子邮件类型应该具有相同的属性,对(From,To,Subject,Body等)?没有必要拥有一个单独的端点,如果它的外观和行为与另外两个端点相同。

答案 1 :(得分:0)

我会选择选项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,可以解决这个问题。