Skip to main content

Kong Routes

Introduction

Routes are a fundamental component of Kong API Gateway that determine how client requests are sent to your upstream services. In essence, a route defines rules for matching client requests and forwarding them to the appropriate service.

When you're building an API infrastructure with Kong, routes work in tandem with services to create a complete request path. Think of routes as the entry points to your API ecosystem - they receive client requests based on specific rules and direct those requests to the configured services.

Understanding Routes in Kong

In Kong's architecture, routes are always associated with a service. While a service represents your upstream API or microservice, a route defines the way clients can access that service.

Let's break down the key components of a Kong route:

Route Properties

Routes in Kong are configured using several properties:

  1. Protocols: Defines which protocols the route should allow (http, https, tcp, tls, udp, grpc, grpcs)
  2. Methods: HTTP methods that the route should match (GET, POST, PUT, etc.)
  3. Hosts: Host domains that the route should match
  4. Paths: URL paths that the route should match
  5. Headers: HTTP headers that the route should match
  6. Tags: Metadata for organizing and filtering routes

Creating and Managing Routes

Let's explore how to create and manage routes in Kong using both the Admin API and declarative configuration.

Using the Admin API

Creating a Route

To create a route associated with a service:

bash
# First, create a service if you don't have one
curl -i -X POST http://localhost:8001/services \
--data "name=example-service" \
--data "url=http://example.com"

# Then create a route for that service
curl -i -X POST http://localhost:8001/services/example-service/routes \
--data "name=example-route" \
--data "paths[]=/api" \
--data "methods[]=GET" \
--data "methods[]=POST"

The response will contain the created route details:

json
{
"id": "a1b2c3d4-5678-90ab-cdef-ghijklmnopqr",
"name": "example-route",
"paths": ["/api"],
"methods": ["GET", "POST"],
"protocols": ["http", "https"],
"service": {
"id": "e5f6g7h8-9012-34ij-klmn-opqrstuvwxyz"
},
"created_at": 1613146536
}

Listing Routes

To list all routes:

bash
curl -i http://localhost:8001/routes

To list routes associated with a specific service:

bash
curl -i http://localhost:8001/services/example-service/routes

Updating a Route

To update a route:

bash
curl -i -X PATCH http://localhost:8001/routes/example-route \
--data "paths[]=/api/v2" \
--data "paths[]=/api/v1"

Deleting a Route

To delete a route:

bash
curl -i -X DELETE http://localhost:8001/routes/example-route

Using Declarative Configuration (YAML)

Kong also supports declarative configuration using YAML files:

yaml
_format_version: "2.1"
services:
- name: example-service
url: http://example.com
routes:
- name: example-route
paths:
- /api
methods:
- GET
- POST
protocols:
- http
- https

To apply this configuration:

bash
kong config db_import kong.yml

Route Matching Rules

Kong routes match incoming requests based on specific criteria. Let's look at how each matching rule works:

Path Matching

Routes can match requests based on the request path. For example, if you define a route with the path /api/users, it will match requests to http://example.com/api/users.

Kong supports both exact and prefix matching:

yaml
routes:
- paths:
- /api/users # Matches /api/users and /api/users/123

To make the route match only the exact path, use the strip_path parameter:

yaml
routes:
- paths:
- /api/users
strip_path: true # Will only match exactly /api/users

Host Matching

Routes can match based on the host header:

yaml
routes:
- hosts:
- api.example.com
- service.example.org

Method Matching

Match specific HTTP methods:

yaml
routes:
- methods:
- GET
- POST

Header Matching

Match based on request headers:

yaml
routes:
- headers:
x-api-version:
- "v1"
- "v2"

Practical Examples

Let's look at some real-world examples of Kong routes.

Example 1: API Versioning

yaml
_format_version: "2.1"
services:
- name: user-service-v1
url: http://user-service-v1.internal:8000
routes:
- name: user-api-v1
paths:
- /api/v1/users

- name: user-service-v2
url: http://user-service-v2.internal:8000
routes:
- name: user-api-v2
paths:
- /api/v2/users

This configuration creates two services with different versions, each with its own route. Requests to /api/v1/users go to the v1 service, while requests to /api/v2/users go to the v2 service.

Example 2: Multi-Domain Routing

yaml
_format_version: "2.1"
services:
- name: main-website
url: http://main-website.internal:8000
routes:
- name: website-route
hosts:
- example.com
- www.example.com

- name: api-service
url: http://api-backend.internal:8000
routes:
- name: api-route
hosts:
- api.example.com

This example routes traffic to different services based on the domain name.

Example 3: Microservices Architecture

Here's an example of how Kong routes can be used in a microservices architecture:

yaml
_format_version: "2.1"
services:
- name: user-service
url: http://user-service:8000
routes:
- name: user-routes
paths:
- /users
- /profiles

- name: order-service
url: http://order-service:8000
routes:
- name: order-routes
paths:
- /orders
- /cart

- name: payment-service
url: http://payment-service:8000
routes:
- name: payment-routes
paths:
- /payments
- /transactions

In this example, Kong acts as an API Gateway, routing different API endpoints to their respective microservices.

Advanced Route Configuration

Using Regular Expressions in Paths

Kong supports regular expressions in route paths using the ~ prefix:

yaml
routes:
- paths:
- ~/users/\d+ # Matches /users/123, /users/456, etc.

Route Priorities

When multiple routes might match a request, Kong uses a priority system:

yaml
routes:
- name: specific-route
paths:
- /api/users/premium
priority: 20 # Higher priority route

- name: general-route
paths:
- /api/users
priority: 10 # Lower priority route

In this example, a request to /api/users/premium will match the specific-route because it has a higher priority.

Troubleshooting Routes

If your routes aren't matching as expected:

  1. Check for conflicts: Multiple routes might match the same request
  2. Verify protocols: Ensure you've specified the correct protocols
  3. Check strip_path behavior: Be aware of how strip_path affects your routing
  4. Examine priority: Routes with higher priority are matched first
  5. Use the debug plugin: Add the debug plugin to see detailed routing information
bash
curl -i -X POST http://localhost:8001/routes/problem-route/plugins \
--data "name=request-transformer" \
--data "config.add.headers=X-Debug-Route:true"

Kong Routes and Plugins

Routes can have plugins applied to them, allowing for functionality like authentication, rate limiting, and more:

yaml
_format_version: "2.1"
services:
- name: api-service
url: http://api.internal:8000
routes:
- name: secure-api
paths:
- /secure
plugins:
- name: key-auth
config:
key_names: ["apikey"]

This example applies the key authentication plugin specifically to the /secure route.

Summary

Kong routes are a powerful mechanism for directing traffic in your API infrastructure. They:

  • Connect client requests to your services
  • Provide flexible matching based on paths, hosts, methods, and headers
  • Support advanced features like regex matching and priorities
  • Can be configured via Admin API or declarative configuration
  • Work seamlessly with Kong plugins for enhanced functionality

By mastering Kong routes, you can create sophisticated API architectures that direct traffic efficiently and apply different policies to different endpoints.

Further Learning

To deepen your understanding of Kong routes:

  1. Experiment with different matching rules
  2. Try combining routes with various Kong plugins
  3. Explore route transformations with the request-transformer plugin
  4. Practice creating a microservices architecture with appropriate routes

Exercise: Create a Kong configuration for a blog application with separate services for posts, comments, and user authentication, each with appropriate routes.



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)