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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]