تمرين - ترميز تطبيق Java يستخدم أسرارًا
ستقوم بترميز تطبيق ويب Java، باستخدام Spring Boot، الذي يتصل بقاعدة بيانات.
لأسباب أمنية، ستحتاج إلى تأمين الوصول إلى قاعدة البيانات هذه في المستقبل. ولكن أولاً دعونا نُنشئ البنية الأساسية للتطبيق، ومن ثمّ تكوين تطبيق Java لاستخدامها.
إنشاء البنية الأساسية للتطبيق
في هذا التمرين، يمكنك استخدام Azure CLI لإنشاء الموارد التالية:
- مجموعة موارد Azure التي تحتوي على جميع الموارد لتطبيقك.
- خادم قاعدة بيانات PostgreSQL.
- نظام مجموعة Azure Spring Apps وتطبيق Spring Boot يعمل داخل هذه المجموعة.
تحتاج إلى توفير بعض متغيرات البيئة في بداية البرنامج النصي التي يجب أن تكون فريدة عبر Azure.
تحتاج أيضًا إلى توفير عنوان IP المحلي الخاص بك للوصول إلى قاعدة البيانات من الكمبيوتر المحلي الخاص بك. يجب أن يكون عنوان IP هذا عنوان IPv4. إذا كنت لا تعرف عنوان IP المحلي الخاص بك، يمكنك الانتقال إلى موقع الويب التالي: https://www.whatismyip.com/
عيّن متغيرات البيئة التالية:
AZ_RESOURCE_GROUP=<YOUR_UNIQUE_RESOURCE_GROUP_NAME>
AZ_DATABASE_USERNAME=<YOUR_POSTGRESQL_USERNAME>
AZ_DATABASE_PASSWORD=<YOUR_POSTGRESQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
بمجرد تعيين متغيرات البيئة هذه، يمكنك تشغيل الأمر التالي لإنشاء الموارد:
AZ_LOCATION=eastus
# Must be all lowercase
AZ_SPRING_CLOUD=spring-${AZ_RESOURCE_GROUP,,}
AZ_DATABASE_NAME=pgsql-${AZ_RESOURCE_GROUP}
AZ_DATABASE_USERNAME=${AZ_DATABASE_USERNAME}
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION
قد يستغرق إتمام هذا الأمر عدة دقائق.
az postgres server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--location $AZ_LOCATION \
--sku-name B_Gen5_1 \
--storage-size 5120 \
--admin-user $AZ_DATABASE_USERNAME \
--admin-password $AZ_DATABASE_PASSWORD
az postgres server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME-database-allow-local-ip \
--server $AZ_DATABASE_NAME \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS
az postgres server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME-database-allow-azure-ip \
--server $AZ_DATABASE_NAME \
--start-ip-address 0.0.0.0 \
--end-ip-address 0.0.0.0
az postgres db create \
--resource-group $AZ_RESOURCE_GROUP \
--name demo \
--server-name $AZ_DATABASE_NAME
قد يستغرق إتمام هذا الأمر عدة دقائق.
az extension add --name spring
az spring create \
--name $AZ_SPRING_CLOUD \
--resource-group $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--sku Basic
قد يستغرق إتمام هذا الأمر عدة دقائق.
az spring app create \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application \
--runtime-version Java_11 \
--assign-endpoint true
تستغرق هذه البرامج النصية بعض الوقت للتشغيل، حتى تتمكن من السماح لها بالتشغيل في الخلفية وبدء ترميز التطبيق في هذه الأثناء.
تكوين تطبيق Java
احصل على هيكل التطبيق من مستودع GitHub https://github.com/Azure-Samples/manage-secrets-in-java-applications، باستخدام الأمر git clone:
git clone https://github.com/Azure-Samples/manage-secrets-in-java-applications.git
يستخدم هذا التطبيق Spring Data JPA للوصول إلى قاعدة البيانات. يمكنك إلقاء نظرة على واجهة CRUD Repository:
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}
يتم بعد ذلك كشف البيانات المخزنة في قاعدة البيانات على الويب، باستخدام وحدة تحكم Spring MVC REST:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ItemController {
private final ItemRepository itemRepository;
public ItemController(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
@GetMapping("/")
String welcome() {
return "Here are all the database items: " + itemRepository.findAll();
}
}
يتم إدراج هذه البيانات في قاعدة البيانات في وقت بدء التشغيل، باستخدام ملف src/main/resources/data.sql:
insert into item (details) values ('This is a item from the database');
يمكنك إضافة المزيد من الأسطر إلى هذا الملف إذا كنت تريد المزيد من البيانات، أو إذا كنت ترغب في تخصيصه.
للوصول إلى قاعدة البيانات، تحتاج إلى تكوين src/main/resources/application.properties الملف:
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=jdbc:postgresql://${azureDatabaseName}.postgres.database.azure.com:5432/demo
spring.datasource.username=${azureDatabaseUsername}@${azureDatabaseName}
spring.datasource.password=${azureDatabasePassword}
spring.sql.init.mode=always
يحتوي ملف التكوين هذا على ثلاثة متغيرات يجب تكوينها:
-
${azureDatabaseName}هو اسم قاعدة بيانات PostgreSQL التي تم تكوينها مسبقًا في متغير البيئةAZ_DATABASE_NAME. اكتبecho $AZ_DATABASE_NAMEلرؤيته. -
${azureDatabaseUsername}هو الاسم الخاص باسم مستخدم قاعدة البيانات التي تم تكوينها مسبقًا في متغير البيئةAZ_DATABASE_USERNAME. اكتبecho $AZ_DATABASE_USERNAMEلرؤيته. -
${azureDatabasePassword}هو اسم كلمة مرور قاعدة البيانات التي تم تكوينها مسبقًا في متغير البيئةAZ_DATABASE_PASSWORD. اكتبecho $AZ_DATABASE_PASSWORDلرؤيته.
كما رأينا في الوحدة السابقة، من الممارسات السيئة ترميز تلك القيم في التعليمات البرمجية المصدر للتطبيق. ولكن لاختبار التطبيق، يمكنك كتابتها مؤقتًا وتشغيل التطبيق:
./mvnw spring-boot:run
يمكنك قراءة محتوى قاعدة البيانات عن طريق الوصول إلى وحدة تحكم Spring MVC باستخدام الأمر التالي أو باستخدام مستعرض ويب:
curl http://localhost:8080
توزيع تطبيق Java إلى Azure
لنشر التطبيق، تحتاج أولا إلى حزمه كملف Jar:
./mvnw clean package
ينتج عن هذا الأمر ملف Jar قابل للتنفيذ في target الدليل، الذي تقوم بنشره باستخدام Azure CLI:
az spring app deploy \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application \
--artifact-path target/*.jar
إذا واجهت حالات فشل، يمكنك إلقاء نظرة على سجلات التطبيق عن طريق كتابة الأمر التالي:
az spring app logs \
--resource-group $AZ_RESOURCE_GROUP \
--service $AZ_SPRING_CLOUD \
--name application
سيكون التطبيق متاحًا في السحابة بعد ذلك، ويمكنك الوصول إلى بياناته باستخدام أمر cURL:
curl https://$AZ_SPRING_CLOUD-application.azuremicroservices.io
# Expected output:
#
# Here are all the database items: [Secret{Id=1, details='This is a item from the database'}]
#
تهانينا! لقد نجحت في إنشاء تطبيق Java يتصل بقاعدة بيانات! الآن تحتاج إلى تأمين بيانات اعتماد قاعدة البيانات في الوحدات التالية.