This project provides a dynamic routing module for Apicast. It routes the API request to the appropriate backend, based on an HTTP Header of the request.
A sample use case could be:
- A Load Balancer in front of Apicast identifies the source of the request (
internal
/external
ordev
/prod
) - The LB add the corresponding header (
x-env: dev
orx-env: prod
for instance) - Based on this header, the Apicast routes the API request to the corresponding backend
The API Backends are discovered by querying a Service Catalog. A sample service catalog is given with this project.
It is designed to be hosted on Apicast itself (or any nginx instance) in order to simplify the deployment.
Put dynamic-router.conf
in /opt/app-root/src/apicast.d/dynamic-router.conf
:
oc create configmap apicast.d --from-file=apicast-module/dynamic-router.conf
oc volume dc/apicast-staging --add --name=apicastd --mount-path /opt/app-root/src/apicast.d/ --type=configmap --configmap-name=apicast.d
Put dynamic-router-upstream.conf
and catalog.conf
in /opt/app-root/src/sites.d/
:
oc create configmap sites.d --from-file=apicast-module/dynamic-router-upstream.conf --from-file=catalog/catalog.conf
oc volume dc/apicast-staging --add --name=sitesd --mount-path /opt/app-root/src/sites.d/ --type=configmap --configmap-name=sites.d
Put catalog.lua
and dynamic-router.lua
in /opt/app-root/src/src/custom/
:
oc create configmap apicast-custom-module --from-file=apicast-module/dynamic-router.lua --from-file=catalog/catalog.lua
oc volume dc/apicast-staging --add --name=apicast-custom-module --mount-path /opt/app-root/src/src/custom/ --type=configmap --configmap-name=apicast-custom-module
Set the configuration required by the catalog and the dynamic routing module as environment variables and re-deploy apicast:
oc env dc/apicast-staging APICAST_CUSTOM_CONFIG=custom/dynamic-router
oc env dc/apicast-staging DYNAMIC_ROUTER_CATALOG_URL=http://127.0.0.1:8082
oc env dc/apicast-staging DYNAMIC_ROUTER_ENVIRONMENT_HEADER_NAME=x-env
oc rollout latest apicast-staging
Once, you get it to work on apicast-staging
, you can do the same on apicast-production
.