Header Ads Widget

Ticker

6/recent/ticker-posts

Hướng dẫn cách chia nhỏ config file Krakend ra để dễ dàng quản lý

Keywords: How to multi files config of Krakend to manager

Hôm nay mình mang đến cho các bạn một bài viết khá là thú vị đây, vì nó liên quan tới Krakend một API Gateway cũng được xem là hàng xịn sò, thật ra trước giờ mình cũng chỉ nghe đến Kong và một số API Gateway khác, đây cũng là lần đầu mình tiếp xúc với nó, vì do công việc tại môi trường mới. Nhưng mà thôi, càng tìm hiểu nhiều thì mình biết nhiều chứ sao, tại sao có bài viết này ? là vì Krakend nó đúng vỏn vẹn 1 file config cho tất cả, vâng cũng vì vấn đề đó về lâu dài, file config này sẻ phình to ra và sẻ rất dài, chính vì cái lý do đó mà hôm nay mình sẻ hướng dẫn cho các bạn cách chia nhỏ những config đó ra, thành nhiều files.

Như lúc đầu mình nói, thằng Krakend này nó chỉ sử dụng đúng 1 file 1 đó là file "krakend.json" vậy tại sao mình nói với các bạn là mình sẻ tách nó ra, thật ra đó là một thủ thuật nhỏ, nghĩa là chúng ta sẻ chia ra thành nhiều thành phần. Sau đó chạy 1 câu lệnh build, để gọp chúng lại thành 1 file "krakend.json" và đưa nó cho Krakend sử dụng, à quên phần giới thiệu Krakend là gì thì các bạn có thể tìm hiểu thêm tại Google nhé, chứ mình không tiện giải thích ở đây, để có thể tách Krakend ra cho dễ quản lý chúng ta cần tạo ra 3 folder và 1 file krakend.json gốc như hình dưới
Mẫu

Mình sẻ có một file config "krakend.json" làm mẫu cho các bạn như sau, tối thiểu một config Krakend không bị lỗi thì ít nhất cần có những config này trong đó

{
  "version": 2,
  "extra_config": {{ include "krakend_extra_config.tmpl" | nindent 2 }},
  "timeout": "30000ms",
  "cache_ttl": "0s",
  "output_encoding": "no-op",
  "name": "API Gateway",
  "host": [ "https://api-gateway.itblognote.com" ],
  "port": {{ .service.port }},
  "disable_rest": {{ .service.disable_rest }},
  "endpoints": [{{ include "endpoint_users_login.tmpl" | nindent 4 }},
  {{- include "endpoint_users_index.tmpl" | nindent 4 }}
  ]
}
Ok bây giờ mình sẻ show từng config cho các bạn xem nhé, mấy cái config này giống y hệt config helm nên thành ra cũng không khó khăn gì mấy, folder settings và templates mình sẻ không đụng chạm đến vì sao ?
  1. Mình chưa hoàn toàn tối ưu hết khả năng của multi config trong Krakend, cái mình làm cho các bạn chỉ là demo và cơ bản để các bạn hiểu được nó hoạt động thế nào, nó ra làm sao thôi
  2. Với mình chia nhỏ như vậy là quá đủ với mình rồi, mình không cần thiết phải chia 1 cách chi tiết hơn nữa, nên thành ra mình không sử dụng 2 folder này, vì vậy mình chỉ cần một folder partials là đủ cho tất cả
Như 2 tiêu chí ở trên mình sẻ hướng dẫn cho các bạn với 2 phần công lực của multi krakend config thôi đó là file krakend.json chính và folder partials nên vì vậy 2 folder còn lại bạn tìm hiểu trên trang chủ của nó nhé
Ở config extra_config mình đã đẩy file tmpl từ folder partials vào và cả endpoints cũng thế
Như các bạn đã thấy ứng với 1 include là 1 file tmpl định dạng của folder partials là thế, trong đó lần lượt 3 file sẻ như sau nhé
1-krakend_extra_config.tmpl
{
  "github_com/devopsfaith/krakend-logstash": {
    "enabled": true
  },
  "github_com/devopsfaith/krakend-gologging": {
    "level": "ERROR",
    "prefix": "[KRAKEND]",
    "syslog": false,
    "stdout": true,
    "format": "logstash"
  },
  "github_com/devopsfaith/krakend-cors": {
    "allow_origins": [
      "*"
    ],
    "expose_headers": [
      "*"
    ],
    "max_age": "300s",
    "allow_methods": [
      "OPTIONS",
      "HEAD",
      "GET",
      "POST",
      "PUT",
      "DELETE"
    ],
    "allow_headers": [
      "*"
    ],
    "allow_credentials": true
  },
  "github_com/devopsfaith/krakend-metrics": {
    "collection_time": "30s",
    "proxy_disabled": false,
    "router_disabled": false,
    "backend_disabled": false,
    "endpoint_disabled": false,
    "listen_address": "127.0.0.1:8090"
  }
}
2-endpoint_users_login.tmpl
{
  "endpoint": "/users/login",
  "method": "POST",
  "output_encoding": "no-op",
  "extra_config": {},
  "headers_to_pass": [
    "Content-Type",
    "Content-Length",
    "Content-Language"
  ],
  "backend": [
    {
      "url_pattern": "/users/login",
      "encoding": "no-op",
      "sd": "static",
      "method": "POST",
      "extra_config": {},
      "host": [
        "http://user.itblognote.com"
      ],
      "disable_host_sanitize": false
    }
  ]
}
3-endpoint_users_index.tmpl
{
  "endpoint": "/users/index",
  "method": "GET",
  "output_encoding": "no-op",
  "extra_config": {},
  "headers_to_pass": [
    "Authorization",
    "Content-Language"
  ],
  "querystring_params": [
    "ids",
    "employee_ids",
    "ids[]",
    "employee_ids[]",
    "search"
  ],
  "backend": [
    {
      "url_pattern": "/users/index",
      "encoding": "no-op",
      "sd": "static",
      "method": "GET",
      "extra_config": {},
      "host": [
        "http://user.itblognote.com"
      ],
      "disable_host_sanitize": false
    }
  ]
}
3 files config, trong đó 1 config có nhiệm vụ add plugin cho krakend và 2 config cuối cùng là endpoint để proxy cho api
Sau đó mình thực hiện chạy lệnh build để nó gọp 3 file config này thành 1 file duy nhất là file krakend.config bằng lệnh sau
FC_ENABLE=1 \
FC_SETTINGS="$PWD/krakend-itblognote/settings" \
FC_PARTIALS="$PWD/krakend-itblognote/partials" \
FC_TEMPLATES="$PWD/krakend-itblognote/templates" \
FC_OUT=output-krakend.json \
/root/krakend check -t -d -c "$PWD/krakend-itblognote/krakend.json"
Các bạn đừng chú ý đến các folder khác chẳng qua mình có nhiều môi trường nên vì thế mình có nhiều folder thôi, các bạn chỉ cần quan tâm đến folder gốc có chứa 3 thư mục config ở trên là krakend-itblognote là được, nhớ tải krakend về nhé, không có thì nó không build đâu, mình đã bỏ krakend tại root sau khi tải rồi.
Ở đây mình bước ra ngoài thư mục config và thực hiện gõ lệnh trên để tạo ra file "output-krakend.json"
Kết quả trả về "Syntax OK !" là coi như ngon nhé, nghĩa là mình không có lỗi gì cả trong config, vậy bây giờ chúng ta xem thử nội dung của file "output-krakend.json" là gì nhé
{
  "version": 2,
  "extra_config":
  {
    "github_com/devopsfaith/krakend-logstash": {
      "enabled": true
    },
    "github_com/devopsfaith/krakend-gologging": {
      "level": "ERROR",
      "prefix": "[KRAKEND]",
      "syslog": false,
      "stdout": true,
      "format": "logstash"
    },
    "github_com/devopsfaith/krakend-cors": {
      "allow_origins": [
        "*"
      ],
      "expose_headers": [
        "*"
      ],
      "max_age": "300s",
      "allow_methods": [
        "OPTIONS",
        "HEAD",
        "GET",
        "POST",
        "PUT",
        "DELETE"
      ],
      "allow_headers": [
        "*"
      ],
      "allow_credentials": true
    },
    "github_com/devopsfaith/krakend-metrics": {
      "collection_time": "30s",
      "proxy_disabled": false,
      "router_disabled": false,
      "backend_disabled": false,
      "endpoint_disabled": false,
      "listen_address": "127.0.0.1:8090"
    }
  },
  "timeout": "30000ms",
  "cache_ttl": "0s",
  "output_encoding": "no-op",
  "name": "API Gateway",
  "host": [ "https://api-gateway.itblognote.com" ],
  "port": 8080,
  "disable_rest": true,
  "endpoints": [
    {
      "endpoint": "/users/login",
      "method": "POST",
      "output_encoding": "no-op",
      "extra_config": {},
      "headers_to_pass": [
        "Content-Type",
        "Content-Length",
        "Content-Language"
      ],
      "backend": [
        {
          "url_pattern": "/users/login",
          "encoding": "no-op",
          "sd": "static",
          "method": "POST",
          "extra_config": {},
          "host": [
            "http://user.itblognote.com"
          ],
          "disable_host_sanitize": false
        }
      ]
    },
    {
      "endpoint": "/users/index",
      "method": "GET",
      "output_encoding": "no-op",
      "extra_config": {},
      "headers_to_pass": [
        "Authorization",
        "Content-Language"
      ],
      "querystring_params": [
        "ids",
        "employee_ids",
        "ids[]",
        "employee_ids[]",
        "search"
      ],
      "backend": [
        {
          "url_pattern": "/users/index",
          "encoding": "no-op",
          "sd": "static",
          "method": "GET",
          "extra_config": {},
          "host": [
            "http://user.itblognote.com"
          ],
          "disable_host_sanitize": false
        }
      ]
    }
  ]
}
Trên chính là nội dung của file output, nó đã gọp 3 file config lại thành 1 file krakend.json chính, bây giờ chỉ cần chúng ta thực hiện tạo CI/CD với Dockerfile để đưa file output này vào trong môi trường krakend, cho krakend chạy nữa là ngon lành cành đào, nếu như bình thường khi các bạn viết config, các bạn sẻ viết 1 file dài thật là dài như file output vừa mới xuất ra thì bây giờ các bạn có thể chia thành những đoạn ngắn nhỏ và chạy lệnh build để thành 1 file config gốc, rồi  thực hiện lấy files output đó sử dụng là được, nội dung bài viết ngày hôm nay của mình chỉ là hướng dẫn cho các bạn cách để chia cái file krakend khổng lồ này thành những file nhỏ lẻ thôi, giờ là ok rồi đó, chúc các bạn thành công.

Post a Comment

0 Comments