Поделиться через


Руководство: Приложение Spring Boot с Azure Cosmos DB для NoSQL и Azure Kubernetes Service для контейнеров

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Примечание.

Для приложений Spring Boot рекомендуется использовать Azure Spring Apps. Однако вы по-прежнему можете использовать Служба Azure Kubernetes в качестве назначения. См. руководство по назначению рабочей нагрузки Java для получения рекомендаций.

В этом руководстве вы настроите и развернете приложение Spring Boot, которое экспонирует интерфейсы REST API для выполнения операций CRUD с данными в Azure Cosmos DB (учетной записи для API NoSQL). Вы упакуете приложение как образ Docker, отправите его в Реестр контейнеров Azure, развернете в Службе Azure Kubernetes и протестируете приложение.

Предварительные требования

Предоставление служб Azure

В этом разделе вы создадите службы Azure, необходимые для этого учебника.

  • Azure Cosmos DB
  • Реестр контейнеров Azure
  • Служба Azure Kubernetes

Создайте группу ресурсов Azure, используемых в этом учебнике.

  1. Войдите в свою учетную запись Azure в Azure CLI:

    az login
    
  2. Выберите подписку Azure:

    az account set -s <enter subscription ID>
    
  3. Создать группу ресурсов.

    az group create --name=cosmosdb-springboot-aks-rg --location=eastus
    

    Примечание.

    Замените cosmosdb-springboot-aks-rg уникальным именем для группы ресурсов.

Создание учетной записи базы данных Azure Cosmos DB для NoSQL

Используйте эту команду для создания учетной записи базы данных NoSQL в Azure Cosmos DB с помощью Azure CLI.

az cosmosdb create --name <enter account name> --resource-group <enter resource group name>

Создание закрытого реестра контейнеров Azure с помощью Azure CLI

Примечание.

Замените cosmosdbspringbootregistry уникальным именем для реестра.

az acr create --resource-group cosmosdb-springboot-aks-rg --location eastus \
    --name cosmosdbspringbootregistry --sku Basic

Создание кластера Kubernetes в Azure с помощью Azure CLI

  1. Следующая команда создает кластер Kubernetes в группе ресурсов cosmosdb-springboot-aks-rg с именем кластера cosmosdb-springboot-aks и прикрепленным Реестром контейнеров Azure (ACR) cosmosdbspringbootregistry.

    az aks create \
        --resource-group cosmosdb-springboot-aks-rg \
        --name cosmosdb-springboot-aks \
        --node-count 1 \
        --generate-ssh-keys \
        --attach-acr cosmosdbspringbootregistry \
        --dns-name-prefix=cosmosdb-springboot-aks-app
    

    Выполнение этой команды может занять некоторое время.

  2. Если вы не установили kubectl, это можно сделать с помощью Azure CLI.

    az aks install-cli
    
  3. Получите учетные данные доступа для кластера Службы Azure Kubernetes.

    az aks get-credentials --resource-group=cosmosdb-springboot-aks-rg --name=cosmosdb-springboot-aks
    
    kubectl get nodes
    

Сборка приложения

  1. Клонируйте приложение и перейдите в нужный каталог.

    git clone https://github.com/Azure-Samples/cosmosdb-springboot-aks.git
    
    cd cosmosdb-springboot-aks
    
  2. Используйте Maven для создания приложения. В конце этого шага в папке target должен быть создан JAR-файл приложения.

    ./mvnw install
    

Локальный запуск приложения

Если вы собираетесь запустить приложение в Службе Azure Kubernetes, пропустите этот раздел и перейдите к шагу Отправка образа Docker в Реестр контейнеров Azure

  1. Перед запуском приложения обновите файл application.properties, указав сведения учетной записи Azure Cosmos DB.

    azure.cosmos.uri=https://<enter Azure Cosmos DB db account name>.azure.com:443/
    azure.cosmos.key=<enter Azure Cosmos DB db primary key>
    azure.cosmos.database=<enter Azure Cosmos DB db database name>
    azure.cosmos.populateQueryMetrics=false
    

    Примечание.

    База данных и контейнер (с именем users) будут созданы автоматически после запуска приложения.

  2. Локально запустить приложение.

    java -jar target/*.jar
    
  3. Перейдите к шагу Доступ к приложению или перейдите к следующему разделу, чтобы развернуть приложение в Kubernetes.

Отправка образа Docker в Реестр контейнеров Azure

  1. Создание образа Docker

    docker build -t cosmosdbspringbootregistry.azurecr.io/spring-cosmos-app:v1 .
    

    Примечание.

    Замените cosmosdbspringbootregistry именем Реестра контейнеров Azure

  2. Войдите в Реестр контейнеров Azure.

    az acr login -n cosmosdbspringbootregistry
    
  3. Загрузите образ в Реестр контейнеров Azure и перечислите его.

    docker push cosmosdbspringbootregistry.azurecr.io/spring-cosmos-app:v1
    
    az acr repository list --name cosmosdbspringbootregistry --output table
    

Развертывание приложения в Службе Azure Kubernetes

  1. Измените Secret в app.yaml, указав сведения о настройке Azure Cosmos DB.

    ...
    apiVersion: v1
    kind: Secret
    metadata:
      name: app-config
    type: Opaque
    stringData:
      application.properties: |
        azure.cosmos.uri=https://<enter Azure Cosmos DB db account name>.azure.com:443/
        azure.cosmos.key=<enter Azure Cosmos DB db primary key>
        azure.cosmos.database=<enter Azure Cosmos DB db database name>
        azure.cosmos.populateQueryMetrics=false
    ...
    

    Примечание.

    База данных и контейнер (users) будут созданы автоматически после запуска приложения.

  2. Выполните развертывание в Kubernetes и дождитесь перехода Pod в состояние Running:

    kubectl apply -f deploy/app.yaml
    
    kubectl get pods -l=app=spring-cosmos-app -w
    

    Примечание.

    Вы можете проверить журналы приложений, используя: kubectl logs -f $(kubectl get pods -l=app=spring-cosmos-app -o=jsonpath='{.items[0].metadata.name}') -c spring-cosmos-app

Доступ к приложению

Если приложение запущено в Kubernetes и вы хотите получить к нему локальный доступ через порт 8080, запустите приведенную ниже команду:

kubectl port-forward svc/spring-cosmos-app-internal 8080:8080

Вызовите конечные точки REST, чтобы протестировать приложение. Вы также можете перейти в меню Data Explorer учетной записи Azure Cosmos DB на портале Azure и получить доступ к контейнеру users для подтверждения результатов операций.

  1. Создание пользователей

    curl -i -X POST -H "Content-Type: application/json" -d '{"email":"john.doe@foobar.com", "firstName": "John", "lastName": "Doe", "city": "NYC"}' http://localhost:8080/users
    
    curl -i -X POST -H "Content-Type: application/json" -d '{"email":"mr.jim@foobar.com", "firstName": "mr", "lastName": "jim", "city": "Seattle"}' http://localhost:8080/users
    

    В случае успеха вы должны получить HTTP-ответ 201.

  2. Обновление пользователя

    curl -i -X POST -H "Content-Type: application/json" -d '{"email":"john.doe@foobar.com", "firstName": "John", "lastName": "Doe", "city": "Dallas"}' http://localhost:8080/users
    
  3. Список всех пользователей

    curl -i http://localhost:8080/users
    
  4. Получение существующего пользователя

    curl -i http://localhost:8080/users/john.doe@foobar.com
    

    Вы должны получить JSON-ответ с данными о пользователе. Например:

    {
      "email": "john.doe@foobar.com",
      "firstName": "John",
      "lastName": "Doe",
      "city": "Dallas"
    }
    
  5. Попробуйте получить пользователя, который не существует

    curl -i http://localhost:8080/users/not.there@foobar.com
    

    Вы должны получить HTTP-ответ 404.

  6. Замена пользователя

    curl -i -X PUT -H "Content-Type: application/json" -d '{"email":"john.doe@foobar.com", "firstName": "john", "lastName": "doe","city": "New Jersey"}' http://localhost:8080/users/
    
  7. Попробуйте заменить пользователя, который не существует

    curl -i -X PUT -H "Content-Type: application/json" -d '{"email":"not.there@foobar.com", "firstName": "john", "lastName": "doe","city": "New Jersey"}' http://localhost:8080/users/
    

    Вы должны получить HTTP-ответ 404.

  8. Удаление пользователя

    curl -i -X DELETE http://localhost:8080/users/mr.jim@foobar.com
    
  9. Удалите пользователя, который не существует

    curl -X DELETE http://localhost:8080/users/go.nuts@foobar.com
    

    Вы должны получить HTTP-ответ 404.

Доступ к приложению с использованием общедоступного IP-адреса (необязательно)

Создание службы типа LoadBalancer в службе Azure Kubernetes Service приведет к созданию Azure Load Balancer. После этого вы сможете получить доступ к приложению, используя его общедоступный IP-адрес.

  1. Создание службы Kubernetes типа LoadBalancer

    Примечание.

    При этом будет создан Azure Load Balancer с общедоступным IP-адресом.

    kubectl apply -f deploy/load-balancer-service.yaml
    
  2. Дождитесь создания Azure Load Balancer. До этого момента EXTERNAL-IP службы Kubernetes останется в состоянии <pending>.

    kubectl get service spring-cosmos-app -w
    
    NAME                TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
    spring-cosmos-app   LoadBalancer   10.0.68.83   <pending>     8080:31523/TCP   6s
    

    Примечание.

    Значение CLUSTER-IP может отличаться в вашем случае

  3. После завершения создания Azure Load Balancer будет доступен EXTERNAL-IP.

    NAME                TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
    spring-cosmos-app   LoadBalancer   10.0.68.83   20.81.108.180   8080:31523/TCP   18s
    

    Примечание.

    Значение EXTERNAL-IP может отличаться в вашем случае

  4. Использование общедоступного IP-адреса

    Прервите процесс kubectl watch и повторите указанные выше команды curl с общедоступным IP-адресом и портом 8080. Например, чтобы перечислить всех пользователей:

     curl -i http://20.81.108.180:8080/users
    

    Примечание.

    Замена 20.81.108.180 общедоступным IP-адресом для вашей среды

Ресурсы Kubernetes для приложения

Вот некоторые ключевые моменты, связанные с ресурсами Kubernetes для этого приложения:

  • Приложение Spring Boot — это приложение Kubernetes, основанное на образе Docker из Реестра контейнеров Azure.

  • Конфигурация Azure Cosmos DB смонтирована в application.properties по пути /configвнутри контейнера.‍

  • Это возможно с помощью Kubernetes Volume, который, в свою очередь, ссылается на Kubernetes Secret, который был создан вместе с приложением. Вы можете выполнить приведенную ниже команду, чтобы подтвердить наличие этого файла в контейнере приложения:

    kubectl exec -it $(kubectl get pods -l=app=spring-cosmos-app -o=jsonpath='{.items[0].metadata.name}') -c spring-cosmos-app -- cat /config/application.properties
    
  • Конфигурация Пробы активности и готовности для приложения относится к конечным точкам HTTP, предоставляемым Spring Boot Actuator, если приложение Spring Boot развертывается в среде Kubernetes - /actuator/health/liveness и /actuator/health/readiness.

  • Можно создать службу ClusterIP для доступа к конечным точкам REST приложения Spring Boot внутри кластера Kubernetes.

  • Для доступа к приложению с помощью общедоступного IP-адреса можно создать службу LoadBalancer.

Очистка ресурсов

После завершения работы с приложением и учетной записью Azure Cosmos DB можно удалить созданные ресурсы Azure, чтобы избежать дополнительных расходов. Чтобы удалить ресурсы:

  1. На панели поиска портала Azure найдите и выберите Группы ресурсов.

  2. Из списка выберите группу ресурсов, которую вы создали для этого краткого руководства.

    Выбор группы ресурсов для удаления

  3. На странице обзора группы ресурсов выберите Удалить группу ресурсов.

    Удаление группы ресурсов

  4. В следующем окне введите имя группы ресурсов, которую требуется удалить, и щелкните Удалить.

Следующие шаги

В этом руководстве вы узнали, как развернуть приложение Spring Boot для Служба Azure Kubernetes и использовать его для выполнения операций с данными в учетной записи Azure Cosmos DB для NoSQL.