すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud DNS:Android SDK 開発ガイド

最終更新日:Mar 18, 2026

このドキュメントでは、モバイル解決 HTTPDNS Android SDK を統合する方法について説明します。

概要

モバイル解決 HTTPDNS の Android SDK は、DoH JSON API の Java ラッパーです。Android アプリがドメイン名を解決するための Java インターフェイスを提供し、TTL および LRU ポリシーを使用する効率的なローカルキャッシュが含まれています。開発者は モバイル解決 HTTPDNS を Android アプリに統合することで、ドメイン名の名前解決エラーを解決し、正確で低コストのスケジューリングを実現できます。

この SDK には、以下のメリットがあります。

  • 使いやすさ

    提供されている SDK を統合するだけで、モバイル解決 HTTPDNS サービスにアクセスできます。統合方法は簡単で、手間なく便利な名前解決体験を提供します。

  • ゼロレイテンシー

    SDK は、解決済みの IP アドレスをローカルに保存する LRU キャッシュを実装しています。TTL ベースの期限切れキャッシュエントリを積極的に更新して、キャッシュデータを最新かつ有効な状態に保ちます。これにより、ゼロレイテンシーのドメイン名解決が可能になります。

実装ガイダンスについては、alidns_android_demo サンプルプロジェクトのソースコードをご参照ください。

SDK の統合

SDK の統合

Gradle と Maven を使用した統合

build.gradle ファイルに次のコードを追加します。

allprojects {
  repositories {
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
    mavenLocal()
    mavenCentral()
  }
}

参照したいファイル情報を追加します。

dependencies {
     implementation 'com.alibaba.pdns:alidns-android-sdk:2.3.0'
     implementation 'com.google.code.gson:gson:2.8.5'
}

AAR ファイルを使用した統合

SDK のダウンロード」を参照して alidns_android_sdk.aar ファイルを取得し、プロジェクトの `libs` ディレクトリに統合します。

説明

プロジェクトには、どちらかの統合方法を選択できます。

SDK の初期化

重要

IP アドレスの解決に失敗しないように、SDK はできるだけ早く初期化してください。

まず、コンソールで アカウント ID を確認し、「キーの作成」を参照して AccessKey IDAccessKey Secret を取得します。その後、SDK を統合して初期化します。具体的な初期化手順については、Application セクションのコード例をご参照ください。

public class DnsCacheApplication extends Application{

    private String accountId = "ご利用のアカウント ID"; // コンソールで SDK にアクセスするために使用するアカウント ID を設定します。
    private String accessKeyId = "ご利用の AccessKey ID"; // コンソールで SDK にアクセスするために使用する AccessKey ID を設定します。
    private String accessKeySecret = "ご利用の AccessKey Secret"; // コンソールで SDK にアクセスするために使用する AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       DNSResolver.Init(this,accountId,accessKeyId,accessKeySecret); // コンソールで SDK にアクセスするために使用するアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       // 注:キャッシュに保持するドメイン名を設定すると、TTL の 75% が経過した時点で自動的に名前解決が開始されます。これにより、設定されたドメイン名の名前解決は常にキャッシュにヒットします。ただし、CDN を使用している場合、TTL の値が小さくなることがあります。これにより、名前解決リクエストが増加し、コストが増大します。このメソッドは注意して使用してください。
       DNSResolver.setKeepAliveDomains(new String[]{"キャッシュに保持するドメイン名 1","キャッシュに保持するドメイン名 2",...});
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"事前解決するドメイン名 1","事前解決するドメイン名 2",...}); // 事前解決のために IPv4 タイプの指定ドメイン名を設定します。事前解決ドメイン名を Alibaba Cloud DNS を使用して解決したいドメイン名に置き換えてください。
    }
}
説明

DNSResolver は、モバイル解決 HTTPDNS SDK のコアクラスです。モバイル解決 HTTPDNS が提供する DoH JSON API をカプセル化し、ユーザーのターゲットドメイン名を対応する IP アドレスに解決します。モバイル解決 HTTPDNS SDK を統合する際は、Application の子クラスに統合することを推奨します。

Android アプリでは、以下の権限も宣言する必要があります。

<!--必要な権限-->
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

SDK の認証

バージョン 2.0 以降、この SDK はユーザー ID のセキュリティを保護し、不正な第三者による悪用を防ぐための認証をサポートしています。認証を有効にするには、「キーの作成」を参照して、コンソールで AccessKey IDAccessKey Secret を作成します。SDK の初期化時に認証パラメーターを設定しない場合、モバイル解決 HTTPDNS は認証なしのドメイン名解決リクエストを拒否します。これにより、ドメイン名の名前解決機能が無効になり、ビジネス運用に影響が出ます。そのため、モバイル解決 HTTPDNS SDK を初期化する際には、認証パラメーターを設定する必要があります。

認証パラメーターは次のように設定します。

DNSResolver.Init(this,accountId,accessKeyId,accessKeySecret);
警告
  • アカウント ID、AccessKey ID、AccessKey Secret などの機密パラメーターや、アプリのランタイム中に生成されたデータがログに表示されないようにするため、本番環境のビルドでは SDK のデバッグログを無効にしてください。

  • すべてのユーザーが同じ SDK を統合するため、コード内で アカウント ID、AccessKey ID、AccessKey Secret を設定する必要があります。これらのパラメーターは使用量の測定と課金に関連しています。悪意のある逆コンパイルによってこれらが漏洩するのを防ぐため、アプリを公開する前に難読化を有効にし、アプリを強化してください。

SDK 統合に関する一般的な問題

Android 9.0 で HTTP リクエストを送信する際に「cleartext HTTP traffic not permitted」がスローされる

原因:Android 9.0 (API レベル 28) 以降、Android はデフォルトでクリアテキストのネットワークトラフィックをブロックし、HTTPS URL のみを許可します。

ソリューション

AndroidManifest.xml ファイルの <application> 要素に次の行を追加します。

android:usesCleartextTraffic="true"

<application
        android:name=".DnsCacheApplication"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">

Android 9.0 で「Didn't find class BasicHttpParams」がスローされる

原因:Apache HTTP クライアントは非推奨になりました。

Google は Android 6.0 で Apache HTTP クライアントのサポートを終了しました。Android 9.0 以降、org.apache.http.legacy は bootclasspath から削除されています。

この変更は、taskVersion が 9.0 未満のほとんどのアプリケーションには影響しません。taskVersion が 9.0 より大きいアプリケーションでは、Apache HTTP インターフェイスが直接または参照される lib パッケージによって使用される場合、Apache HTTP インターフェイスが見つからないという例外が発生します。

ソリューション

AndroidManifest.xml ファイルの <application> 要素に次の行を追加します。

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

この SDK はバージョン 2.1.9 から JNI を導入しています。アプリプロジェクトで NDK を構成してください

  • アプリプロジェクトのルートディレクトリにある local.properties ファイルに NDK のインストールパスを追加します。

ndk.dir=...\\ndk\\21.4.7075529; // ... はローカルの NDK インストールパスです
  • アプリプロジェクトのルートディレクトリにある gradle.properties ファイルに次の構成を追加します。

android.useDeprecatedNdk = true;

アプリプロジェクトに NDK がすでに構成されている場合は、このステップをスキップしてください。最良の結果を得るには、JDK 1.8 と NDK 21.4.7075529 を使用してアプリをコンパイルしてください。

API リファレンス

共通設定

1. Init メソッドを使用した初期化

Application クラスで SDK を初期化する際に Init メソッドを呼び出します。

DNSResolver.Init(this,アカウント ID,AccessKey ID,AccessKey Secret);

2. 事前解決ドメイン名の設定

プログラムの初期化時に、使用する予定のドメイン名を モバイル解決 HTTPDNS SDK に事前登録することを強く推奨します。これにより、SDK が事前にドメイン名を解決し、後続の解決リクエストのレイテンシーを削減できます。次のメソッドを呼び出して、事前解決するドメイン名を設定します。

  • IPv4 または IPv6 の事前解決を指定

// 事前解決する指定ドメイン名のタイプを設定します。事前解決ドメイン名を Alibaba Cloud DNS を使用して解決したいドメイン名に置き換えてください。
DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{...});

// DNSResolver.QTYPE_IPV4: 事前解決用の IPv4 レコードタイプ。
// DNSResolver.QTYPE_IPV6: 事前解決用の IPv6 レコードタイプ。
// DNSResolver.QTYPE_IPV4_IPV6: 事前解決用の IPv4 および IPv6 レコードタイプ。
  • 現在のネットワーク環境を自動検出します。デュアルスタックネットワークでは、IPv4 と IPv6 の両方のドメイン名を事前解決します。

DNSResolver.getInstance().preLoadDomains(domains);
重要

事前解決インターフェイスは、リアルタイムで非同期のネットワークリクエストをトリガーします。このインターフェイスを呼び出す前に、必要なすべての初期化ステップが完了していることを確認してください。

3. キャッシュのキープアライブ対象ドメインの設定

SDK は、設定されたドメインの TTL が 75% 経過すると自動的に解決します。これにより、名前解決リクエストが常にキャッシュにヒットし、解決効率が向上します。この設定は 10 ドメイン以内に制限してください。この設定は事前解決とは独立しています。

DNSResolver.setKeepAliveDomains(new String[]{"ユーザー指定のドメイン名 1", "ユーザー指定のドメイン名 2"});
説明

メリット

1. TTL が切れる前にレコードが更新されます。

2. プリロードと併用すると、初回の解析レイテンシーを 0 ms に削減できます。

デメリット

1. TTL の 75% で再解決すると、追加料金が発生します。

4. IPv6 サーバーアドレスの有効化または無効化

モバイル解決 HTTPDNS は、デュアルスタックの IPv4 および IPv6 アドレスアクセスをサポートしています。DNSResolver.setEnableIPv6(boolean enable) メソッドを使用して、サーバー側の IPv6 アドレスを使用するかどうかを設定します。このパラメーターを true に設定すると、サービスは IPv6 アドレスを使用してサーバー側のインターフェイスにアクセスします。false に設定すると、IPv4 アドレスを使用します。この設定を明示的に構成しない場合、サービスはデフォルトで IPv4 になります。さらに、IPv6 を有効にして モバイル解決 HTTPDNS サービスに到達できない場合、自動フェイルオーバーは IPv4 アドレスに切り替わり、1 回のリトライをサポートします。

5. 最大キャッシュサイズの設定

DNSResolver.getInstance().setMaxCacheSize(CACHE_MAX_NUMBER); // キャッシュエントリの最大数を設定します。デフォルトは 100 です。

最大数をカスタマイズできます。

6. サーバーアクセス用プロトコルの設定

SDK は、DNS 名前解決のための HTTP リクエストプロトコルタイプの設定をサポートしており、HTTP と HTTPS のどちらかを選択できます。SDK は、セキュリティが向上するため、デフォルトで HTTPS を使用して DNS 名前解決を行います。モバイル解決 HTTPDNS の課金は HTTP 名前解決リクエストに基づいており、HTTPS 名前解決は HTTP トラフィックの 5 倍で課金されます。ビジネスニーズに基づいて HTTP リクエストプロトコルタイプを選択してください。

DNSResolver.setSchemaType(DNSResolver.HTTPS); // デフォルトのアクセスモードは HTTPS です。

DNSResolver.HTTP:HTTP 経由でサーバー側インターフェイスにアクセスします。

DNSResolver.HTTPS:HTTPS 経由でサーバー側インターフェイスにアクセスします。

7. IP 速度測定用のポート番号の設定

DNSResolver.setSpeedPort(DNSResolver.PORT_80);

ソケットベースの IP プロービング用のポート番号を設定できます。デフォルトは 80 です。

その他の高度な設定

1. SDK デバッグログの有効化または無効化

DNSResolver.setEnableLogger(true); // SDK のデバッグログはデフォルトで無効になっています

デバッグログを有効にするには true に、無効にするには false に設定します。

2. 解析失敗時に モバイル解決 HTTPDNS が自動的にローカル DNS にフォールバックして解決するかどうかの設定

DNSResolver.setEnableLocalDns(true); // デフォルトでは、HTTPDNS の解決に失敗した場合、LocalDNS への自動フォールバックが有効になっています。

3. ショートモードの有効化または無効化

モバイル解決 HTTPDNS の DoH JSON API は、完全な JSON 形式と単純な IP 配列形式の 2 つの形式でデータを返します。DNSResolver.setEnableShort(boolean enable) を呼び出して、ショートモードを有効または無効にできます。DNSResolver.setEnableShort(boolean enable) を構成しない場合、ショートモードはデフォルトで無効になります。以下のように設定します。

DNSResolver.setEnableShort(true); // デフォルト値は false です。このパラメーターを設定する必要はありません。
重要

ショートモードでは、SDK は モバイル解決 HTTPDNS サービスを呼び出し、より単純な IP アドレス配列を返します。これにより、応答データ量が削減され、ネットワークトラフィックが重要なシナリオに適しています。

4. 有効期限のないキャッシュの有効化または無効化

DNSResolver.setImmutableCacheEnable(false); // デフォルトでは、不変キャッシュ(有効期限が切れないキャッシュ)は無効化されています
重要

SDK は、3 つのキャッシュ更新メカニズムを提供します。

  • キャッシュの有効期限なし: この機能を有効にすると、アプリの実行中はキャッシュが常に有効として扱われます。キャッシュの有効期限チェックと更新は実行されません。setKeepAliveDomains を呼び出してキャッシュを手動でリフレッシュする必要はありません。これにより、DNS 解決リクエストの数を最小限に抑えることができます。

    設定方法: DNSResolver.setImmutableCacheEnable(boolean var0)

    パラメーターの説明: パラメーター var0true の場合、キャッシュの有効期限なし機能が有効になります。var0false の場合、この機能は無効になります。

  • アクティブなキャッシュ更新: キープアライブドメインの TTL が元の値の 75% に低下すると、SDK は新しい解決をトリガーしてキャッシュを更新します。これにより、権威ゾーンが変更されたときにレイテンシーが削減され、レコードが最新の状態に保たれます。最大 10 個のドメイン名。

    設定方法: DNSResolver.setKeepAliveDomains(String[] var1)

    メトリックの説明: var1 は、アクティブにリフレッシュされるドメイン名文字列の配列です。

  • パッシブなキャッシュ更新:

    以下の 2 つのメソッドを呼び出して解析結果を取得すると、キャッシュは自動的に更新されます。

    • getIPsV4ByHost(String hostName) は、hostName の IPv4 レコードの配列を取得します。キャッシュが空ではなく、TTL 有効期間内である場合、キャッシュされた結果を返します。それ以外の場合、ネットワークリクエストを介して最新の解析結果を取得し、結果を返してキャッシュを更新します。このメソッドは、高い解析精度が要求されるシナリオで一般的に使用されます。

    • getIpv4ByHostFromCache(String hostName, boolean isAllowExp) は、キャッシュから hostName に対応する IPv4 レコードの配列を取得します。このメソッドは、isAllowExp パラメーターの値に基づいて、キャッシュから期限切れの DNS レコードを返すかどうかを判断します。アプリの起動時に最新の DNS レコードがキャッシュされるように、このメソッドをアプリ起動時のプリロードメソッドと組み合わせて使用することを推奨します。

      説明: isAllowExptrue の場合、キャッシュが期限切れになっている場合でも古いレコードを返し (またはキャッシュが空の場合は null)、非同期にキャッシュを更新します。false の場合、キャッシュが期限切れまたは空のときに null を返し、非同期にキャッシュを更新します。

    推奨パターン:

    String[] IPArray = mDNSResolver.getIpv4ByHostFromCache(hostname,true);
            if (IPArray == null || IPArray.length == 0){
                IPArray = mDNSResolver.getIPsV4ByHost(hostname);
            }

5. キャッシュの有効化・無効化

DNSResolver.setEnableCache(true); // キャッシュはデフォルトで有効になっています。

キャッシュを有効にするには`true`に設定し、無効にするには`false`に設定します。

6. IP速度テストを有効化または無効化する

DNSResolver.setEnableSpeedTest(false); // IP 速度テストはデフォルトで無効です。

IP スピードテストを有効にするには true に設定し、無効にするには false に設定します。

7. ISP に基づくドメイン名キャッシュの有効化または無効化

DNSResolver.setIspEnable(true);//デフォルトで ISP ベースのドメイン名キャッシュを有効にします。

有効にすると、各ネットワーク環境(ISP)は独自のキャッシュを保持します。無効にすると、すべてのネットワーク環境が単一のキャッシュを共有します。

8. ネガティブキャッシュの最大 TTL の設定

DNSResolver.setMaxNegativeCache(MAX_NEGATIVE_CACHE);// ネガティブキャッシュの最大 TTL を設定します。デフォルトは 30 秒です。

ネガティブキャッシュは、IP アドレスが設定されていないドメイン名に対する応答をキャッシュします。これらの無効なキャッシュエントリに対して、最大 TTL を設定します。

9. キャッシュの最大TTLを設定する

DNSResolver.setMaxTtlCache(MAX_TTL_CACHE);// キャッシュの最大 TTL を設定します。デフォルト値は 3600 秒です。

キャッシュエントリの最大 TTL を設定します。設定した場合、キャッシュエントリの TTL はこの値を超えることはありません。デフォルトは 3600 秒です。

10. クライアント サブネット情報の設定

DNSResolver.setEdnsSubnet("1.2.XX.XX/24");

setEdnsSubnet メソッドは、EDNS クライアントサブネット (ECS) 機能 (RFC 7871) をサポートしています。このメソッドは、より正確な名前解決およびトラフィック再ルーティングのために、サブネット情報を権威 DNS サーバに渡します。長いマスクほどアドレス情報が正確になります。短いマスクほどプライバシーが向上します。/24 を推奨します。

説明

このパラメーターは、DNS プロキシが DoH JSON API を使用するシナリオ(つまり、ユーザーが DNS クエリを DNS プロキシに送信し、DNS プロキシが本パラメーターを用いてユーザーのサブネット情報を モバイル解決 HTTPDNS へ転送し、最終的に権威サーバーへ到達する)を想定して設計されています。

たとえば、DNSResolver.setEdnsSubnet("1.2.XX.XX/24") を実行すると、権威サーバーが 1.2.XX.XX/24 プレフィックスに基づくプレフィックス情報を受信し、DNS パスの選択を支援します。

11. 名前解決タイムアウトの設定

timeout は、名前解決のタイムアウト期間を指定します。デフォルトのタイムアウト期間は 3 秒です。タイムアウト期間はカスタマイズ可能で、2~5 秒の値に設定することを推奨します。

DNSResolver.setTimeout(3);

12. トラブルシューティングのための SessionId の取得

sessionId パラメーターは、アプリケーションが起動するときに生成され、アプリケーションライフサイクル全体にわたって変更されません。同じアプリケーションライフサイクル内のすべての モバイル解決 HTTPDNS 解決要求には同じ sessionId が含まれ、サーバーはこのパラメーターを記録してインデックスを生成します。sessionId は、アプリケーションライフサイクルの追跡およびアプリケーションシナリオにおける問題のトラブルシューティングに使用されます。

public static String getSessionId()

13. ロギングコールバック

コールバック SDK によって生成されたログ。

HttpDnsLog.setLogger(new ILogger() {
  @Override
  public void log(String msg) {
      Log.d("HttpDnsLogger:", msg);
  }
});

難読化構成

   -keep class com.alibaba.pdns.** {*;}

サービス API

  /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいてドメイン名を事前ロードします。
   * デュアルスタックのネットワーク環境では、IPv4 と IPv6 両方の名前解決結果が事前ロードされます。このメソッドは、アプリケーションの起動時に SDK を初期化する際に呼び出すことができます。
   * このメソッドは、名前解決結果をキャッシュに事前格納することで、後続のドメイン名解決のレイテンシーを削減します。
   *
   * @param domains 事前ロードするドメイン名。
   */
   public void preLoadDomains(final String[] domains)

    /**
     * 指定されたドメイン名を IPv4 または IPv6 の名前解決のために事前ロードします。
     * このメソッドは、アプリケーションの起動時に SDK を初期化する際に呼び出すことができます。このメソッドは、名前解決結果をキャッシュに事前格納することで、後続のドメイン名解決のレイテンシーを削減します。
     *
     * @param qType ドメイン名を IPv4 または IPv6 の名前解決のために事前ロードするかどうかを指定します。
     * @param domains 事前ロードするドメイン名。
     */
    public void preLoadDomains(String qType, final String[] domains)
   /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいて、ドメイン名の名前解決データを取得します。
   * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
   * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
   *
   * @param host 名前解決するドメイン名。
   * @return 現在のネットワーク環境に基づいた最適な IP アドレス配列。
   */
    public String[] getIpsByHost(String host)

/**
    * ホスト名に対応する IPv4 レコードの配列を取得します。
    * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
    * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
    *
    * @param hostName ホスト名 (例: www.taobao.com)。
    * @return ホスト名に対応する IPv4 アドレスの配列。
    */
  public  String[] getIPsV4ByHost(String hostName) 

   /**
    * ホスト名に対応する IPv6 レコードの配列を取得します。
    * @param hostName ホスト名 (例: www.taobao.com)。
    * @return ホスト名に対応する IPv6 アドレスの配列。
    */
  public String[] getIPsV6ByHost(String hostName) 

  

  /**
   * 自動検出されたネットワーク環境 (IPv4 のみ、IPv6 のみ、またはデュアルスタック) に基づいて、名前解決されたドメイン名の IP アドレス配列をキャッシュから取得します。
   * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はキャッシュに格納されます。
   * 名前解決結果がキャッシュに存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
   * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、キャッシュを非同期で更新します。
   *
   * @param host クエリ対象のドメイン名 (例: www.taobao.com)。
   * @param isAllowExp 期限切れのドメイン名の名前解決結果を返すかどうかを指定します。
   * @return キャッシュから取得した、名前解決されたホストの IP アドレス配列。
   */
   public String[] getIpsByHostFromCache(String host, boolean isAllowExp)
   
    /**
     * 名前解決されたドメイン名の IPv4 レコードタイプの IP アドレス配列をキャッシュから取得します。
     * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はキャッシュに格納されます。
     * 名前解決結果がキャッシュに存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
     * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、キャッシュを非同期で更新します。
     *
     * @param host クエリ対象のドメイン名 (例: www.taobao.com)。
     * @param isAllowExp 期限切れのドメイン名の名前解決結果を返すかどうかを指定します。
     * @return host フィールドが名前解決された後、キャッシュから取得した IPv4 レコードタイプの IP アドレス配列。
     */
    private String[] getIpv4ByHostFromCache(String host , boolean isAllowExp)

    /**
     * 名前解決されたドメイン名の IPv6 レコードタイプの IP アドレス配列をキャッシュから取得します。
     * キャッシュが空の場合、このメソッドは null を返し、非同期クエリを開始します。クエリ結果はキャッシュに格納されます。
     * 名前解決結果がキャッシュに存在し、期限切れの結果を返すことを許可している場合、期限切れの IP アドレスが返され、キャッシュは非同期で更新されます。
     * 期限切れの結果を返すことを許可せず、キャッシュされた結果が期限切れの場合、このメソッドは null を返し、キャッシュを非同期で更新します。
     *
     * @param host クエリ対象のドメイン名 (例: www.taobao.com)。
     * @param isAllowExp 期限切れのドメイン名の名前解決結果を返すかどうかを指定します。
     * @return host フィールドが名前解決された後、キャッシュから取得した IPv6 レコードタイプの IP アドレス配列。
     */
    private String[] getIpv6ByHostFromCache(String host , boolean isAllowExp)

  /**
  * URL に対応する IPv4 レコード内の DomainInfo オブジェクト配列を取得します。
  * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
  * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
  *
  * @param url URL (例: http://www.taobao.com)。
  * @return URL に対応する IPv4 レコード内の DomainInfo オブジェクト配列。
  */
  public DomainInfo[] getIPsV4DInfoByUrl(String url) 

  注: DomainInfo オブジェクト内の URL は、host フィールドが特定の IP アドレスに自動的に置き換えられた URL です。URL 内の host フィールドを手動で置き換える必要はありません。

  /**
   * URL に対応する IPv6 レコード内の DomainInfo オブジェクト配列を取得します。
   * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
   * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
   * 
   * @param url URL (例: http://m.taobao.com)。
   * @return URL に対応する IPv6 レコード内の DomainInfo オブジェクト配列。
   */
   public DomainInfo[] getIPsV6DInfoByUrl(String url) 

  /**
    * 特定の URL に対応する IPv4 レコード内の DomainInfo オブジェクトを取得します。
    * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
    * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
    *
    * @param url URL (例: http://m.taobao.com)。
    * @return URL に対応する IPv4 レコード内の DomainInfo オブジェクト。
    */
    public DomainInfo getIPV4DInfoByUrl(String url) 


  /**
    * 特定の URL に対応する IPv6 レコード内の DomainInfo オブジェクトを取得します。
    * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
    * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
    *
    * @param url URL (例: http://www.taobao.com)。
    * @return URL に対応する IPv6 レコード内の DomainInfo オブジェクト。
    */
   public DomainInfo getIPV6DInfoByUrl(String url) 

   注: 返される DomainInfo オbジェクトは、以下のプロパティをカプセル化します。

  /**
   * エンドポイントの自動インクリメント ID。
    */
    public String id = null;

   /**
    * 直接使用できる URL。URL 内のホストは IP アドレスに置き換えられます。
    */
     public String url = null;

    /**
    * HTTP リクエストのヘッダーに含める必要があるサービス名。
    */
    public String host = "";

   /**
    * 返されたコンテンツボディ。
    */
   public String data = null;

   /**
    * リクエストが開始された時刻。
    */
   public String startTime = null;

   /**
    * リクエストが終了した時刻。リクエストがタイムアウトした場合、この値は null になります。
    */
   public String stopTime = null; 

   /**
   * 返されたサーバーステータスコード (例: 200、404、500)。
   */
   public String code = null;

  /**
    * ホスト名に対応する IPv4 レコードを取得します。
    * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
     * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
  
    * @param hostName ホスト名 (例: www.taobao.com)。
    * @return ホスト名に対応する IPv4 アドレスのセットからランダムな IPv4 アドレスが返されます。IP アドレスの接続速度テストが有効な場合は、最適な IPv4 アドレスが返されます。
    */
  public String getIPV4ByHost(String hostName) 

   /**
    * ホスト名に対応する IPv6 レコードを取得します。
    * 名前解決結果がキャッシュに存在し、かつ期限切れでない場合は、キャッシュから結果が返されます。
    * キャッシュが空であるか、キャッシュされた結果が期限切れの場合、サーバーに同期ネットワークリクエストが送信され、再帰的な名前解決結果が取得されます。その結果が返され、キャッシュに格納されます。
  
    * @param hostName ホスト名 (例: www.taobao.com)。
    * @return ホスト名に対応する IPv6 アドレスのセットからランダムな IPv6 アドレスが返されます。IP アドレスの接続速度テストが有効な場合は、最適な IPv6 アドレスが返されます。
    */
   public String getIPV6ByHost(String hostName) 
      

    /**
     * HTTPDNS のリクエストの成功と失敗に関する統計を取得します。
     *
     * @return すべてのドメイン名の名前解決統計の JSON 配列文字列。
     */
    public String getRequestReportInfo()
    
     /**
     * ドメイン名のキャッシュの永続化を設定します。設定されたドメイン名の名前解決は、TTL の 75% が経過した時点で自動的に開始されます。これにより、設定されたドメイン名の名前解決が常にキャッシュにヒットし、SDK の名前解決効率が向上します。
     * この機能には、過剰な数のドメイン名を設定しないことを推奨します。現在の制限は 10 ドメイン名です。この機能は、事前解決機能とは独立して設定されます。
     *
     * @param persistentCacheDomains 永続化するドメイン名の配列。
     */
    public synchronized static void setKeepAliveDomains(String[] persistentCacheDomains) {
    
     /**
     * 指定されたドメイン名のキャッシュを消去します。ホスト名が null の場合、すべてのドメイン名のキャッシュが消去されます。
     *
     * @param domains キャッシュを消去したいドメイン名の配列。
     */
    public void clearHostCache(String[] domains){

API 使用例

URL:入力エンドポイント。例: http://www.taobao.com。

 String hostname = "www.taobao.com";
 String url = "http://www.taobao.com";

1. 現在のネットワーク環境に最適な IP データの取得

String[] ip = DNSResolver.getInstance().getIpsByHost(hostname); // 現在のネットワークのドメイン名名前解決から最適な IP アドレスを取得します。

2. 現在のネットワーク環境におけるドメイン名名前解決のプリロード

DNSResolver.getInstance().preLoadDomains(domains); // ドメイン名を事前解決します。`domains` を Alibaba Cloud DNS で解決したいドメイン名に置き換えてください。

3. 現在のネットワーク環境のキャッシュされたドメイン名名前解決の取得

String[] ip = DNSResolver.getInstance().getIpsByHostFromCache(hostname,true);// 現在のネットワーク環境のキャッシュからドメイン名名前解決データを取得します。

4. IPv4 アドレスの取得

String IPV4 = DNSResolver.getInstance().getIPV4ByHost(hostname); // ドメイン名名前解決から IPv4 アドレスを取得します。

5. IPv6 アドレスの取得

String IPV6 =  DNSResolver.getInstance().getIPV6ByHost(hostname); // ドメイン名名前解決から IPv6 アドレスを取得します。

6. キャッシュから解決済みの IPv4 アドレスの取得

String[] IPV4 =  DNSResolver.getInstance().getIpv4ByHostFromCache(hostname , true); // キャッシュから解決済みの IPv4 アドレスを取得します。

7. キャッシュから解決済みの IPv6 アドレスの取得

String[] IPV6 =  DNSResolver.getInstance().getIpv6ByHostFromCache(hostname , true); // キャッシュから解決済みの IPv6 アドレスを取得します。

8. URL による DomainInfo オブジェクトの取得

DomainInfo dinfo = DNSResolver.getInstance().getIPV4DInfoByUrl(url); // 置き換えられた URL を取得します。

9. 特定のドメイン名の名前解決キャッシュのクリア

DNSResolver.getInstance().clearHostCache(hostName); // 指定されたドメイン名のキャッシュをクリアします。すべてのドメイン名のキャッシュをクリアするには、hostName を null に設定します。

10. 成功した Alibaba Cloud DNS リクエストと失敗したリクエストの統計情報の取得

String reportInfo = DNSResolver.getInstance().getRequestReportInfo(); // 成功したリクエストと失敗したリクエストに関する統計情報を取得します。

ドメイン名名前解決統計の JSON 文字列配列における各フィールドの説明は以下の通りです:

 [
      {
         "avgRtt":"1",                         // 平均名前解決時間 (単位:ミリ秒 (ms))
         "degradeLocalDnsCount": 0,            // Local DNS へのフォールバック回数
         "domainName":"www.example.com",       // 解決中のドメイン名
         "hitDnsCacheCount": 1,                // キャッシュヒット数
         "httpabnormalCount": 0,               // 再帰的なクエリの失敗数
         "isp": "China Mobile",                // ISP 名
         "localDnsResolveErrCount": 0,         // Local DNS の名前解決失敗数
         "maxRtt": 8.0,                        // 最大名前解決時間 (単位:ミリ秒 (ms))
         "nonetworkCount": 0,                  // ネットワーク接続がなかった回数
         "permissionErrCount": 0,              // ユーザー認証の失敗数
         "queryType": 1,                       // IP タイプ。1 は IPv4 を、28 は IPv6 を示します
         "recursiveReqCount": 1,               // 再帰的なクエリの数
         "reqParameterErrCount": 0,            // リクエストパラメーターのフォーマットエラー数
         "reqPathErrCount": 0,                 // URL エラー数
         "reqServerErrCount": 0,               // DNS サーバー側のエラー数
         "reqTimeoutCount": 0,                 // DNS サービスのタイムアウトエラー数
         "resolveSuccessCount": 1,             // 名前解決の成功数
         "timeoutCount": 0,                    // ネットワークタイムアウトエラー数
         "utfNetWorkErroNum": 0                // データレポートのタイムアウトエラー数
      }
         ......
 ]
重要

モバイル解決 HTTPDNS への名前解決リクエストの統計は、ネットワーク環境、ドメイン名、およびリクエストタイプ別に集計されます。

public class MainActivity extends AppCompatActivity {
   private Button button;
   private TextView tvInfo;
   private TextView tvResult;
   private String hostUrl = "http://www.taobao.com"; // これを解決したい hostUrl に置き換えてください。
   private String hostName = "www.taobao.com"; // これを解決したい hostName に置き換えてください。
   private static final String TAG = "PDnsDemo";
   private static ExecutorService pool = Executors.newSingleThreadExecutor();
   private static final String PDNS_RESULT = "pdns_result";
   private static final int SHOW_CONSOLE_TEXT = 10000;
   private Handler mHandler;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.demo_activity_main);
       init();
       initHandler();
   }
 private void init() {
       tvInfo = findViewById(R.id.tv_respons_info);
       tvResult = findViewById(R.id.tv_respons);
       button = findViewById(R.id.btn_onclik);
       button.setOnClickListener(new View.OnClickListener() {
           public void onClick(View view) {
               new Thread(new Runnable() {
                      @Override
                      public void  run() {
                      // HTTPDNS SDK の getIPV4ByHost メソッドを呼び出して、ターゲットドメイン名の解決済み IP アドレスを取得します。
                      String ip = DNSResolver.getInstance().getIPV4ByHost(hostName);
                      if(ip != null){
                         tvInfo.setText("The resolved IP for the domain is: "+ ip);
                      }
                      // HTTPDNS SDK の getIPV4DInfoByUrl メソッドを呼び出して、DomainInfo オブジェクトを取得します。このオブジェクトの URL は、ホストが解決済み IP アドレスに置き換えられた元の URL です。
                      DomainInfo dinfo = DNSResolver.getInstance().getIPV4DInfoByUrl(hostUrl);
                      if (dinfo != null) {
                           showResponse(dinfo);
                      }
                   }
               }).start();
           }
       });
   }
   private void initHandler() {
       mHandler = new Handler() {
           @Override
           public void handleMessage(Message msg) {
               switch (msg.what)  {
                   case SHOW_CONSOLE_TEXT:
                       tvResult.setText(msg.getData().getString(PDNS_RESULT) + "\n");
                       break;
               }
           }
       };
   }
   private void showResponse(final DomainInfo dinfo) {
                // HTTP リクエストを送信します
               String requestUrl = dinfo.url;
               HttpURLConnection conn = null;
               try {
                   URL url = new URL(requestUrl);
                   conn = (HttpURLConnection) url.openConnection();
                   // IP アドレスを使用してアクセスする場合、HTTP リクエストヘッダーの host フィールドを解決済みのドメイン名に設定する必要があります。
                   conn.setRequestProperty("Host", url.getHost()); // HTTP リクエストヘッダーの host フィールドを設定します。
                   DataInputStream dis = new DataInputStream(conn.getInputStream());
                   int len;
                   byte[] buff = new byte[4096];
                   StringBuilder response = new StringBuilder();
                   while ((len = dis.read(buff)) != -1) {
                       response.append(new String(buff, 0, len));
                   }
                   Log.d(TAG, "Response: " + response.toString());
                   dis.close();
                   sendMessage(response.toString());
               } catch (IOException e) {
                   e.printStackTrace();
               } finally {
                   if (conn != null) {
                       conn.disconnect();
                   }
               }
           }
   private void sendMessage(String message) {
       if (mHandler != null) {
               Message msg = mHandler.obtainMessage();
               Bundle bundle = new Bundle();
               bundle.putString(PDNS_RESULT, message);
               msg.setData(bundle);
               msg.what = SHOW_CONSOLE_TEXT;
               mHandler.sendMessage(msg);
       }
   }
}

public class DnsCacheApplication extends Application {
    
    private String Account ID = "your Account ID"; // コンソールでの SDK 統合のために Account ID を設定します。
    private String AccessKey ID = "your AccessKey ID"; // コンソールでの SDK 統合のために AccessKey ID を設定します。
    private String AccessKey Secret = "your AccessKey secret"; // コンソールでの SDK 統合のために AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       DNSResolver.Init(this, Account ID, AccessKey ID, AccessKey Secret); // コンソールでの SDK 統合のために Account ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.setKeepAliveDomains(new String[]{"domain-name-1", "domain-name-2", ...}); // キャッシュ保持用のドメイン名を設定します。これらのドメイン名は、TTL の 75% の時点で自動的に解決され、ドメイン名名前解決中のキャッシュヒットを保証します。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4, new String[]{"domain-name-to-preload-1", "domain-name-to-preload-2", ...}); // IPv4 ドメイン名を事前解決します。プリロードされたドメイン名を、Alibaba Cloud DNS を使用して解決したいドメイン名に置き換えてください。
    }
}

ドメイン名の名前解決に関するベストプラクティス

事前解決 + 有効期限切れ応答の許容 = 最高のパフォーマンス

パフォーマンス重視のネットワーク環境では、事前解決と有効期限切れ応答の許容を組み合わせることで、DNS 名前解決の速度が大幅に向上します。場合によっては、ゼロレイテンシでの名前解決を実現することも可能です。

SDK に組み込まれたキャッシュ機能により、事前解決後に同一ドメイン名に対する後続のリクエストは、直接キャッシュからヒットします。これによりネットワーク往復通信が不要となり、ユーザー体験が大きく向上します。

1. 事前解決

キャッシュ機能を有効化し、重要なドメイン名を事前に解決します(アプリケーション起動時に実行することを推奨)。

Application クラスの onCreate() メソッド内で、ビジネスロジックで使用するドメイン名を事前に解析し、結果をローカルメモリにキャッシュします。

1. IPv4 専用環境向け

// ******** IPv4 のみをサポートするシナリオ向け *******
public class DnsCacheApplication extends Application{
    private String Account ID = "your Account ID"; // コンソールでの SDK 統合用に、Account ID を設定します
    private String AccessKey ID = "your AccessKey ID"; // コンソールでの SDK 統合用に、AccessKey ID を設定します
    private String AccessKey Secret = "your AccessKey secret "; // コンソールでの SDK 統合用に、AccessKey Secret を設定します

    @Override
    public void onCreate() {
       super.onCreate();
       DNSResolver.Init(this,Account ID,AccessKey ID,AccessKey Secret); // コンソールでの SDK 統合用に、Account ID、AccessKey ID、AccessKey Secret を設定します
       DNSResolver.setEnableCache(true); // キャッシュ機能を有効化します。デフォルト値:true
       // 事前解決対象のレコードタイプ(IPv4)
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"example-domain-1.com","example-domain-2.com",...}); // 指定した IPv4 タイプのドメイン名を事前解決します。サンプルドメイン名は、Alibaba Cloud DNS を使用して解決したいドメイン名に置き換えてください。
    }
}

2. IPv6 対応環境向け

//******** IPv6 サポートが必要なシナリオ向け *******
public class DnsCacheApplication extends Application{
    private String accountID = "your_account_id"; // コンソールから SDK を利用するための Account ID を設定します。
    private String accessKeyID = "your_accesskey_id"; // コンソールから SDK を利用するための AccessKey ID を設定します。
    private String accessKeySecret = "your_accesskey_secret"; // コンソールから SDK を利用するための AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // コンソールから SDK を利用するための Account ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountID, accessKeyID, accessKeySecret);
       // キャッシュ機能の有効化を指定します。この機能はデフォルトで有効です。
       DNSResolver.setEnableCache(true);
       // IPv6 ネットワーク経由でのドメイン名解決を有効化します。この機能はデフォルトで無効です。
       DNSResolver.setEnableIPv6(true);  
       // IP スピードテスト機能を有効化します。この機能はデフォルトで無効です。
       DNSResolver.setEnableSpeedTest(true); 
       // ドメイン名を IPv4 アドレスおよび IPv6 アドレスの両方で事前解決します。
       // 指定した IPv4/IPv6 タイプのドメイン名を事前解決します。サンプルドメイン名は、Alibaba Cloud DNS を使用して解決したいドメイン名に置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4_IPV6,new String[]{"your_domain_to_preload_1","your_domain_to_preload_2",...});
    }
}

2. 有効期限切れ応答の許容

まずキャッシュ内の結果を利用します(有効期限切れの IP アドレスも許容)。ネットワークリクエストを送信する前に、キャッシュから IP アドレスを取得し、有効期限は切れているものの依然として使用可能なキャッシュエントリを活用します。これにより、TTL が切れた後でもキャッシュエントリが存在すれば即時応答が得られ、待ち時間ゼロを実現できます。

1. IPv4 専用環境向け

    //******** IPv4 のみをサポートするシナリオ向け *******
    @Override
    public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
        // キャッシュから IP アドレスを優先的に取得(第 2 パラメーターを true に設定すると、有効期限切れだがアクティブなレコードを返すことが可能)
        String[] IPArray = mDNSResolver.getIpv4ByHostFromCache(hostname,true);
        if (IPArray == null || IPArray.length == 0){
            // キャッシュミス:非同期で名前解決を開始
            IPArray = mDNSResolver.getIPsV4ByHost(hostname);
        }
        if (IPArray != null && IPArray.length > 0) {
            List<InetAddress> inetAddresses = new ArrayList<>();
            InetAddress address;
            for (String ip : IPArray) {
                address = InetAddress.getByName(ip);
                inetAddresses.add(address);
            }
            if (!inetAddresses.isEmpty()) {
                return inetAddresses;
            }
        }
        return okhttp3.Dns.SYSTEM.lookup(hostname);
    }

2. IPv6 対応環境向け

    //******** IPv6 サポートが必要なシナリオ向け *******
    @Override
    public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
        // キャッシュから IP アドレスを最初に取得(第 2 パラメーターを true に設定すると、有効期限切れだがアクティブなレコードを返すことが可能)
        String[] IPArray = mDNSResolver.getIpsByHostFromCache(hostname,true);
        if (IPArray == null || IPArray.length == 0){
            // キャッシュミス:非同期で名前解決を開始
            IPArray = mDNSResolver.getIpsByHost(hostname);
        }
        if (IPArray != null && IPArray.length > 0) {
            List<InetAddress> inetAddresses = new ArrayList<>();
            InetAddress address;
            for (String ip : IPArray) {
                address = InetAddress.getByName(ip);
                inetAddresses.add(address);
            }
            if (!inetAddresses.isEmpty()) {
                return inetAddresses;
            }
        }
        return okhttp3.Dns.SYSTEM.lookup(hostname);
    }

注意事項

  1. モバイル解決 HTTPDNS を通じてドメイン名の IP アドレスを取得した後、クライアントは、この IP アドレスを使用してビジネスリクエストを送信します。その際、HTTP リクエストヘッダーの Host フィールドを元のドメイン名に設定する必要があります。

  2. ビジネスの正常な運用を保証するため、モバイル解決 HTTPDNS SDK がドメイン名の名前解決で空の IP アドレスを返した場合、アプリケーション開発者は元のドメイン名ベースのリクエスト URL を使用してフォールバックリクエストを行う必要があります。 次のコード例をご参照ください。

    String ip = DNSResolver.getInstance().getIPV4ByHost("domain name");
    if (ip != null) {
    	// URL のホストを IP アドレスに置き換えて、API リクエストを行います。
    }else {
    	// 元のドメイン名を含むリクエスト URL を使用して、フォールバックリクエストを行います。
    }
  3. モバイル解決 HTTPDNS SDK の利用をより迅速に開始するために、開発者向けに、参照用にローカルへダウンロードできるデモプログラムを提供しています。 ここをクリックしてデモプログラムをダウンロードしてください。

  4. SDK の統合が完了したら、コンソールの [トラフィック分析] セクションで統合が成功したことを確認してください。 トラフィックが生成されない場合は、アカウント IDAccessKey ID、および AccessKey Secret パラメーターが正しく設定されていることを確認してください。

オンプレミス DNS

v2.3.0 以降、HTTPDNS Android SDK はオンプレミス DNS デプロイメントをサポートしています。

オンプレミス DNS は、厳格なコンプライアンスやカスタム解決ポリシー要件 (金融、政府、大規模なインターネット企業など) があるシナリオに適しています。SDK は、パブリッククラウド DNS のみ、オンプレミス DNS のみ、アクティブ/スタンバイ ハイブリッド (パブリッククラウド DNS + オンプレミス DNS の相互フォールバック)、および異なるビジネスアーキテクチャへの柔軟な適応という 4 つのデプロイメントモードをサポートしています。

コア機能

  • オンプレミス デプロイメントのサポート: IPv4/IPv6 アドレスまたはホスト ドメイン名を使用して、オンプレミス DNS エンドポイントを設定します。

  • 双方向認証メカニズム: 顧客固有の accessKeyIdaccessKeySecret を使用してリクエストに署名し、安全な通信を確保します。

  • サーキットブレーキングとヘルスチェック: 自己管理型 DNS ノードが 3 回以上連続して失敗した場合、自動的にサーキットブレークされます。その後、指定された healthCheckDomain を使用して、1 分ごとにその可用性がチェックされます。回復後、自動的に再有効化されます。

  • 証明書検証コントロール: TLS 証明書検証を有効または無効にします (本番環境では強く推奨されます)。

  • スマートフォールバック: プライマリ DNS (パブリッククラウド DNS またはオンプレミス DNS) がしきい値を超えて失敗した場合、高可用性を確保するために自動的にスタンバイ DNS に切り替わります。

  • シームレスな API 互換性: パブリッククラウド DNS またはオンプレミス DNS のどちらを使用しているかに関わらず、上位レイヤーの解決 API 呼び出しは同一のままであり、ビジネスロジックの変更は不要です。

設定詳細

1. パブリッククラウド DNS のみの使用

オンプレミス DNS をデプロイしない標準的な SaaS ユーザー向けです。

DNSResolver.Init(this, accountID,accessKeyId,accessKeySecret);

2. オンプレミス DNS のみの使用 (オンプレミスデプロイメント)

オンプレミス DNS に完全に依存しているお客様向けです。

DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション:証明書検証を無効にする (ステージング環境のみ)
// DNSResolver.setEnableCertificateValidation(false);

3. パブリッククラウド DNS をプライマリ、オンプレミス DNS をスタンバイとして使用

プライマリの Alibaba Cloud パブリック HTTPDNS に障害が発生した場合、オンプレミス DNS にフェイルオーバーします。

// プライマリ:パブリッククラウド DNS
DNSResolver.Init(this, accountID,accessKeyId,accessKeySecret);
    
// セカンダリ:オンプレミス DNS
DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション:証明書検証を無効にする (ステージング環境のみ)
// DNSResolver.setEnableCertificateValidation(false);

4. オンプレミス DNS をプライマリ、パブリッククラウド DNS をスタンバイとして使用

プライマリのオンプレミス DNS に障害が発生した場合、Alibaba Cloud パブリック DNS にフェイルオーバーします。

// プライマリ:オンプレミス DNS
DNSResolver.InitFusionDNS(this,new String[]{"1.1.X.X","2.2.X.X"},null,null,"443", "check.example.com", "your_fusion_ak", "your_fusion_sk");
// オプション:証明書検証を無効にする (ステージング環境のみ)
// DNSResolver.setEnableCertificateValidation(false);

// バックアップ:パブリッククラウド DNS
DNSResolver.Init(this, accountID,accessKeyId,accessKeySecret);

新しいサービス API

オンプレミス DNS デプロイメントと高可用性ディザスタリカバリをサポートするため、SDK は、オンプレミス DNS の設定、セキュリティポリシーの制御、および自動プライマリ/スタンバイフェイルオーバーの有効化を行うための 3 つのコア API を追加します。

1. オンプレミス DNS エンドポイントと認証の設定

    /** プライベートデプロイメント用のセルフマネージド DNS サーバーを設定します。パブリック DNS のみを使用する場合、このメソッドを呼び出す必要はありません。
     *
     * セルフマネージド DNS サーバーのアドレスと認証情報を設定します。
     * お客様は、このインターフェイスを通じてプライベート DNS サーバーのアドレスと認証情報を渡します。
     * SDK はこの情報を使用してリクエストを行います。
     * @param ctx Context
     * @param serverIpv4Arr IPv4 アドレスの配列 (null 可)
     * @param serverIpv6Arr IPv6 アドレスの配列 (null 可)
     * @param serverHostArr ホストドメイン名の配列 (null 可)
     * @param port サービスポート (例: "443"。null の場合、デフォルト値 "443" が使用されます)
     * @param healthCheckDomain サーキットブレーカー後のヘルスチェックに使用されるドメイン名。DNS 解決サービスが 3 回以上連続して失敗すると、サーキットブレーカーがトリガーされ、そのサービスの IP アドレスは healthCheck 状態になります (後続のリクエストはこのサービスを使用しません)。1 分ごとにタイマーが実行され、この healthCheckDomain を使用して DNS 解決 API を呼び出し、DNS 解決サービスが利用可能かどうかをプローブします。プローブが成功すると、サービスは alive 状態に戻ります (後続のリクエストはこのサービスを使用できます)
     * @param accessKeyId お客様のプライベートアクセスキー ID (認証に使用)
     * @param accessKeySecret お客様のプライベートアクセスキーシークレット (認証に使用)
     */
    public static void InitFusionDNS(Context ctx,String[] serverIpv4Arr, String[] serverIpv6Arr, String[] serverHostArr, String port, String healthCheckDomain, String accessKeyId, String accessKeySecret)

2. オンプレミス DNS の TLS 証明書検証の制御

    /** プライベートデプロイメントで使用されるオンプレミス DNS 用です。パブリック DNS のみを使用する場合、このメソッドを設定する必要はありません。
     *
     * オンプレミス DNS の証明書検証を有効にするかどうかを指定します (デフォルト: true)。サーバーがドメイン証明書または IP 証明書で設定されていない場合、テスト用にこのパラメーターを false に設定できます。ただし、本番環境にデプロイする際は、true に設定することを推奨します。そうしないと、セキュリティリスクが発生する可能性があります。
     * @param enable 証明書検証を有効にするには true に設定します (デフォルト: true)。無効にするには false に設定します。
     */
    public static void setEnableCertificateValidation(boolean enable)

3. プライマリ/スタンバイ DNS の自動フェイルオーバーしきい値の設定

    /** パブリッククラウド DNS とオンプレミス DNS の両方が設定されている場合、プライマリ DNS で DNS 解決が失敗した回数を指定し、その回数に達すると自動的にセカンダリ DNS にフォールバックします。DNS タイプが 1 つしか設定されていない場合、このメソッドを設定する必要はありません。
     *
     * プライマリ DNS で DNS 解決が失敗した回数を指定し、その回数に達すると自動的にセカンダリ DNS にフォールバックします。DNS タイプが 1 つしか設定されていない場合、このメソッドを設定する必要はありません。
     * @param fallbackThreshold 失敗回数 (パブリッククラウド DNS がプライマリの場合のデフォルトは 4、オンプレミス DNS がプライマリの場合のデフォルトは 2)。
     * 有効な値は 0 から 4 です。0 を設定すると即座にフォールバックします。最大値は 4 です。
     */
     public static void setFallbackThreshold(int fallbackThreshold)