2017-09-17 24 views
0

Nginx/openresty와 다른 서비스가 하나의 VM에서 실행 중입니다. 기본적으로 VM은 Openresty에 대한 요청을 수락 한 다음 openresty가 요청을 적절한 서비스로 전달합니다. 예 : 아래 요청은 각각 ServiceA, ServiceB 및 ServiceC로 전달됩니다. 잘 작동합니다. http://server:80/services/refC NGINX에서 여러 응답을 통합하고 하나의 응답을 보낼 수 있습니까?

http://server:80/services/refB

  • http://server:80/services/refA
    • 는 지금은 모든 서비스 A, B와 C에서 반응을 얻을 후 하나 개의 통합 된 응답을 반환 할 수있는 새로운 엔드 포인트를 노출 할 필요가있다.

      내 위치에 여러 개의 proxy_pass를 사용할 수 없다면 어떻게 할 수 있습니까? 예 :

      http://server:80/services/refALL -> A, B 및 C 서비스의 통합 응답을 반환합니다.

  • +0

    어떤 응답이 여기에 반환됩니까? HTML, JSON, 텍스트 파일? 그리고 결합 과정은 정확히 어떻게 작동합니까? –

    +0

    간단한 응답이 될 것입니다. HTML 대부분 또는 단지 텍스트 문자열 – Yogi

    답변

    1

    다음과 같이 할 수 있습니다. 기본적으로 다른 서비스의 응답을 캡처 한 다음 결합합니다.

    location /services/refALL { 
        content_by_lua_block { 
         local respA = ngx.location.capture("/services/refA") 
         local respB = ngx.location.capture("/services/refB") 
         local respC = ngx.location.capture("/services/refC") 
    
         ngx.say(respA.body .. respB.body .. respC.body) 
        } 
    } 
    
    +0

    그게 전부입니다. 작은 따옴표를 중괄호로 바꾸면됩니다. 그러나 그것은 훌륭하게 작동합니다. 상태가 모두 200 일 때 작동합니다. 하지만 api 중 하나의 http 상태 코드가 200이 아닌지 확인해야합니다. 그러면 별도로보고해야합니다. – Yogi

    +0

    @ Yogi, 네, 실수로'content_by_lua'와'content_by_lua_block' 문법을 섞어서 답안으로 수정했습니다. 호출 실패의 경우'respA.status'를 확인하고 상태를 기반으로 조치를 취하면됩니다. –

    +0

    좋습니다. 결국 ngx.say 문이 실행됩니다. 이것에 대한 http 상태 코드를 결정할 수 있습니까? 실제로 적어도 하나의 호출이 모두 실패하면, 나는 성공하지 못하고 싶습니다. 현재 200 OK를 반환하고 있습니다. 어떻게하면 500을 반환 할 수 있습니까? – Yogi