【问题标题】:Heavy REST Application重度 REST 应用程序
【发布时间】:2016-06-09 21:28:15
【问题描述】:

我有一个企业服务总线 (ESB),它通过 Rest 将数据发布到微服务 (MCS)。我使用 Spring 来执行此操作。主要问题是我有 6 个微服务,一个接一个地运行。所以它看起来像这样:MCS1 -> ESB -> MCS2 -> ESB -> ... -> MCS6

所以我的问题看起来像这样:(ESB)

@RequestMapping(value = "/rawdataservice/container", method =  RequestMethod.POST)
@Produces(MediaType.APPLICATION_JSON)
public void rawContainer(@RequestBody Container c)
{
    // Here i want to do something to directly send a response and afterwards execute the 
    // heavy code
    // In the heavy code is a postForObject to the next Microservice
}

服务会做这样的事情:

@RequestMapping(value = "/container", method = RequestMethod.POST)
public void addDomain(@RequestBody Container container)
{
    heavyCode();
    RestTemplate rt = new RestTemplate();
    rt.postForObject("http://134.61.64.201:8080/rest/rawdataservice/container",container, Container.class);
}

但我不知道该怎么做。我在帖子中查找了 Location 方法,但我认为它不能解决问题。

编辑: 我有一个微服务链。第一个微服务等待 ESB 的响应。在响应中,ESB 发布到另一个微服务并等待响应,下一个与第一个相同。所以问题是只要完成了完整的微服务路由,第一个微服务就被阻塞了。

ESB Route 也许一张照片可以帮助。 1.rawdataService 2.metadataservice 3.syntaxservice 4.semantik

【问题讨论】:

  • 我不确定我是否理解这个问题。是不是你无法确定从微服务发帖到哪里
  • 在我看来,您希望异步运行您的请求,以免您的请求被阻止。假设您有两个微服务 A + B,您可以并行/异步向两个微服务 A + B 发起请求。但是,这并不总是可行的,即在需要来自 A 的响应作为 B 的输入的情况下。
  • 异步有助于在不阻塞的情况下运行请求,但链的主要问题没有解决。我不想要链条,系统没有必要。微服务 A 不需要微服务 B 完成流程的信息。微服务 A 只需要数据成功发送到 ESB 的信息即可

标签: spring rest post esb


【解决方案1】:
// Here i want to do something to directly send a response and afterwards execute the 
// heavy code

通常的拼写是使用来自 http 请求的数据来创建一个知道如何完成工作的 Runnable,并将该 runnable 分派给执行器服务以供以后处理。同样,您将需要的数据复制到队列中,由准备完成工作的其他线程轮询。

一旦执行器服务/队列接受了待处理的工作,http 请求处理程序就会立即返回。最常见的实现是返回“202 Accepted”响应,在 Location 标头中包含资源的 url,如果需要,该资源将允许客户端监控正在进行的工作。

在 Spring 中,可能是 ResponseEntity 为您管理代码。比如

ResponseEntity.accepted()....

另见:

从调用者的角度来看,它会调用 RestTemplate.postForLocation,接收一个 URI,然后丢弃该 URI,因为微服务只需要知道工作已被接受

旁注:从长远来看,您可能希望能够关联不同微服务的活动,尤其是在进行故障排除时。因此,请确保您了解 Gregor Hohpe 对correlation identifiers 的看法。

【讨论】:

  • 这可以解决问题。我剩下的最后一个问题是我如何在春天返回“202 Accepted”。通常 Spring 会为我做 http 响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2014-02-27
  • 2017-12-03
  • 1970-01-01
  • 2015-05-12
  • 2017-05-04
  • 2010-11-20
相关资源
最近更新 更多