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


Начало работы с облачной разработкой с помощью Java в Azure

В этой статье описывается настройка среды разработки для разработки Azure на Java. Затем вы создадите некоторые ресурсы Azure и подключитесь к ним для выполнения некоторых основных задач, таких как отправка файла или развертывание веб-приложения. По завершении вы будете готовы использовать службы Azure в собственных приложениях Java.

Необходимые условия

Настройка проверки подлинности

Приложению Java требуется считывать и создавать разрешения в подписке Azure для запуска примера кода в этом руководстве. Создайте субъект-службу и настройте приложение для запуска с помощью учетных данных. Субъекты-службы предоставляют способ создания неинтерактивной учетной записи, связанной с удостоверением, которому необходимо предоставить только права, необходимые приложению.

создать субъект-службу с помощьюAzure CLI 2.0 и записать выходные данные:

az ad sp create-for-rbac \
    --name AzureJavaTest \
    --role Contributor \
    --scopes /subscriptions/<your-subscription-ID>

Эта команда дает ответ в следующем формате:

{
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "displayName": "AzureJavaTest",
  "name": "http://AzureJavaTest",
  "password": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
  "tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}

Затем настройте переменные среды:

  • AZURE_SUBSCRIPTION_ID. Используйте значение идентификатора из az account show в Azure CLI 2.0.
  • AZURE_CLIENT_ID. Используйте значение appId из выходных данных субъекта-службы.
  • AZURE_CLIENT_SECRET. Используйте значение пароля из выходных данных субъекта-службы.
  • AZURE_TENANT_ID. Используйте значение клиента из выходных данных субъекта-службы.

Дополнительные параметры проверки подлинности см. в клиентской библиотеке удостоверений Azure для Java.

Заметка

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

Инструменты

Создание проекта Maven

Заметка

В этой статье используется средство сборки Maven для создания и запуска примера кода. Другие средства сборки, такие как Gradle, также работают с пакетом SDK Azure для Java.

Создайте проект Maven из командной строки в новом каталоге в системе.

mkdir java-azure-test
cd java-azure-test
mvn archetype:generate -DgroupId=com.fabrikam -DartifactId=AzureApp \
-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

На этом шаге создается базовый проект Maven в каталоге testAzureApp. Добавьте следующие записи в файл pom.xml проекта для импорта библиотек, используемых в примере кода в этом руководстве.

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-identity</artifactId>
  <version>1.3.2</version>
</dependency>
<dependency>
  <groupId>com.azure.resourcemanager</groupId>
  <artifactId>azure-resourcemanager</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-storage-blob</artifactId>
  <version>12.8.0</version>
</dependency>
<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>6.2.1.jre8</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.33</version>
</dependency>

Добавьте запись build под элементом project верхнего уровня, чтобы использовать maven-exec-plugin для выполнения примеров. maven-компилятор-подключаемый модуль используется для настройки исходного кода и созданных классов для Java 8.

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
        <mainClass>com.fabrikam.App</mainClass>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
  </plugins>
</build>

Создание виртуальной машины Linux

Создайте файл с именем App.java в каталоге проекта src/main/java/com/fabrikam и вставьте следующий блок кода. Обновите переменные userName и sshKey с реальными значениями для компьютера. Код создает новую виртуальную машину Linux с именем testLinuxVM в группе ресурсов sampleResourceGroup, работающей в регионе "Восточная часть Azure США".

package com.fabrikam;

import com.azure.core.credential.TokenCredential;
import com.azure.core.http.policy.HttpLogDetailLevel;
import com.azure.core.management.AzureEnvironment;
import com.azure.core.management.Region;
import com.azure.core.management.profile.AzureProfile;
import com.azure.identity.AzureAuthorityHosts;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.resourcemanager.AzureResourceManager;
import com.azure.resourcemanager.compute.models.KnownLinuxVirtualMachineImage;
import com.azure.resourcemanager.compute.models.VirtualMachine;
import com.azure.resourcemanager.compute.models.VirtualMachineSizeTypes;

public class App {

    public static void main(String[] args) {

        final String userName = "YOUR_VM_USERNAME";
        final String sshKey = "YOUR_PUBLIC_SSH_KEY";

        try {
            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            // Create an Ubuntu virtual machine in a new resource group.
            VirtualMachine linuxVM = azureResourceManager.virtualMachines().define("testLinuxVM")
                    .withRegion(Region.US_EAST)
                    .withNewResourceGroup("sampleVmResourceGroup")
                    .withNewPrimaryNetwork("10.0.0.0/24")
                    .withPrimaryPrivateIPAddressDynamic()
                    .withoutPrimaryPublicIPAddress()
                    .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_18_04_LTS)
                    .withRootUsername(userName)
                    .withSsh(sshKey)
                    .withSize(VirtualMachineSizeTypes.STANDARD_D3_V2)
                    .create();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Запустите пример из командной строки.

mvn compile exec:java

В консоли вы увидите некоторые запросы REST и ответы, так как пакет SDK выполняет базовые вызовы к REST API Azure для настройки виртуальной машины и ее ресурсов. После завершения программы проверьте виртуальную машину в подписке с помощью Azure CLI 2.0.

az vm list --resource-group sampleVmResourceGroup

Убедившись, что код работал, используйте ИНТЕРФЕЙС командной строки для удаления виртуальной машины и его ресурсов.

az group delete --name sampleVmResourceGroup

Развертывание веб-приложения из репозитория GitHub

Замените основной метод в App.java следующим. Перед запуском кода обновите переменную appName на уникальное значение. Этот код развертывает веб-приложение из ветви master в общедоступном репозитории GitHub в новом веб-приложение службы приложений Azure, работающем на бесплатной ценовой категории.

    public static void main(String[] args) {
        try {

            final String appName = "YOUR_APP_NAME";

            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
            
            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            WebApp app = azureResourceManager.webApps().define(appName)
                    .withRegion(Region.US_WEST2)
                    .withNewResourceGroup("sampleWebResourceGroup")
                    .withNewWindowsPlan(PricingTier.FREE_F1)
                    .defineSourceControl()
                    .withPublicGitRepository(
                            "https://github.com/Azure-Samples/app-service-web-java-get-started")
                    .withBranch("master")
                    .attach()
                    .create();

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

Запустите код, как и раньше, с помощью Maven.

mvn clean compile exec:java

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

az webapp browse --resource-group sampleWebResourceGroup --name YOUR_APP_NAME

Удалите веб-приложение и план из подписки после проверки развертывания.

az group delete --name sampleWebResourceGroup

Подключение к базе данных SQL Azure

Замените текущий основной метод в App.java следующим кодом. Задайте реальные значения переменных. Этот код создает новую базу данных SQL с правилом брандмауэра, которое разрешает удаленный доступ. Затем код подключается к нему с помощью драйвера JBDC базы данных SQL.

    public static void main(String args[]) {
        // Create the db using the management libraries.
        try {
            TokenCredential credential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(credential, profile)
                    .withDefaultSubscription();

            final String adminUser = "YOUR_USERNAME_HERE";
            final String sqlServerName = "YOUR_SERVER_NAME_HERE";
            final String sqlDbName = "YOUR_DB_NAME_HERE";
            final String dbPassword = "YOUR_PASSWORD_HERE";
            final String firewallRuleName = "YOUR_RULE_NAME_HERE";

            SqlServer sampleSQLServer = azureResourceManager.sqlServers().define(sqlServerName)
                    .withRegion(Region.US_EAST)
                    .withNewResourceGroup("sampleSqlResourceGroup")
                    .withAdministratorLogin(adminUser)
                    .withAdministratorPassword(dbPassword)
                    .defineFirewallRule(firewallRuleName)
                        .withIpAddressRange("0.0.0.0","255.255.255.255")
                        .attach()
                    .create();

            SqlDatabase sampleSQLDb = sampleSQLServer.databases().define(sqlDbName).create();

            // Assemble the connection string to the database.
            final String domain = sampleSQLServer.fullyQualifiedDomainName();
            String url = "jdbc:sqlserver://"+ domain + ":1433;" +
                    "database=" + sqlDbName +";" +
                    "user=" + adminUser+ "@" + sqlServerName + ";" +
                    "password=" + dbPassword + ";" +
                    "encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";

            // Connect to the database, create a table, and insert an entry into it.
            try (Connection conn = DriverManager.getConnection(url)) {
                String createTable = "CREATE TABLE CLOUD (name varchar(255), code int);";
                String insertValues = "INSERT INTO CLOUD (name, code) VALUES ('Azure', 1);";
                String selectValues = "SELECT * FROM CLOUD";
                try (Statement createStatement = conn.createStatement()) {
                    createStatement.execute(createTable);
                }
                try (Statement insertStatement = conn.createStatement()) {
                    insertStatement.execute(insertValues);
                }
                try (Statement selectStatement = conn.createStatement();
                     ResultSet rst = selectStatement.executeQuery(selectValues)) {
                    while (rst.next()) {
                        System.out.println(rst.getString(1) + " " + rst.getString(2));
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println(e.getStackTrace().toString());
        }
    }

Запустите пример из командной строки.

mvn clean compile exec:java

Затем очистите ресурсы с помощью интерфейса командной строки.

az group delete --name sampleSqlResourceGroup

Запись большого двоичного объекта в новую учетную запись хранения

Замените текущий основной метод в App.java следующим кодом. Этот код создает учетной записи хранения Azure. Затем код использует библиотеки службы хранилища Azure для Java для создания нового текстового файла в облаке.

    public static void main(String[] args) {

        try {
            TokenCredential tokenCredential = new DefaultAzureCredentialBuilder()
                    .authorityHost(AzureAuthorityHosts.AZURE_PUBLIC_CLOUD)
                    .build();

            // If you don't set the tenant ID and subscription ID via environment variables,
            // change to create the Azure profile with tenantId, subscriptionId, and Azure environment.
            AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);

            AzureResourceManager azureResourceManager = AzureResourceManager.configure()
                    .withLogLevel(HttpLogDetailLevel.BASIC)
                    .authenticate(tokenCredential, profile)
                    .withDefaultSubscription();

            // Create a new storage account.
            String storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME_HERE";
            StorageAccount storage = azureResourceManager.storageAccounts().define(storageAccountName)
                    .withRegion(Region.US_WEST2)
                    .withNewResourceGroup("sampleStorageResourceGroup")
                    .create();

            // Create a storage container to hold the file.
            List<StorageAccountKey> keys = storage.getKeys();
            PublicEndpoints endpoints = storage.endPoints();
            String accountName = storage.name();
            String accountKey = keys.get(0).value();
            String endpoint = endpoints.primary().blob();

            StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);

            BlobServiceClient storageClient = new BlobServiceClientBuilder()
                    .endpoint(endpoint)
                    .credential(credential)
                    .buildClient();

            // Container name must be lowercase.
            BlobContainerClient blobContainerClient = storageClient.getBlobContainerClient("helloazure");
            blobContainerClient.create();

            // Make the container public.
            blobContainerClient.setAccessPolicy(PublicAccessType.CONTAINER, null);

            // Write a blob to the container.
            String fileName = "helloazure.txt";
            String textNew = "Hello Azure";

            BlobClient blobClient = blobContainerClient.getBlobClient(fileName);
            InputStream is = new ByteArrayInputStream(textNew.getBytes());
            blobClient.upload(is, textNew.length());

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

Запустите пример из командной строки.

mvn clean compile exec:java

Вы можете просмотреть файл helloazure.txt в учетной записи хранения с помощью портала Azure или обозревателя службы хранилища Azure.

Очистка учетной записи хранения с помощью интерфейса командной строки.

az group delete --name sampleStorageResourceGroup

Дополнительные примеры

Дополнительные сведения об использовании библиотек управления Azure для Java для управления ресурсами и автоматизации задач см. в нашем примере кода для виртуальных машин, веб-приложенийи базе данных SQL.

Заметки о справочнике и выпуске

Справочные доступны для всех пакетов.

Получение справки и предоставление отзывов

Задавайте вопросы сообществу в Stack Overflow. Сообщите об ошибках и открытых проблемах с пакетом SDK Azure для Java в репозитория GitHub.