Если вы создаете приложение на основе микросервисов, ключевым преимуществом является разделение задач вашего приложения между отдельными микросервисами, каждый из которых имеет свои собственные возможности масштабирования и инкапсуляции различных функций. Фронтенду — якобы одностраничному приложению, работающему в браузере вашего пользователя — потребуется доступ к микросервисам, составляющим ваше веб-приложение. Каждая служба может быть напрямую доступна в общедоступной сети, но это добавляет проблем с безопасностью.


Однако шлюз API позволяет централизованному уровню решать такие задачи, как аутентификация, мониторинг трафика или преобразование запросов и ответов. Шлюзы API также являются отличным способом использовать ограничение скорости и кэширование для повышения отказоустойчивости и производительности вашего приложения.


Render — это универсальный магазин для развертывания веб-приложений на основе микросервисов непосредственно из существующего репозитория GitHub или GitLab. Хотя Render предоставляет множество ресурсов для поддержки микросервисов и баз данных, один элемент, который нельзя настроить по умолчанию, — это API-шлюз - что-то вроде [AWS API Gateway] (https://docs.aws.amazon.com). /apigateway/latest/developerguide/welcome.html) или [Azure Application Gateway] (https://docs.microsoft.com/en-us/azure/application-gateway/overview). Хотя доступ к API-шлюзу не является надстройкой Render одним щелчком мыши, его все же можно запустить и запустить.


В этом посте мы рассмотрим, как настроить Render для маршрутизации на основе пути, чтобы мы могли использовать Kong Gateway перед нашими микросервисами. Начнем с краткого обзора нашего подхода.


Обзор нашего мини-проекта


Мы развернем два простых бэкенда микросервиса с помощью Render. Один будет сервисом Python Flask, а другой — сервисом Node.js, построенным на Express.



Ожидаемый конечный результат показан на рис. 1. Мы развернули две частные службы и одну веб-службу, Kong, которая будет принимать и направлять запросы к этим частным службам. С точки зрения клиента они взаимодействуют с одним приложением. На самом деле они запрашивают ресурсы через экосистему микросервисов.


Микросервисы, развернутые как частные сервисы


В Render существует два основных типа развертывания сервисов: веб-сервисы и частные сервисы. . Веб-службы напрямую доступны в общедоступной сети. С другой стороны, частные сервисы доступны только в частном облаке внутри экосистемы вашей учетной записи Render. Это хорошо, потому что позволяет лучше контролировать безопасность и доступ в экосистеме микросервисов.


Оба наших микросервиса будут развернуты как частные сервисы.


Kong Gateway развернут как веб-служба


[Kong] (https://docs.konghq.com/gateway/) — это высокопроизводительный API-шлюз с открытым исходным кодом, используемый сегодня во многих крупнейших веб-приложениях в мире. Несмотря на то, что существует множество вариантов шлюзов API, Kong выделяется тем, что он не зависит от облака и приложений, легко настраивается и - что, возможно, наиболее важно - быстро.


Мы развернем Kong Gateway как веб-службу, доступную через общедоступную сеть. Kong (и только Kong) будет иметь доступ к двум нашим частным микросервисам, и мы настроим его для соответствующей маршрутизации запросов.


Развертывание микросервисов с Render


Начнем с настройки и развертывания двух наших микросервисов.


Микросервис «Пользователи» с Python и Flask


Flask — это сервисная платформа для Python с низким порогом входа. Один файл Python — это все, что нам нужно, чтобы получить минимальный API и запустить его с помощью Flask. Код этого сервиса доступен на GitHub. Следующий фрагмент кода создает рабочую службу с конечной точкой /users, которая возвращает простой ответ JSON и код состояния:


```питон


из фляги импортировать флягу, jsonify


приложение = фляга (имя)


@app.route("/пользователи")


определение корня():


вернуть jsonify({'userId': 42}), 200


если name == "main":


app.run(хост='0.0.0.0')


Важно отметить, что для того, чтобы Render автоматически отображал правильный хост и порт для вашей службы, вы должны убедиться, что вы привязываете свое приложение к 0.0.0.0, а не localhost или 127.0.0.1. Разница между «0.0.0.0» и «127.0.0.1» заключается в области, из которой принимаются входящие запросы. Разрешены только запросы с одной и той же машины с использованием 127.0.0.1, который является обычным адресом обратной связи. Адрес 0.0.0.0 позволяет Render получать запросы от любого сетевого интерфейса и то, что нам здесь нужно.


Чтобы развернуть это как частную службу в Render, сначала нажмите кнопку New на панели инструментов Render и выберите репозиторий git с помощью приложения Flask. Установите службу Имя и Команду запуска. Все остальные параметры конфигурации можно оставить со значениями по умолчанию. Кроме того, вы можете добавить в свой репозиторий файл render.yaml, который настраивает способ развертывания этой службы. Однако в нашей демонстрации мы рассмотрим пользовательский интерфейс.



У Render есть бесплатные уровни вплоть до предложений хостинга корпоративного уровня. Выберите тот, который соответствует вашим потребностям. Выберите ветку, которую вы хотите развернуть, и настройте команды сборки и запуска. Как правило, для приложения Python создание приложения требует наличия всех необходимых зависимостей. Мы можем сделать это, запустив pip install -r requirements.txt. Команда для загрузки нашего сервиса — python app.py.


Если вы удовлетворены своим выбором, нажмите Создать частную услугу. Через несколько минут ваш сервис будет запущен!


Обратите внимание на внутренний адрес вашей частной службы:



В этом случае адрес нашей службы — http://users-service-1w3d:5000. Помните, что это частный сервис, недоступный за пределами нашей учетной записи Render.


Микросервис "Виджеты" с Node.js и Express


Развертывание службы Node.js почти такое же, как и службы Python, хотя код, необходимый для запуска проекта Node.js, требует больше усилий. Мы создали простую «Службу виджетов» с конечной точкой /widgets. Код этого сервиса доступен на GitHub.


Развертывание этого как частного сервиса почти такое же, как и в случае с сервисом Python Flask. Вы добавите новую частную службу с панели Render и проработаете параметры в пользовательском интерфейсе. Команды сборки и запуска — это поля, которым следует уделить пристальное внимание, чтобы убедиться, что для правильной сборки и запуска приложения используются правильные сценарии из файла package.json. Для этой службы команда сборки должна установить все зависимости, а затем собрать пакет дистрибутива. Это делается последовательно с помощью двух команд, например: npm install && npm run build.


Двойной амперсанд означает, что первая команда должна быть успешно завершена до начала второй команды. Это также пример того, как объединять команды в формах рендеринга для выполнения нескольких действий за один шаг. После завершения этапа сборки мы можем запустить службу с помощью сценария npm run start:prd. Опять же, не забудьте привязать ваше приложение к 0.0.0.0, чтобы Render автоматически знал, как подключиться к нему внутри. Порт и IP-адрес, используемые этой службой, определены в файле src/constants.ts и в настоящее время имеют значение 0.0.0.0:5001.


Настройка Kong Gateway


Мы развернем Kong как веб-службу и настроим ее для маршрутизации к нашим вышестоящим частным службам на основе пути запроса. Kong часто настраивается в тандеме с базой данных, такой как PostgreSQL, которая содержит данные конфигурации для шлюза. Однако существует более простая настройка, которую Конг называет «[декларативной конфигурацией без БД] (https://docs.konghq.com/gateway/2.8.x/reference/db-less-and-declarative-config/) ." При таком подходе Kong не нуждается в базе данных, а конфигурация загружается при загрузке сервиса и сохраняется в его памяти.


Ниже приведен простой файл конфигурации (kong.yaml), который настраивает Kong для маршрутизации к нашим частным службам. Все наши файлы, связанные с Kong, доступны на [GitHub] (https://github.com/alvinslee/render-kong-api-gateway).


``ямл


_format_version: "2.1"


_трансформировать: правда


Сервисы:


  • имя: пользовательская служба

URL: http://users-service-1w3d:5000


маршруты:


  • имя: пользовательские маршруты

пути:


  • / пользовательская служба

  • название: виджет-сервис

Первые две строки необходимы, чтобы направить Kong к правильной версии и тому, как использовать эту конфигурацию.


В блоке «services» подробно описаны все пункты назначения, куда мы хотим, чтобы Kong направлял входящий трафик, и эта маршрутизация основана на путях, установленных в блоке «paths» для каждой службы. Здесь вы можете видеть, что список служб содержит URL-адреса двух частных служб, развернутых в Render. Например, наша веб-служба (Kong) будет прослушивать запрос к пути /user-service, а затем перенаправлять этот запрос на http://users-service-1w3d:5000.


Развертывание Kong в контейнере Docker


Использование Render для развертывания Kong будет немного отличаться от наших двух микросервисов. Нам нужно развернуть его как веб-службу и использовать параметр пользовательского приложения Docker во время настройки.


Следующий файл Dockerfile предоставит экземпляр Kong без БД, который будет считываться в статической конфигурации выше из файла с именем kong.yaml. Это устанавливает порт 8000 в качестве порта, на котором Kong будет прослушивать входящие запросы. Если вы используете EXPOSE 8000, Render автоматически выберет этот порт из образа Docker для использования с этой службой.


```javascript


ИЗ конг: 2.7.1-альпийский


КОПИРОВАТЬ kong.yaml /config/kong.yaml


ПОЛЬЗОВАТЕЛЬ root


ENV KONG_PROXY_LISTEN 0.0.0.0:8000


ENV KONG_DATABASE выключено


ENV KONG_DECLARATIVE_CONFIG /config/kong.yaml


ЭНВ ПОРТ 8000


ЭКСПОЗИЦИЯ 8000


БЕГИ конг старт


После подключения вашего репозитория с файлом Kong Dockerfile и файлами конфигурации убедитесь, что вы выбрали уровень как минимум с 1 ГБ ОЗУ и 1 процессором. Kong работает хаотично с ограниченными ресурсами на общем ЦП. Остальные конфигурации по умолчанию можно оставить как есть.


После развертывания ваша панель инструментов Render должна содержать три службы:



После успешного развертывания Kong вы можете протестировать эту настройку с помощью curl или Postman. Выполните следующий запрос, чтобы обеспечить правильную маршрутизацию к службам Пользователи и Виджеты соответственно:


``` ударить


завиток https://kong-gateway-lh8i.onrender.com/widget-service/widgets/10 \


-i -H "конг-отладка: 1"


Дополнительный заголовок kong-debug указывает Kong добавить некоторую отладочную информацию в заголовки ответа. Мы можем использовать эту информацию для подтверждения успешной установки. В ответе вы должны увидеть что-то вроде следующего:


``` ударить


HTTP/2 200


тип содержимого: приложение/json; кодировка = utf-8


идентификатор конг-маршрута: 8b2d449d-9589-5362-a2a1-3be5683a8f97


kong-route-name: виджет-маршруты


идентификатор конг-сервиса: 6c8de697-474a-54cf-a59e-4ad086047749


kong-service-name: виджет-сервис


через: конг/2.7.1


x-конг-прокси-латентность: 61


x-kong-upstream-латентность: 11


x-powered-by: Экспресс


{"виджет":"10"}


Обратите внимание на заголовки с префиксом Kong, в которых подробно описывается маршрут и службы, которые использовались для маршрутизации запроса к соответствующей вышестоящей службе.


Точно так же вы можете протестировать маршрутизацию User сервисов с помощью:


``` ударить


завиток https://kong-gateway-lh8i.onrender.com/user-service/users\


-i -H "конг-отладка: 1"


Вывод


В этой статье мы рассмотрели решения для облачного хостинга, предоставляемые Render. В частности, мы рассмотрели, как развернуть Kong Gateway в качестве веб-службы, которая обрабатывает маршрутизацию на основе пути к микрослужбам, развернутым в Render как частные службы. Этот шаблон развертывания может настроить вас на масштабируемое и гибкое производственное развертывание приложений, поддерживаемых микрослужбами.


Также опубликовано [Здесь] (https://dzone.com/articles/path-based-routing-in-render-with-kong-api-gateway)