البرنامج التعليمي: الاتصال بقاعدة بيانات 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. المتطلبات الأساسية
- إصدار Azure CLI 2.45.0 أو أعلى.
- بوابه
- Java JDK
- Maven
- Docker
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
تعديل مشروعك
أضف التبعيات المطلوبة إلى ملف BOM الخاص بمشروعك.
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.1.20</version> </dependency>
تكوين خصائص تطبيق 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 ودفعها إلى سجل الحاوية
بناء صورة الحاوية.
قم بتشغيل الأمر التالي لإنشاء صورة تطبيق 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}
تسجيل الدخول إلى السجل.
قبل دفع صور الحاوية، يجب تسجيل الدخول إلى السجل. للقيام بذلك، استخدم الأمر [az acr login][az-acr-login].
az acr login --name $REGISTRY_NAME
يقوم الأمر بإرجاع رسالة
Login Succeeded
بمجرد اكتمالها.ادفع الصورة إلى السجل.
استخدم [docker push][docker-push] لدفع الصورة إلى مثيل السجل. ينشئ
quarkus-postgres-passwordless-app
هذا المثال المستودع، الذيquarkus-postgres-passwordless-app:v1
يحتوي على الصورة.docker push $CONTAINER_IMAGE
4. إنشاء تطبيق حاوية على Azure
إنشاء مثيل Container Apps عن طريق تشغيل الأمر التالي. تأكد من استبدال قيمة متغيرات البيئة بالاسم الفعلي والموقع الذي تريد استخدامه.
CONTAINERAPPS_ENVIRONMENT="my-environment" az containerapp env create \ --resource-group $RESOURCE_GROUP \ --name $CONTAINERAPPS_ENVIRONMENT \ --location $LOCATION
إنشاء تطبيق حاوية باستخدام صورة التطبيق الخاص بك عن طريق تشغيل الأمر التالي:
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 بقاعدة البيانات هذه ويخزن بياناته عند التشغيل، مع استمرار حالة التطبيق بغض النظر عن مكان تشغيل التطبيق.
إنشاء خدمة قاعدة البيانات.
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.
- مجموعة الموارد → استخدم نفس اسم مجموعة الموارد الذي أنشأت فيه تطبيق الويب - على سبيل المثال،
إنشاء قاعدة بيانات باسم
fruits
ضمن خدمة PostgreSQL باستخدام هذا الأمر:DB_NAME=fruits az postgres flexible-server db create \ --resource-group $RESOURCE_GROUP \ --server-name $DB_SERVER_NAME \ --database-name $DB_NAME
تثبيت ملحق Service Connector بدون كلمة مرور ل Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
قم بتوصيل قاعدة البيانات بتطبيق الحاوية بهوية مدارة معينة من قبل النظام، باستخدام أمر الاتصال.
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 في دليل المطور.