Chuyển tới nội dung

Giới thiệu YARP API Gateway

🧩 Giới thiệu về YARP (Yet Another Reverse Proxy)

YARP là một thư viện mã nguồn mở của Microsoft, được xây dựng trên .NET, dùng để tạo reverse proxy và load balancer linh hoạt, có thể tùy biến sâu bằng code.
Khác với các proxy truyền thống (như NGINX, HAProxy, Envoy), YARP được thiết kế để nhúng trực tiếp vào ứng dụng .NET, hoặc triển khai như một Ingress Controller trên Kubernetes.

⚙️ 1. Mục đích của YARP

  • Tạo reverse proxy nhẹ mà vẫn mạnh mẽ.
  • Tuỳ biến pipeline HTTP: thêm middleware, xác thực, logging, caching… như ứng dụng ASP.NET Core thông thường.
  • Tích hợp dễ dàng với hệ sinh thái .NET (Serilog, gRPC, IdentityServer, v.v.).
  • Làm Ingress Controller cho Kubernetes — Microsoft cung cấp sample chính thức để YARP nhận Ingress YAML rồi route traffic đến các Service trong cluster.

🧠 2. Kiến trúc tổng quan

Cấu trúc cơ bản của YARP gồm 3 phần:

YARP Reverse Proxy Architecture

Yet Another Reverse Proxy — API Gateway Pattern

🛡️ YARP Features

  • High-performance .NET reverse proxy
  • Dynamic configuration reload
  • Built-in health checks
  • Session affinity support

🌐 Request Flow

  1. Client gửi request đến YARP proxy
  2. YARP xác thực và áp dụng policies
  3. YARP route request đến backend service
  4. Service xử lý và trả response qua YARP
Example Routes
/api/users/* → Service A (User API)
/api/orders/* → Service B (Order API)
/api/payments/* → Service C (Payment API)

Bên trong YARP có:

  1. Ingress Layer (HTTP Listener): nhận request từ client.
  2. Routing Layer: quyết định route dựa vào routes hoặc Ingress (nếu dùng K8S).
  3. Transforms & Middleware: áp dụng quy tắc rewrite, header transform, auth…
  4. Cluster Management: quản lý các backend (targets) và load balancing.

🏗️ 3. Cách cấu hình cơ bản

YARP có thể cấu hình bằng:

  • File appsettings.json
  • Hoặc dynamic config (database, API…)

Ví dụ: cấu hình trong file appsettings.json:

{
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "apiCluster",
        "Match": {
          "Path": "/api/{**catch-all}"
        }
      }
    },
    "Clusters": {
      "apiCluster": {
        "Destinations": {
          "api1": { "Address": "https://api1.internal.local/" },
          "api2": { "Address": "https://api2.internal.local/" }
        },
        "LoadBalancingPolicy": "RoundRobin"
      }
    }
  }
}

☸️ 4. YARP làm Ingress Controller trên Kubernetes

YARP có thể trở thành Ingress Controller bằng cách dùng mẫu:

KubernetesIngress.Sample – Microsoft YARP GitHub

Nguyên lý:

  • Một Pod chạy YARP, có Service LoadBalancer hoặc NodePort.
  • YARP đọc tài nguyên Ingress trong cluster (watch API).
  • Khi có Ingress mới (ingressClassName: yarp), YARP tự cập nhật route mapping nội bộ.

Mẫu IngressClass:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: yarp
spec:
  controller: yarp.microsoft.com/ingress-controller

Ingress demo:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
spec:
  ingressClassName: yarp
  rules:
  - host: api.diendo.pro.vn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80

🚀 5. Ưu điểm của YARP

  • Viết bằng .NET 6/7/8 – tận dụng pipeline của ASP.NET Core
  •  Tuỳ biến cực cao – bạn có thể xử lý request/response ngay trong code
  •  Tích hợp dễ – plugin logging, auth, telemetry…
  •  Có thể chạy standalone hoặc như Ingress Controller
  •  Hỗ trợ HTTP/2, WebSocket, gRPC, TLS termination, Load Balancing

⚠️ 6. Một vài hạn chế

  • Cộng đồng nhỏ hơn so với NGINX, Envoy, Kong.
  • Không phải là reverse proxy “cấu hình sẵn” – bạn cần tự build ứng dụng .NET.
  • Chưa có đủ plugin ecosystem như Kong hay Traefik.
Liên hệ