Skip to content

Route Mechanism

Rodrigo Coelho edited this page Jul 15, 2023 · 2 revisions

How CAPI create Routes?

Rest Definition:

rest().get(routeUtils.buildFrom(api)
    + Constants.MATCH_ON_URI_PREFIX
    + api.isMatchOnUriPrefix());

Direct Definition

routeDefinition = from(Constants.CAMEL_DIRECT + routeId);

If CAPI is running behind a reverse proxy:

routeDefinition
    .setHeader(Constants.X_FORWARDED_HOST, constant(reverseProxyHost));
    .setHeader(Constants.X_FORWARDED_PREFIX, constant(capiContext + api.getContext()));

Exception Handling

routeDefinition
    .onException(Exception.class)
    .handled(true)
    .setHeader(Constants.ERROR_API_SHOW_TRACE_ID, constant(isZipkinTraceIdVisible))
    .setHeader(Constants.ERROR_API_SHOW_INTERNAL_ERROR_MESSAGE, constant(isInternalExceptionMessageVisible))
    .setHeader(Constants.ERROR_API_SHOW_INTERNAL_ERROR_CLASS, constant(isInternalExceptionVisible))
    
    .process(httpErrorProcessor)
    
    .setHeader(Constants.ROUTE_ID_HEADER, constant(routeID))
    .toF(Constants.FAIL_REST_ENDPOINT_OBJECT, capiGatewayErrorEndpoint)
    .removeHeader(Constants.ERROR_API_SHOW_TRACE_ID)
    .removeHeader(Constants.ERROR_API_SHOW_INTERNAL_ERROR_MESSAGE)
    .removeHeader(Constants.ERROR_API_SHOW_INTERNAL_ERROR_CLASS)
    .removeHeader(Constants.CAPI_URL_IN_ERROR)
    .removeHeader(Constants.CAPI_URI_IN_ERROR)
    .removeHeader(Constants.ROUTE_ID_HEADER)
    .end();

Build a producer endpoint with Load Balancer and Failover support

if(api.isFailoverEnabled()) {
    routeDefinition
        .process(metricsProcessor)
        .loadBalance()
        .failover(1, false, api.isRoundRobinEnabled(), false)
        .to(routeUtils.buildEndpoints(api))
        .end()
        .removeHeader(Constants.X_FORWARDED_HOST)
        .removeHeader(Constants.X_FORWARDED_PREFIX)
        .routeId(routeId); 
}

Build a producer endpoint with Sticky session support (Please see CAPI implementation)

if(api.isStickySession()) {
    routeDefinition
        .process(metricsProcessor)
        .loadBalance(new **SessionChecker**(stickySessionCacheManager, api.getStickySessionParam(), api.isStickySessionParamInCookie()))
        .to(routeUtils.buildEndpoints(api))
        .end()
        .removeHeader(Constants.X_FORWARDED_HOST)
        .removeHeader(Constants.X_FORWARDED_PREFIX)
        .routeId(routeId);
}

Build a producer endpoint with Tenant aware support (Please see CAPI implementation)

if(api.isTenantAware()) {
    routeDefinition
        .process(metricsProcessor)
        .loadBalance(new **TenantAwareLoadBalancer**())
        .to(routeUtils.buildEndpoints(api))
        .end()
        .removeHeader(Constants.X_FORWARDED_HOST)
        .removeHeader(Constants.X_FORWARDED_PREFIX)
        .routeId(routeId);
}

Build a default producer endpoint

routeDefinition
    .process(metricsProcessor)
    .to(routeUtils.buildEndpoints(api))
    .end()
    .removeHeader(Constants.X_FORWARDED_HOST)
    .removeHeader(Constants.X_FORWARDED_PREFIX)
    .routeId(routeId);

All routes are enabled with metrics. Zipkin is optional (if enabled in the configuration)

routeUtils.registerMetric(routeId);
    api.setRouteId(routeId);
    routeUtils.registerTracer(api);