vahidaghazadeh opened a new pull request, #12128:
URL: https://github.com/apache/apisix/pull/12128

   ### Description
   
   This Pull Request introduces the `proxy-chain` plugin to APISIX, designed to 
enhance the gateway's ability to orchestrate complex workflows by chaining 
multiple upstream service calls in a sequential manner. The plugin merges the 
responses from these services into a single payload, which is then passed to 
the final upstream, making it ideal for scenarios requiring data aggregation or 
step-by-step processing across microservices.
   
   ### Purpose
   
   The primary goal of the `proxy-chain` plugin is to simplify workflows where 
a single client request needs to interact with multiple backend services before 
producing a final response. For example, in an e-commerce checkout process, the 
plugin can:
   1. Fetch user data from a customer service.
   2. Validate payment details from a payment service.
   3. Combine the results and forward them to an order processing service.
   
   This eliminates the need for clients to manage these interactions manually 
and reduces latency by handling them server-side within APISIX.
   
   ### How It Works
   
   The plugin operates in the `access` phase of APISIX's request lifecycle and 
performs the following steps:
   1. **Request Parsing**: Extracts the incoming request body (JSON) and URI 
arguments, merging them into an initial data set.
   2. **Token Handling**: Optionally extracts an authentication token from a 
configurable header (e.g., `Token` or `Authorization`) and passes it to 
downstream services.
   3. **Service Chaining**: Iterates through a list of configured services, 
making HTTP requests to each in sequence:
       - Sends the current merged data as the request body.
       - Merges the response (JSON) into the cumulative data set.
   4. **Final Output**: Updates the request body with the merged data and 
forwards it to the upstream, optionally including the authentication token.
   
   The plugin includes error handling for failed service calls or invalid JSON 
responses, returning appropriate HTTP status codes and error messages.
   
   ### Configuration Schema
   
   | Name           | Type   | Required | Default | Description                 
                     |
   
|----------------|--------|----------|---------|--------------------------------------------------|
   | `services`     | array  | Yes      | -       | List of upstream services 
to chain.              |
   | `services.uri` | string | Yes      | -       | URI of the upstream 
service.                     |
   | `services.method` | string | Yes   | "POST"  | HTTP method (GET, POST, 
PUT, DELETE).            |
   | `token_header` | string | No       | -       | Custom header name for 
passing a token between services. |
   
   ### Example Usage
   
   Below is an example of how to configure and use the `proxy-chain` plugin in 
APISIX:
   
   #### Route Configuration
   ```json
   {
     "uri": "/offl/v1/checkout",
     "methods": ["POST"],
     "plugins": {
       "proxy-chain": {
         "services": [
           {
             "uri": "http://customer_service/api/v1/user";,
             "method": "POST"
           },
           {
             "uri": "http://payment_service/api/v1/validate";,
             "method": "POST"
           }
         ],
         "token_header": "Token"
       },
       "proxy-rewrite": {
         "uri": "/api/v1/checkout"
       }
     },
     "upstream_id": "550932803756229477"
   }
   ```
   ## Expected Behavior:
   The plugin sends {"order_id": "12345"} to customer_service/api/v1/user, 
receiving something like {"user_id": "67890"}.
   
   It then sends the merged data {"order_id": "12345", "user_id": "67890"} to 
payment_service/api/v1/validate, receiving {"status": "valid"}.
   
   The final merged data {"order_id": "12345", "user_id": "67890", "status": 
"valid"} is rewritten to /api/v1/checkout and sent to the upstream.
   
   ## Changes Introduced
   Added apisix/apisix/plugins/proxy-chain.lua with the plugin implementation.
   
   Updated documentation in docs/en/latest/plugins/proxy-chain.md (to be added 
in a follow-up commit if needed).
   
   ## Why Include This Plugin?
   Flexibility: Enables complex service orchestration without additional 
middleware.
   
   Performance: Reduces client-side latency by handling chaining server-side.
   
   Reusability: Useful across various use cases like authentication flows, data 
aggregation, and microservices coordination.
   
   ## Testing
   The plugin has been tested in a Dockerized APISIX environment (version 
3.11.0-debian) with the example configuration above.
   
   Error handling for failed service calls and invalid JSON responses is 
verified.
   
   Suggestions for unit tests in t/plugin/ are welcome!
   
   ## Next Steps
   Requesting feedback on the implementation and configuration schema.
   
   Willing to add unit tests if required for acceptance


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@apisix.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to