license: Add MIT license
This commit is contained in:
196
.docs/usage.md
196
.docs/usage.md
@@ -47,14 +47,13 @@ Response: `OK`
|
||||
After configuring routes in `gateway.yaml`, make requests to the gateway:
|
||||
|
||||
```bash
|
||||
# Example: Request to a route configured at /api/v1/dev/*
|
||||
curl http://localhost:8080/api/v1/dev/users
|
||||
# Example: Request to a route configured at /api/v1/*
|
||||
curl http://localhost:8080/api/v1/users
|
||||
|
||||
# With API key authentication
|
||||
curl -H "X-Api-Key: your-key-here" http://localhost:8080/api/v1/dev/data
|
||||
|
||||
# With session authentication
|
||||
curl -H "Authorization: Bearer token" http://localhost:8080/api/v1/protected
|
||||
# All HTTP methods are supported
|
||||
curl -X POST http://localhost:8080/api/v1/data
|
||||
curl -X PUT http://localhost:8080/api/v1/data/123
|
||||
curl -X DELETE http://localhost:8080/api/v1/data/123
|
||||
```
|
||||
|
||||
## Route Examples
|
||||
@@ -65,6 +64,7 @@ curl -H "Authorization: Bearer token" http://localhost:8080/api/v1/protected
|
||||
```yaml
|
||||
routes:
|
||||
- id: "api"
|
||||
api: "api-001"
|
||||
path: "/api/v1/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
@@ -76,65 +76,57 @@ routes:
|
||||
- Gateway strips: `/api/v1`
|
||||
- Backend receives: `/users/123`
|
||||
|
||||
### Authentication Example
|
||||
### Multiple Routes Example
|
||||
|
||||
**Configuration:**
|
||||
```yaml
|
||||
security:
|
||||
auth:
|
||||
enabled: true
|
||||
type: "api_key"
|
||||
header: "X-Api-Key"
|
||||
routes:
|
||||
- id: "public-route"
|
||||
api: "api-001"
|
||||
path: "/public/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/public"
|
||||
|
||||
- id: "api-route"
|
||||
api: "api-001"
|
||||
path: "/api/v1/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/api/v1"
|
||||
```
|
||||
|
||||
**Valid request:**
|
||||
**Requests:**
|
||||
```bash
|
||||
curl -H "X-Api-Key: secret123" http://localhost:8080/api/v1/data
|
||||
```
|
||||
# Public route - backend receives /status
|
||||
curl http://localhost:8080/public/status
|
||||
|
||||
**Invalid request (missing header):**
|
||||
```bash
|
||||
curl http://localhost:8080/api/v1/data
|
||||
# Returns: 401 Unauthorized
|
||||
```
|
||||
|
||||
### WAF Method Filtering Example
|
||||
|
||||
**Configuration:**
|
||||
```yaml
|
||||
security:
|
||||
waf:
|
||||
enabled: true
|
||||
methods: ["GET", "POST"]
|
||||
```
|
||||
|
||||
**Allowed:**
|
||||
```bash
|
||||
curl -X GET http://localhost:8080/api/v1/data
|
||||
curl -X POST http://localhost:8080/api/v1/data
|
||||
```
|
||||
|
||||
**Blocked:**
|
||||
```bash
|
||||
curl -X DELETE http://localhost:8080/api/v1/data
|
||||
# Returns: 403 Forbidden
|
||||
# API route - backend receives /users
|
||||
curl http://localhost:8080/api/v1/users
|
||||
```
|
||||
|
||||
## Logging
|
||||
|
||||
The gateway uses structured logging via `masterlog`. Logs include:
|
||||
The gateway uses structured JSON logging via `masterlog`. All HTTP requests are logged with:
|
||||
|
||||
- Request ID (if enabled)
|
||||
- Client IP (if real_ip enabled)
|
||||
- Request method and path
|
||||
- Response status
|
||||
- Response status code
|
||||
- Request duration
|
||||
- Host header
|
||||
|
||||
**Example log output:**
|
||||
```json
|
||||
{
|
||||
"level": "info",
|
||||
"msg": "Registering route",
|
||||
"path": "/api/v1/dev/*"
|
||||
"msg": "HTTP Request",
|
||||
"method": "GET",
|
||||
"path": "/api/v1/users",
|
||||
"status": 200,
|
||||
"duration": "45ms",
|
||||
"host": "localhost:8080",
|
||||
"ip": "127.0.0.1:52342"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -147,30 +139,116 @@ The gateway uses structured logging via `masterlog`. Logs include:
|
||||
lsof -i :8080
|
||||
```
|
||||
|
||||
2. Verify configuration file exists and is valid YAML
|
||||
2. Verify configuration file exists and is valid YAML:
|
||||
```bash
|
||||
cat ../gateway.yaml
|
||||
```
|
||||
|
||||
3. Check logs for detailed error messages
|
||||
|
||||
### 401 Unauthorized
|
||||
### 404 Not Found
|
||||
|
||||
- Verify auth header is included
|
||||
- Check header name matches configuration
|
||||
- Verify path is not excluded from auth
|
||||
|
||||
### 403 Forbidden
|
||||
|
||||
- Check WAF method configuration
|
||||
- Verify HTTP method is allowed
|
||||
- Verify the route path matches your request
|
||||
- Check chi route pattern syntax (use `/*` for wildcards)
|
||||
- Ensure the route is registered (check startup logs)
|
||||
|
||||
### Backend connection errors
|
||||
|
||||
- Verify API target URL is correct
|
||||
- Check backend service is running
|
||||
- Verify network connectivity
|
||||
- Verify target URL is correct in configuration
|
||||
- Check backend service is running and accessible
|
||||
- Verify network connectivity from gateway to backend
|
||||
- Check DNS resolution if using domain names
|
||||
|
||||
### Route not matching
|
||||
|
||||
- Ensure request path matches the route pattern exactly
|
||||
- Remember that `/*` matches zero or more path segments
|
||||
- Check that multiple routes don't have conflicting patterns
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
- The gateway uses Go's `httputil.ReverseProxy` for efficient proxying
|
||||
- HTTP/2 is supported when both client and backend support it
|
||||
- Keep-alive connections are reused by default
|
||||
- Consider connection pooling for high-traffic scenarios
|
||||
- Monitor memory usage with high request volumes
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### API Versioning
|
||||
|
||||
```yaml
|
||||
routes:
|
||||
- id: "v1-api"
|
||||
api: "api-001"
|
||||
path: "/api/v1/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/api/v1"
|
||||
|
||||
- id: "v2-api"
|
||||
api: "api-001"
|
||||
path: "/api/v2/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/api/v2"
|
||||
```
|
||||
|
||||
### Microservices Routing
|
||||
|
||||
```yaml
|
||||
targets:
|
||||
- id: "user-service"
|
||||
name: "User Service"
|
||||
url: "https://user-service.internal"
|
||||
- id: "order-service"
|
||||
name: "Order Service"
|
||||
url: "https://order-service.internal"
|
||||
|
||||
apis:
|
||||
- id: "user-api"
|
||||
host: "host-001"
|
||||
target: "user-service"
|
||||
- id: "order-api"
|
||||
host: "host-001"
|
||||
target: "order-service"
|
||||
|
||||
routes:
|
||||
- id: "users-route"
|
||||
api: "user-api"
|
||||
path: "/users/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/users"
|
||||
|
||||
- id: "orders-route"
|
||||
api: "order-api"
|
||||
path: "/orders/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/orders"
|
||||
```
|
||||
|
||||
### External API Proxy
|
||||
|
||||
```yaml
|
||||
targets:
|
||||
- id: "external-api"
|
||||
name: "External API"
|
||||
url: "https://api.external.com"
|
||||
|
||||
apis:
|
||||
- id: "external"
|
||||
host: "host-001"
|
||||
target: "external-api"
|
||||
|
||||
routes:
|
||||
- id: "external-proxy"
|
||||
api: "external"
|
||||
path: "/proxy/external/*"
|
||||
strip_prefix:
|
||||
enabled: true
|
||||
prefix: "/proxy/external"
|
||||
```
|
||||
|
||||
Request to `/proxy/external/users` becomes `/users` on the external API.
|
||||
|
||||
Reference in New Issue
Block a user