/
API Gateways with Dedicated Backends
com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links' is unknown.

API Gateways with Dedicated Backends

You can extend the multiple Gateway environments feature using the dynamic endpoint capabilities of WSO2 API Manager to have each gateway point to a different backend endpoint. API Gateway is the actual runtime of the APIs to which are developed and Published from the API Publisher. WSO2 API Manager is capable of publishing APIs to different gateways. API users connect to those API Gateways to do the actual API calls through the applications they have subscribed to. For more information on publishing to multiple gateways, see Maintaining Separate Production and Sandbox Gateways.

However, when the API publisher can only provide a single static Endpoint for an API in the implementation. Therefore, the API call is directed to a single endpoint, independent of the gateway that the API is deployed, as shown in the diagram below.

But in most situations, you would want to have each Gateway proxying a dedicated backend API. WSO2 API Manager provides capability to specify dynamic endpoint URLs at the time of specifying the API endpoint URL. This URL will be resolved at the runtime with the details (host and port) we specify in the startup of each gateway. With the given information, each gateway will point to the dedicated backend APIs as shown in the digram below.

Configuring Dynamic Endpoints

Follow the below step to Configure dynamic endpoint as the API endpoint.

  1. Start WSO2 API Manager Server which includes the API Publisher Component and create an API.
  2. Go to the implement stage of the API and replace Host and Port of the API endpoint with {uri.var.host} and {uri.var.port} respectively as shown below.
  3. Save and Publish API. 

    Refer Create and Publish an API for more information on creating and Publishing the API.

  4. Create a java class extending the AbstractMediator class of org.synapse.core as below and create the jar file out of it.

    We use Java system properties which will be set at the server start-up process of each Gateway to resolve the variables which are defined as properties in this sequence.

    import org.apache.synapse.MessageContext;
    import org.apache.synapse.mediators.AbstractMediator;
    
    public class EnvironmentResolver extends AbstractMediator {
    
        @Override
        public boolean mediate(MessageContext messageContext) {
    
            String host = System.getProperty("environment.host");
            String port = System.getProperty("environment.port");
    
            messageContext.setProperty("uri.var.host", host);
            messageContext.setProperty("uri.var.port", port);
    
            return true;
        }
    
        @Override
        public boolean isContentAware(){
            return false;
        }
    }
  5. Add the created jar into <AM_HOME>/repository/components/lib folder of each Gateway. You can download a sample jar file created from here.

  6. Add following sequence to <AM_HOME>/repository/deployment/server/synapse-configs/sequences folder of each Gateway.

    <sequence xmlns="http://ws.apache.org/ns/synapse" name="WSO2AM--Ext--In">
            <class name="org.wso2.carbon.env.EnvironmentResolver"/>
    </sequence>

    org.wso2.carbon.env.EnvironmentResolver is the fully qualified name of the class that contains the code responsible for converting system variables into properties. It is a special class we created which needs to be extended from the org.apache.synapse.mediators.AbstractMediator class and requires overriding the 'mediate' function. 

  7. Execute the following command when starting up each Gateway to set the system variables at the server start up from within the <APIM_HOME>/bin directory by replacing the following values.

    <ip_of_backend_environment>
    <port_of_backend_environment>
    host IP of the Gatewayport where the Gateway is running in the dedicated machine or VM
    ./wso2server.sh -Denvironment.host=<ip_of_backend_environment> -Denvironment.port=<port_of_backend_environment>


    Now the Gateways have started with the dedicated backend host/port combinations.

  8. Invoke the API.

    You will get the response from the API which has sent to the dedicated backend through the Gateway that this API is published.

Related content

com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links2' is unknown.