重型REST应用程序

时间:2016-06-09 09:43:51

标签: spring rest post esb

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

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

var str = "İstanbul";
const arr_l = [...str].map(s => s.toLowerCase());
const first_2_l = arr_l.slice(0, 2).join('');

console.log(first_2_l, first_2_l.length);

服务就是这样的:

@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
}

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

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

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

1 个答案:

答案 0 :(得分:0)

// 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所说的内容。