Megosztás a következőn keresztül:


HTTP-ügyfelek és folyamatok a Java Azure SDK-ban

Ez a cikk áttekintést nyújt a HTTP-ügyfél- és folyamatfunkciók használatáról a Java Azure SDK-ban. Ez a funkció konzisztens, hatékony és rugalmas élményt nyújt a Java-kódtárakhoz készült Azure SDK-t használó fejlesztők számára.

HTTP-ügyfelek

Az Azure SDK for Java absztrakcióval HttpClient implementálható. Ez az absztrakció olyan csatlakoztatható architektúrát tesz lehetővé, amely több HTTP-ügyfélkódtárat vagy egyéni implementációt fogad el. A legtöbb felhasználó függőségkezelésének egyszerűsítése érdekében azonban minden Azure-ügyfélkódtár függ.azure-core-http-netty Ezért a Netty HTTP-ügyfél az összes Java-kódtárhoz készült Azure SDK-ban használt alapértelmezett ügyfél.

Bár a Netty az alapértelmezett HTTP-ügyfél, az SDK három ügyfél-implementációt biztosít attól függően, hogy milyen függőségek vannak már a projektben. Ezek a megvalósítások a következőkre használhatók:

Megjegyzés:

A JDK HttpClient és a Java-hoz készült Azure SDK együttes használata csak a JDK 12-s és újabb verzióiban támogatott.

Az alapértelmezett HTTP-ügyfél cseréje

Ha egy másik implementációt szeretne, a Netty függőségét úgy távolíthatja el, hogy kizárja azt a buildkonfigurációs fájlokból. Egy Maven pom.xml fájlban kizárja a Netty-függőséget, és belefoglal egy másik függőséget.

Az alábbi példa bemutatja, hogyan zárhatja ki a Netty-függőséget a azure-security-keyvault-secrets tár valódi függőségéből. Mindenképpen zárja ki a Nettyt az összes megfelelő com.azure kódtárból, ahogy az itt látható:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-security-keyvault-secrets</artifactId>
    <version>4.2.2.</version>
    <exclusions>
      <exclusion>
        <groupId>com.azure</groupId>
        <artifactId>azure-core-http-netty</artifactId>
      </exclusion>
    </exclusions>
</dependency>

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-core-http-okhttp</artifactId>
  <version>1.3.3</version>
</dependency>

Megjegyzés:

Ha eltávolítja a Netty-függőséget, de nem biztosít implementációt a helyén, az alkalmazás nem indul el. Az HttpClient osztályúton implementációnak kell lennie.

HTTP-ügyfelek konfigurálása

Szolgáltatásügyfél létrehozásakor alapértelmezés szerint a következőt használja HttpClient.createDefault(): . Ez a metódus egy alapszintű HttpClient példányt ad vissza a megadott HTTP-ügyfél-implementáció alapján. Ha összetettebb HTTP-ügyfélre , például proxyra van szüksége, minden implementáció kínál egy szerkesztőt, amely lehetővé teszi egy konfigurált példány összeállítását HttpClient . Az építők, NettyAsyncHttpClientBuilderOkHttpAsyncHttpClientBuilderés JdkAsyncHttpClientBuilder.

Az alábbi példák bemutatják, hogyan hozhat létre HttpClient példányokat a Netty, az OkHttp és a JDK 11 HTTP-ügyfél használatával. Ezek a példányok proxyt adnak áthttp://localhost:3128, és felhasználói példán keresztül hitelesítik a weakPassword jelszóval.

// Netty
HttpClient httpClient = new NettyAsyncHttpClientBuilder()
    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 3128))
        .setCredentials("example", "weakPassword"))
    .build();

// OkHttp
HttpClient httpClient = new OkHttpAsyncHttpClientBuilder()
    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 3128))
        .setCredentials("example", "weakPassword"))
    .build();

// JDK 11 HttpClient
HttpClient client = new JdkAsyncHttpClientBuilder()
    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 3128))
        .setCredentials("example", "weakPassword"))
    .build();

Most már átadhatja a létrehozott HttpClient példányt egy szolgáltatásügyfél-készítőnek, hogy ügyfélként használhassa a szolgáltatással való kommunikációhoz. Az alábbi példa az új HttpClient példányt használja egy Azure Storage Blob-ügyfél létrehozásához.

BlobClient blobClient = new BlobClientBuilder()
    .connectionString(<connection string>)
    .containerName("container")
    .blobName("blob")
    .httpClient(httpClient)
    .build();

Felügyeleti kódtárak esetén beállíthatja a HttpClient Manager-konfiguráció során.

AzureResourceManager azureResourceManager = AzureResourceManager.configure()
    .withHttpClient(httpClient)
    .authenticate(credential, profile)
    .withDefaultSubscription();

HTTP-folyamat

A HTTP-folyamat az azure-hoz készült Java-ügyfélkódtárak konzisztenciájának és diagnosztikájának egyik fő összetevője. A HTTP-folyamatok a következőkből állnak:

  • HTTP-átvitel
  • HTTP-folyamat szabályzatai

Ügyfél létrehozásakor saját egyéni HTTP-folyamatot is megadhat. Ha nem ad meg egy folyamatot, az ügyfélkódtár létrehoz egy konfiguráltat az adott ügyfélkódtár használatához.

HTTP-átvitel

A HTTP-átvitel feladata a kiszolgálóhoz való kapcsolódás, valamint a HTTP-üzenetek küldése és fogadása. A HTTP-átvitel képezi az Azure SDK-ügyfélkódtárak átjáróját az Azure-szolgáltatások használatához. Amint azt a cikk korábbi részében is említettük, a Java Azure SDK alapértelmezés szerint a Netty-t használja a HTTP-átvitelhez. Az SDK azonban csatlakoztatható HTTP-átvitelt is biztosít, így szükség esetén más implementációkat is használhat. Az SDK emellett két további HTTP-átviteli implementációt is biztosít az OkHttp és a JDK 11-es és újabb JDK-val rendelkező HTTP-ügyfél számára.

HTTP-folyamat szabályzatai

A folyamatok az egyes HTTP-kérés-válasz kerekítésekhez végrehajtott lépések sorozatából állnak. Minden szabályzatnak van egy dedikált célja, és egy kérésre, válaszra vagy néha mindkettőre reagál. Mivel minden ügyfélkódtár szabványos "Azure Core" réteggel rendelkezik, ez a réteg biztosítja, hogy az egyes szabályzatok sorrendben futnak a folyamatban. Amikor kérést küld, a szabályzatok a folyamathoz adott sorrendben futnak. Amikor választ kap a szolgáltatástól, a szabályzatok fordított sorrendben futnak. A folyamathoz hozzáadott összes szabályzat végrehajtása a kérés elküldése előtt és a válasz beérkezése után történik. A szabályzatnak el kell döntenie, hogy a kérést, a választ vagy mindkettőt választja-e. Egy naplózási szabályzat például naplózza a kérést és a választ, de a hitelesítési szabályzat csak a kérés módosítására kíváncsi.

Az Azure Core-keretrendszer biztosítja a szabályzat számára a szükséges kérelem- és válaszadatokat, valamint a szabályzat végrehajtásához szükséges környezeteket. A szabályzat ezután végrehajthatja a műveletet a megadott adatokkal, és átadhatja a vezérlőt a folyamat következő szabályzatának.

HTTP pipeline diagram

HTTP-folyamatházirend pozíciója

Ha HTTP-kéréseket küld a felhőszolgáltatásoknak, fontos kezelni az átmeneti hibákat, és újrapróbálkoznia a sikertelen kísérleteket. Mivel ez a funkció gyakori követelmény, az Azure Core egy újrapróbálkozási szabályzatot biztosít, amely figyeli az átmeneti hibákat, és automatikusan újrapróbálkozza a kérést.

Ez az újrapróbálkoztatási szabályzat ezért a teljes folyamatot két részre osztja: az újrapróbálkoztatási szabályzat előtt végrehajtott szabályzatokra és az újrapróbálkozások után végrehajtott szabályzatokra. Az újrapróbálkozási szabályzat előtt hozzáadott szabályzatok API-műveletenként csak egyszer futnak, az újrapróbálkozási szabályzat után hozzáadott szabályzatok pedig az újrapróbálkozási szabályzattal megegyező számú alkalommal futnak.

A HTTP-folyamat létrehozásakor tehát tisztában kell lennie azzal, hogy az egyes kérések újrapróbálkozásakor vagy API-műveletenként egyszer kell-e szabályzatot végrehajtania.

Gyakori HTTP-folyamatszabályzatok

A REST-alapú szolgáltatások HTTP-folyamatai olyan konfigurációkkal rendelkeznek, amelyek hitelesítési, újrapróbálkozási, naplózási, telemetria-, és a kérésazonosítót határozzák meg a fejlécben. Az Azure Core előre be van töltve ezekkel a gyakran szükséges HTTP-szabályzatokkal, amelyeket hozzáadhat a folyamathoz.

Policy GitHub-hivatkozás
újrapróbálkozési szabályzat RetryPolicy.java
hitelesítési szabályzat BearerTokenAuthenticationPolicy.java
naplózási szabályzat HttpLoggingPolicy.java
kérelemazonosító-szabályzat RequestIdPolicy.java
telemetriaszabályzat UserAgentPolicy.java

Egyéni HTTP-folyamatszabályzat

A HTTP-folyamat szabályzata kényelmes mechanizmust biztosít a kérés és a válasz módosításához vagy díszítéséhez. Egyéni szabályzatokat adhat hozzá a felhasználó vagy az ügyfélkódtár fejlesztője által létrehozott folyamathoz. Amikor hozzáadja a szabályzatot a folyamathoz, megadhatja, hogy ezt a szabályzatot hívásonként vagy újrapróbálkozásonként kell-e végrehajtani.

Egyéni HTTP-folyamatszabályzat létrehozásához csak ki kell terjesztenie egy alapházirend-típust, és implementálnia kell néhány absztrakt módszert. Ezután csatlakoztathatja a szabályzatot a folyamathoz.

Egyéni fejlécek HTTP-kérelmekben

Az Azure SDK for Java-ügyfélkódtárak konzisztens módon definiálják a testreszabott fejléceket a nyilvános API objektumain keresztül Context , ahogyan az alábbi példában látható:

// Add your headers
HttpHeaders headers = new HttpHeaders();
headers.set("my-header1", "my-header1-value");
headers.set("my-header2", "my-header2-value");
headers.set("my-header3", "my-header3-value");

// Call API by passing headers in Context.
configurationClient.addConfigurationSettingWithResponse(
    new ConfigurationSetting().setKey("key").setValue("value"),
    new Context(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers));

// The three headers are now be added to the outgoing HTTP request.

További információt az AddHeadersFromContextPolicy osztályban talál.

Alapértelmezett TLS/SSL-kódtár

Alapértelmezés szerint az összes ügyfélkódtár a Tomcat-natív unalmas SSL-kódtár használatával engedélyezi a Natív szintű teljesítményt a TLS/SSL-műveletekhez. Az Unalmas SSL-kódtár egy uber JAR, amely natív kódtárakat tartalmaz Linuxhoz, macOS-hez és Windowshoz, és jobb teljesítményt nyújt a JDK-n belüli alapértelmezett TLS/SSL-implementációhoz képest.

Tomcat-natív TLS/SSL-függőség méretének csökkentése

Alapértelmezés szerint a Tomcat-Native Boring SSL-kódtár uber JAR-ját használják a Java-hoz készült Azure SDK-kban. A függőség méretének csökkentéséhez a függőséget netty-tcnative osszerinti osztályozóval kell tartalmaznia, ahogyan az az alábbi példában látható:

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative-boringssl-static</artifactId>
      <version>2.0.25.Final</version>
      <classifier>${os.detected.classifier}</classifier>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    ...
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.4.0.Final</version>
      </extension>
    </extensions>
    ...
  </build>
  ...
</project>

JDK TLS/SSL használata

Ha inkább az alapértelmezett JDK TLS/SSL-t szeretné használni a Tomcat-Native Boring SSL helyett, akkor ki kell zárnia a Tomcat-natív unalmas SSL-kódtárat. Vegye figyelembe, hogy a tesztek alapján a JDK TLS/SSL teljesítménye 30%-kal lassabb a Tomcat-natív unalmas SSL-hez képest. Használatkor com.azure:azure-core:1.28.0 vagy később a HttpClient-implementáló kódtár (például com.azure:azure-core-http-netty) kezeli a Tomcat-Native Boring SSL-függőséget. A függőség kizárásához adja hozzá a következő konfigurációt a POM-fájlhoz:

<project>
  ...
  <dependencies>
    ...
    <dependency>
     <groupId>com.azure</groupId>
       <artifactId>azure-core-http-netty</artifactId>
       <version>1.13.6</version>
       <exclusions>
         <exclusion>
           <groupId>io.netty</groupId>
           <artifactId>netty-tcnative-boringssl-static</artifactId>
         </exclusion>
       </exclusions>
    </dependency>
    ...
  </dependencies>
  ...
</project>

További lépések

Most, hogy már ismeri a HTTP-ügyfél funkcióit a Java Azure SDK-ban, megtudhatja, hogyan szabhatja testre a használt HTTP-ügyfelet. További információ: Proxyk konfigurálása a Javához készült Azure SDK-ban.