البرنامج التعليمي: الاتصال بقاعدة بيانات PostgreSQL من تطبيق حاوية Java Quarkus بدون أسرار باستخدام هوية مدارة

توفر Azure Container Apps هوية مدارة لتطبيقك، وهو حل تسليم المفتاح لتأمين الوصول إلى قاعدة بيانات Azure ل PostgreSQL وخدمات Azure الأخرى. تجعل الهويات المدارة في Container Apps تطبيقك أكثر أمانا من خلال التخلص من الأسرار من تطبيقك، مثل بيانات الاعتماد في متغيرات البيئة.

يرشدك هذا البرنامج التعليمي خلال عملية إنشاء تطبيقات حاوية Java وتكوينها ونشرها وتوسيع نطاقها على Azure. في نهاية هذا البرنامج التعليمي، سيكون لديك تطبيق Quarkus يخزن البيانات في قاعدة بيانات PostgreSQL مع هوية مدارة تعمل على Container Apps.

سوف تتعلم ما يلي:

  • تكوين تطبيق Quarkus للمصادقة باستخدام معرف Microsoft Entra مع قاعدة بيانات PostgreSQL.
  • إنشاء سجل حاوية Azure ودفع صورة تطبيق Java إليه.
  • إنشاء تطبيق حاوية في Azure.
  • إنشاء قاعدة بيانات PostgreSQL في Azure.
  • الاتصال بقاعدة بيانات PostgreSQL بهوية مدارة باستخدام Service Connector.

إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

1. المتطلبات الأساسية

2. إنشاء سجل حاوية

أنشئ مجموعة موارد باستخدام الأمر az group create. مجموعة موارد Azure هي حاوية منطقية يتم بها نشر موارد Azure وإدارتها.

ينشئ المثال التالي مجموعة موارد باسم myResourceGroup في منطقة Azure شرق الولايات المتحدة.

RESOURCE_GROUP="myResourceGroup"
LOCATION="eastus"

az group create --name $RESOURCE_GROUP --location $LOCATION

إنشاء مثيل سجل حاوية Azure باستخدام الأمر az acr create واسترداد خادم تسجيل الدخول الخاص به باستخدام الأمر az acr show . يجب أن يكون اسم التسجيل فريداً داخل Azure وأن يحتوي على 5-50 حرفاً أبجدياً رقمياً. يجب تحديد كافة الأحرف بأحرف صغيرة. في المثال التالي، mycontainerregistry007 يتم استخدام. قم بتحديث هذا إلى قيمة فريدة.

REGISTRY_NAME=mycontainerregistry007
az acr create \
    --resource-group $RESOURCE_GROUP \
    --name $REGISTRY_NAME \
    --sku Basic

REGISTRY_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv | tr -d '\r')

3. استنساخ نموذج التطبيق وإعداد صورة الحاوية

يستخدم هذا البرنامج التعليمي نموذجًا لتطبيق قائمة Fruits مع واجهة مستخدم ويب تستدعي واجهة برمجة تطبيقات Quarkus REST المدعومة بقاعدة بيانات Azure لـ PostgreSQL. تتوفر التعليمات البرمجية للتطبيق على GitHub. لمعرفة المزيد حول كتابة تطبيقات Java باستخدام Quarkus وPostgreSQL، راجع Quarkus Hibernate ORM مع دليل Panache ودليل مصدر بيانات Quarkus.

قم بتشغيل الأوامر التالية في الوحدة الطرفية الخاصة بك لاستنساخ عينة الريبو وإعداد بيئة نموذج التطبيق.

git clone https://github.com/quarkusio/quarkus-quickstarts
cd quarkus-quickstarts/hibernate-orm-panache-quickstart

تعديل مشروعك

  1. أضف التبعيات المطلوبة إلى ملف BOM الخاص بمشروعك.

    <dependency>
       <groupId>com.azure</groupId>
       <artifactId>azure-identity-extensions</artifactId>
       <version>1.1.20</version>
    </dependency>
    
  2. تكوين خصائص تطبيق Quarkus.

    يوجد تكوين Quarkus في ملف src/main/resources/application.properties . افتح هذا الملف في محرر النص، ولاحظ العديد من الخصائص الافتراضية. لا تُستخدم الخصائص المسبوقة بـ %prod إلا عندما يتم إنشاء التطبيق ونشره، على سبيل المثال عند نشره في Azure App Service. عند تشغيل التطبيق محليًا، يتم تجاهل خصائص %prod. وبالمثل، يتم استخدام خصائص %dev في وضع الترميز / التطوير المباشر الخاص بـ Quarkus، ويتم استخدام خصائص %test أثناء الاختبار المستمر.

    احذف المحتوى الموجود في application.properties واستبدل ما يلي لتكوين قاعدة البيانات لأوضاع التطوير والاختبار والإنتاج:

    quarkus.hibernate-orm.database.generation=drop-and-create
    quarkus.datasource.db-kind=postgresql
    quarkus.datasource.jdbc.max-size=8
    quarkus.datasource.jdbc.min-size=2
    quarkus.hibernate-orm.log.sql=true
    quarkus.hibernate-orm.sql-load-script=import.sql
    quarkus.datasource.jdbc.acquisition-timeout = 10
    
    %dev.quarkus.datasource.username=${CURRENT_USERNAME}
    %dev.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
    authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
    &sslmode=require
    
    %prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
    %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
    authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
    &sslmode=require
    
    %dev.quarkus.class-loading.parent-first-artifacts=com.azure:azure-core::jar,\
    com.azure:azure-core-http-netty::jar,\
    io.projectreactor.netty:reactor-netty-core::jar,\
    io.projectreactor.netty:reactor-netty-http::jar,\
    io.netty:netty-resolver-dns::jar,\
    io.netty:netty-codec::jar,\
    io.netty:netty-codec-http::jar,\
    io.netty:netty-codec-http2::jar,\
    io.netty:netty-handler::jar,\
    io.netty:netty-resolver::jar,\
    io.netty:netty-common::jar,\
    io.netty:netty-transport::jar,\
    io.netty:netty-buffer::jar,\
    com.azure:azure-identity::jar,\
    com.azure:azure-identity-extensions::jar,\
    com.fasterxml.jackson.core:jackson-core::jar,\
    com.fasterxml.jackson.core:jackson-annotations::jar,\
    com.fasterxml.jackson.core:jackson-databind::jar,\
    com.fasterxml.jackson.dataformat:jackson-dataformat-xml::jar,\
    com.fasterxml.jackson.datatype:jackson-datatype-jsr310::jar,\
    org.reactivestreams:reactive-streams::jar,\
    io.projectreactor:reactor-core::jar,\
    com.microsoft.azure:msal4j::jar,\
    com.microsoft.azure:msal4j-persistence-extension::jar,\
    org.codehaus.woodstox:stax2-api::jar,\
    com.fasterxml.woodstox:woodstox-core::jar,\
    com.nimbusds:oauth2-oidc-sdk::jar,\
    com.nimbusds:content-type::jar,\
    com.nimbusds:nimbus-jose-jwt::jar,\
    net.minidev:json-smart::jar,\
    net.minidev:accessors-smart::jar,\
    io.netty:netty-transport-native-unix-common::jar,\
    net.java.dev.jna:jna::jar
    

إنشاء صورة Docker ودفعها إلى سجل الحاوية

  1. بناء صورة الحاوية.

    قم بتشغيل الأمر التالي لإنشاء صورة تطبيق Quarkus. يجب وضع علامة عليه بالاسم المؤهل بالكامل لخادم تسجيل الدخول إلى السجل.

    CONTAINER_IMAGE=${REGISTRY_SERVER}/quarkus-postgres-passwordless-app:v1
    
    mvn quarkus:add-extension -Dextensions="container-image-jib"
    mvn clean package -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${CONTAINER_IMAGE}
    
  2. تسجيل الدخول إلى السجل.

    قبل دفع صور الحاوية، يجب تسجيل الدخول إلى السجل. للقيام بذلك، استخدم الأمر [az acr login][az-acr-login].

    az acr login --name $REGISTRY_NAME
    

    يقوم الأمر بإرجاع رسالة Login Succeeded بمجرد اكتمالها.

  3. ادفع الصورة إلى السجل.

    استخدم [docker push][docker-push] لدفع الصورة إلى مثيل السجل. ينشئ quarkus-postgres-passwordless-app هذا المثال المستودع، الذي quarkus-postgres-passwordless-app:v1 يحتوي على الصورة.

    docker push $CONTAINER_IMAGE
    

4. إنشاء تطبيق حاوية على Azure

  1. إنشاء مثيل Container Apps عن طريق تشغيل الأمر التالي. تأكد من استبدال قيمة متغيرات البيئة بالاسم الفعلي والموقع الذي تريد استخدامه.

    CONTAINERAPPS_ENVIRONMENT="my-environment"
    
    az containerapp env create \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINERAPPS_ENVIRONMENT \
        --location $LOCATION
    
  2. إنشاء تطبيق حاوية باستخدام صورة التطبيق الخاص بك عن طريق تشغيل الأمر التالي:

    APP_NAME=my-container-app
    az containerapp create \
        --resource-group $RESOURCE_GROUP \
        --name $APP_NAME \
        --image $CONTAINER_IMAGE \
        --environment $CONTAINERAPPS_ENVIRONMENT \
        --registry-server $REGISTRY_SERVER \
        --registry-identity system \
        --ingress 'external' \
        --target-port 8080 \
        --min-replicas 1
    

    إشعار

    لا تزال الخيارات --registry-username و --registry-password مدعومة ولكن لا يوصى بها لأن استخدام نظام الهوية أكثر أمانا.

5. إنشاء قاعدة بيانات PostgreSQL وتوصيلها باتصال الهوية

بعد ذلك، قم بإنشاء قاعدة بيانات PostgreSQL وتكوين تطبيق الحاوية للاتصال بقاعدة بيانات PostgreSQL بهوية مدارة معينة من قبل النظام. سيتصل تطبيق Quarkus بقاعدة البيانات هذه ويخزن بياناته عند التشغيل، مع استمرار حالة التطبيق بغض النظر عن مكان تشغيل التطبيق.

  1. إنشاء خدمة قاعدة البيانات.

    DB_SERVER_NAME='msdocs-quarkus-postgres-webapp-db'
    
    az postgres flexible-server create \
        --resource-group $RESOURCE_GROUP \
        --name $DB_SERVER_NAME \
        --location $LOCATION \
        --public-access None \
        --sku-name Standard_B1ms \
        --tier Burstable \
        --active-directory-auth Enabled
    

    إشعار

    لا تزال الخيارات --admin-user و --admin-password مدعومة ولكن لا يوصى بها لأن استخدام نظام الهوية أكثر أمانا.

    يتم استخدام المعلمات التالية في أمر Azure CLI المذكور أعلاه:

    • مجموعة الموارد → استخدم نفس اسم مجموعة الموارد الذي أنشأت فيه تطبيق الويب - على سبيل المثال، msdocs-quarkus-postgres-webapp-rg.
    • الاسم → اسم خادم قاعدة بيانات PostgreSQL. يجب أن يكون هذا الاسم فريدًا عبر جميع Azure (تصبح https://<name>.postgres.database.azure.comنقطة نهاية الخادم ). الأحرف المسموح بها هي A-Zو0-9و-. النمط الجيد هو استخدام مَزيج من اسم شركتك ومُعرف التطبيق. (msdocs-quarkus-postgres-webapp-db)
    • الموقع → استخدم نفس الموقع المستخدم لتطبيق الويب. قم بالتغيير إلى موقع آخر إذا لم يعمل.
    • الوصول العامNone الذي يعين الخادم في وضع الوصول العام بدون قواعد جدار حماية. سوف يتم إنشاء القواعد في خطوة لاحقة.
    • sku-name → اسم مستوى التسعير وتكوين الحساب - على سبيل المثال، Standard_B1ms. لمزيد من المعلومات، يرجى مراجعة Azure Database for PostgreSQL pricing.
    • الطبقة → طبقة الحوسبة للخادم. لمزيد من المعلومات، يرجى مراجعة Azure Database for PostgreSQL pricing.
    • Enabled active-directory-auth لتمكين مصادقة Microsoft Entra.
  2. إنشاء قاعدة بيانات باسم fruits ضمن خدمة PostgreSQL باستخدام هذا الأمر:

    DB_NAME=fruits
    az postgres flexible-server db create \
        --resource-group $RESOURCE_GROUP \
        --server-name $DB_SERVER_NAME \
        --database-name $DB_NAME
    
  3. تثبيت ملحق Service Connector بدون كلمة مرور ل Azure CLI:

    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
    
  4. قم بتوصيل قاعدة البيانات بتطبيق الحاوية بهوية مدارة معينة من قبل النظام، باستخدام أمر الاتصال.

    az containerapp connection create postgres-flexible \
        --resource-group $RESOURCE_GROUP \
        --name $APP_NAME \
        --target-resource-group $RESOURCE_GROUP \
        --server $DB_SERVER_NAME \
        --database $DB_NAME \
        --system-identity \
        --container $APP_NAME
    

6. مراجعة التغييرات التي أجريتها

يمكنك العثور على عنوان URL للتطبيق (FQDN) باستخدام الأمر التالي:

echo https://$(az containerapp show \
    --name $APP_NAME \
    --resource-group $RESOURCE_GROUP \
    --query properties.configuration.ingress.fqdn \
    --output tsv)

عندما تعرض صفحة الويب الجديدة قائمة الفواكه، يتصل تطبيقك بقاعدة البيانات باستخدام الهوية المدارة. يجب أن تكون الآن قادرا على تحرير قائمة الفواكه كما كان من قبل.

تنظيف الموارد

في الخطوات السابقة، أنشأت موارد Azure في إحدى مجموعات الموارد. إذا لم تتوقع احتياجك لهذه الموارد في المستقبل، فاحذف مجموعة الموارد من خلال تشغيل الأمر التالي في Cloud Shell:

az group delete --name myResourceGroup

ربما يستغرق الأمر بضع دقائق للتشغيل.

الخطوات التالية

تعرف على المزيد حول تشغيل تطبيقات Java على Azure في دليل المطور.