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

Alibaba Cloud DNS:Android SDK

最終更新日:May 31, 2026

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

概要

Android SDK は、[モバイル解決 HTTPDNS] の DoH JSON API 用の Java ラッパーです。本 SDK は、Android アプリがドメイン名を解決するための Java インターフェイスを提供し、TTL と LRU ポリシーに基づく効率的なローカルキャッシュを備えています。Android アプリに [モバイル解決 HTTPDNS] を簡単に統合することで、ドメイン解決のエラーを修正し、正確で低コストのスケジューリングを可能にします。

本 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.2'
     implementation 'com.google.code.gson:gson:2.8.5'
}

AAR ファイル

Download SDK を参照して SDK を取得し、同梱の alidns_android_sdk.aar AAR パッケージをプロジェクトの libs ディレクトリに追加します。

SDK の初期化

重要

安定したパフォーマンスを確保し、IP アドレスの名前解決の失敗を回避するため、アプリケーションのライフサイクルの、できるだけ早い段階で SDK を初期化してください。

最初に、コンソールで アカウント ID を確認し、キーを作成して [AccessKey ID] と [AccessKey Secret] を取得します。SDK を統合した後、初期化します。詳細については、次の Application クラスの例をご参照ください。

public class DnsCacheApplication extends Application{

    private String accountId = "Your Account ID"; // コンソールで確認した Account ID を設定します。
    private String accessKeyId = "Your AccessKey ID"; // コンソールで確認した AccessKey ID を設定します。
    private String accessKeySecret = "Your AccessKey Secret"; // コンソールで確認した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK でアクセスするための Account ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       // 注:keep-alive 用にドメインを設定した場合、TTL の 75% が経過した時点で自動的に名前解決が実行されます。 
       // これにより、これらのドメインの名前解決は常にキャッシュにヒットします。ただし、CDN を使用している場合、 
       // TTL が短くなり、リクエストが頻繁に発生してコストが増加する可能性があります。このメソッドは注意して使用してください。
       DNSResolver.setKeepAliveDomains(new String[]{"your-domain-to-keep-alive-1","your-domain-to-keep-alive-2",...});       
       // 指定したドメインに対して事前解決を実行し、IPv4 アドレスを取得します。プレースホルダーのドメインは、名前解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}
説明

DNSResolver は [モバイル解決 HTTPDNS] SDK のコアクラスです。[モバイル解決 HTTPDNS] の DoH JSON API をカプセル化し、対象のドメイン名を IP アドレスに名前解決します。Application のサブクラスに [モバイル解決 HTTPDNS] SDK を統合することを推奨します。

また、Android プロジェクトでは AndroidManifest.xml で次のアクセス権限を宣言する必要があります。

<!--必須の権限-->
   <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 を保護し、不正な使用を防ぐための認証機能をサポートしています。モバイル解決 HTTPDNS を有効にするには、コンソールでキーを作成して AccessKey IDAccessKey Secret を取得してください。SDK の初期化中に認証パラメーターを設定する必要があります。HTTPDNS は未認証のリクエストを拒否するため、名前解決が失敗し、サービスに影響が出ます。モバイル解決 HTTPDNS

認証パラメータは次のように設定できます:

DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret);
警告
  • 本番リリースで アカウント ID、AccessKey ID、AccessKey Secret、またはその他の実行時データがログに出力されないように、SDK のデバッグログ出力を無効にしてください。

  • SDK 統合では、コード内で アカウント ID、AccessKey ID、AccessKey Secret を設定する必要があります。これらのパラメータは従量課金と請求に関連付けられています。悪意のある逆コンパイルによる認証情報の漏えいを防ぐため、アプリケーションをリリースする前に、コードの難読化とアプリの堅牢化を有効にしてください。

SDK 統合に関する問題

"Cleartext HTTP traffic not permitted" エラー

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

解決策:

AndroidManifest.xml ファイルで、次のコードを 要素に追加します。

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">

"Didn't find class BasicHttpParams" エラー

原因:Apache HTTP クライアントは非推奨です。

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

この変更は、API レベル 28 未満を対象とするほとんどのアプリケーションには影響しません。API レベル 28 以上を対象とするアプリケーションで、Apache HTTP インターフェイス、またはそれを使用するライブラリを引き続き使用する場合、Apache HTTP インターフェイスが見つからないため例外が発生します。

解決策:

AndroidManifest.xml ファイルで、次のコードを 要素に追加します。

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

NDK の設定

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

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

android.useDeprecatedNdk = true;

最適なパフォーマンスを得るため、アプリのコンパイル時には JDK 1.8 と NDK 21.4.7075529 を使用することを推奨します。

API リファレンス

共通設定

1. Init メソッドによる初期化

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

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

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

アプリケーションを初期化する際に、使用するドメインを [モバイル解決 HTTPDNS] SDK に登録することを強く推奨します。これにより、SDK が事前解決を実行し、後続の名前解決リクエストのレイテンシーを削減します。プリロードするドメインを設定するには、次のメソッドを呼び出します:

  • IPv4 または IPv6 ドメインの事前解決の指定

// 事前名前解決のレコードタイプを指定します。プレースホルダーのドメインを、名前解決したいドメインに置き換えてください。
DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{...});

// DNSResolver.QTYPE_IPV4: ドメインの IPv4 レコードタイプをプリフェッチします。
// DNSResolver.QTYPE_IPV6: ドメインの IPv6 レコードタイプをプリフェッチします。
// DNSResolver.QTYPE_IPV4_IPV6: ドメインの IPv4 および IPv6 レコードタイプの両方をプリフェッチします。
  • 現在のネットワークに基づいて、事前解決用に IPv4 または IPv6 を自動的に選択します。デュアルスタック環境では、 IPv4 と IPv6 の両方のアドレスをプリロードします。

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

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

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

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

DNSResolver.setKeepAliveDomains(new String[]{"your-domain-1", "your-domain-2"});
説明

メリット

1. レコードが適時に更新されます (TTL が期限切れになる前)。

2. 事前解決と併用すると、初回の解決レイテンシーを 0 ms まで削減できます。

デメリット

1. TTL の 75% 経過時に再リクエストすると、追加コストが発生します。

4. IPv6 サーバーアドレス使用の指定

[モバイル解決 HTTPDNS] サービスは IPv4 と IPv6 の両方でのアクセスをサポートしています。DNSResolver.setEnableIPv6(boolean enable) メソッドを使用して、IPv6 サーバーアドレスを使用するかどうかを指定します。enabletrue に設定すると、SDK は IPv6 アドレスを使用してサーバーサイドインターフェイスにアクセスします。enablefalse に設定すると、IPv4 アドレスを使用します。デフォルトでは IPv4 アドレスを使用します。IPv6 を有効にして [モバイル解決 HTTPDNS] サービスへの接続に失敗した場合、SDK は自動的に IPv4 アドレスに切り替え、接続を 1 回再試行します。

5. キャッシュエントリの最大数の設定

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

count の最大値をカスタマイズできます。

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

SDK では、DNS 名前解決リクエストのプロトコル (HTTP または HTTPS) を選択できます。セキュリティを強化するため、デフォルトの HTTPS プロトコルを推奨します。HTTPDNS は名前解決リクエスト数に応じて課金され、HTTPS リクエストは HTTP リクエストの 5 倍の料金で課金されることに注意してください。ビジネス要件に基づいてプロトコルを選択してください。[モバイル解決 HTTPDNS]

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

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

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

詳細設定

1. SDK デバッグロギングの有効化・無効化

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

SDK のデバッグログは有効または無効にできます。true を設定すると有効になり、false を設定すると無効になります。

2. モバイル解決 HTTPDNS の解決に失敗した場合に、ローカル DNS への自動フォールバックを有効にするかどうかを指定します

DNSResolver.setEnableLocalDns(true); // デフォルトで、HTTPDNS 解決失敗時のローカル DNS への自動フォールバックが有効になっています。

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

[モバイル解決 HTTPDNS] DoH JSON API は、フル JSON とコンパクトな IP 配列の 2 つの形式でデータを返します。DNSResolver.setEnableShort(boolean enable) を呼び出すことで、ショートモードを有効または無効にできます。デフォルトでは、ショートモードは無効になっています。

DNSResolver.setEnableShort(true); // デフォルト値は false です。必要に応じて設定します。
重要

ショートモードでは、SDK が [モバイル解決 HTTPDNS] サービスを呼び出し、よりシンプルな IP 配列を返します。これにより、レスポンスデータ量を削減し、ネットワークトラフィックに敏感なシナリオに適しています。

4. 有効期限なしのキャッシュを有効にするかどうかの指定

DNSResolver.setImmutableCacheEnable(false); // デフォルトでは、有効期限のないキャッシュは無効になっています。
重要

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

  • キャッシュの有効期限が切れない:この機能を有効にすると、アプリの実行時に有効期限のチェックと更新操作がスキップされ、キャッシュは常に有効として扱われます。キャッシュを積極的に更新するために setKeepAliveDomains を設定する必要がなくなるため、ユーザーによる名前解決の回数が最小限に抑えられます。

    メソッド: DNSResolver.setImmutableCacheEnable(boolean var0)

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

  • アクティブキャッシュ更新:名前解決が最新のキャッシュ済みレコードにヒットするようにします。ドメインの権威解決が変更された場合、このメカニズムは、名前解決リクエストがキャッシュにヒットして DNS レイテンシーが低減されるようにしつつ、バックグラウンドでのキャッシュ更新を通じて最新のレコードを取得できるようにします。ドメインの TTL が 75% 経過すると、SDK はキャッシュを更新するために名前解決クエリを自動的にトリガーします。アクティブ更新を有効にするドメイン数は 10 個までに制限することを推奨します。

    メソッド: DNSResolver.setKeepAliveDomains(String[] var1)

    説明: var1 は、プロアクティブに更新する必要があるドメイン名の文字列配列です。

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

    次の 2 つのメソッドを呼び出して名前解決結果を取得すると、キャッシュがパッシブに更新されます:

    • getIPsV4ByHost(String hostName) メソッドは、指定された hostName の IPv4 レコードの配列を取得します。キャッシュが空ではなく、かつその TTL の有効期間内である場合、メソッドはキャッシュされた結果を直接返します。それ以外の場合、まずネットワークリクエストで最新の解決結果を取得してから、その結果を返してキャッシュを更新します。このメソッドは、高精度の解決結果が必要なシナリオでよく使用されます。

    • getIpv4ByHostFromCache(String hostName, boolean isAllowExp) メソッドは、キャッシュから hostName の IPv4 レコードの配列を取得します。isAllowExp パラメーターの値に基づいて、このメソッドはキャッシュから期限切れの解決結果を返すかどうかを決定します。最新の解決結果がキャッシュされるように、アプリの起動時にこのメソッドをプリロードメソッドと併用することをお勧めします。

      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 速度テストの有効化または無効化。この機能は、バージョン 2.3.0 以前ではデフォルトで無効、バージョン 2.3.1 以降ではデフォルトで有効です。

DNSResolver.setEnableSpeedTest(false); // v2.3.0 以前はデフォルトで無効、v2.3.1 以降はデフォルトで有効です。

IP 速度測定を有効または無効に設定できます。 true を設定すると有効になり、 false を設定すると無効になります。

7. ソケットモニタリングによる IP 速度テストのポート番号設定

DNSResolver.setSpeedPort(DNSResolver.PORT_80);

ソケットベースの IP 速度テストで使用するポート番号を設定できます。デフォルトは 80 です。

8. ISP ネットワークごとのドメインキャッシュのパーティション化

DNSResolver.setIspEnable(true); // デフォルトでは、ドメインキャッシュは ISP ネットワークごとにパーティション化されます。

ISP ネットワーク別にドメインキャッシュをパーティション分割するかどうかを設定します。有効にした場合、ドメインキャッシュデータはネットワーク環境ごとに個別に保存され、他の環境には影響しません。無効にした場合、すべてのネットワーク環境で単一のドメインキャッシュが使用されます。

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

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

ビジネス要件に応じて、ネガティブキャッシュの最大 TTL を設定できます。ネガティブキャッシュとは、ドメインに IP アドレスが設定されておらず、名前解決の結果、IP アドレスが返されない場合に生成される無効なキャッシュエントリです。

10. キャッシュの最大 TTL の設定

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

SDK では、キャッシュの最大 TTL を設定できます。この値を設定すると、キャッシュの最大 TTL はその値を超えることはありません。デフォルトは 3,600 秒です。

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

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

setEdnsSubnet は、EDNS クライアントサブネット (ECS) 機能 (RFC 7871) をサポートするために使用します。この機能は、ユーザーのサブネット情報を権威 DNS に渡し、より正確な DNS 名前解決とトラフィックスケジューリングを実現します。プレフィックス長が長いほどアドレス情報はより正確になりますが、短いほどユーザーのプライバシーは向上します。/24 のプレフィックス長を使用することを推奨します。

説明

このパラメーターは、DNS プロキシが DoH JSON API を使用するシナリオ向けです。これらのシナリオでは、ユーザーが DNS クエリを DNS プロキシに送信し、プロキシがこのパラメーターを使用してユーザーのサブネット情報を [モバイル解決 HTTPDNS] に、続いて権威 DNS サーバーに渡します。

たとえば、DNSResolver.setEdnsSubnet("1.2.XX.XX/24") を呼び出すと、権威サーバーは 1.2.XX.XX/24 アドレスのプレフィックス情報を受信し、DNS リンクの選択に使用します。

12. 名前解決タイムアウト期間の設定

timeout 属性では、名前解決のタイムアウトを指定します。デフォルトのタイムアウトは 3 s です。カスタムタイムアウトを設定できます。2 s から 5 s の値を推奨します。

DNSResolver.setTimeout(3);

13. 最大同時解決数の設定 (v2.3.2 以降でサポート)

事前解決や非同期キャッシュの更新など、非同期 DNS 名前解決用の同時リクエストの最大数を設定します。有効範囲: [1, 50]。デフォルト値: 10。

DNSResolver.setMaxConcurrentResolveCount(10);

14. トラブルシューティング用 SessionId の取得

sessionId パラメーターは、アプリケーションの起動時に生成され、ライフサイクル全体を通して変更されません。同一のアプリケーションライフサイクル内のすべての [モバイル解決 HTTPDNS] 名前解決リクエストには、同じ sessionId が含まれます。サーバーはこのパラメーターを記録し、インデックスを生成します。sessionId を使用してアプリケーションのライフサイクルをトレースし、アプリケーション固有の問題をトラブルシューティングします。

public static String getSessionId()

15. ログ出力コールバック

このコールバックは、SDK が出力するログを受信します。

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

ProGuard 設定

   -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.example.com などのホスト名。
    * @return ホスト名に対応する IPv4 アドレスの配列。
    */
  public  String[] getIPsV4ByHost(String hostName) 

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

  

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

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

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

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

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

  /**
    * 特定の URL に対応する IPv4 レコードの DomainInfo オブジェクトを取得します。
    * キャッシュに有効期限内の解決結果が存在する場合、キャッシュから結果が返されます。
    * キャッシュが空の場合、またはキャッシュされた結果の有効期限が切れている場合、サーバーに同期ネットワークリクエストを送信して再帰的な解決結果を取得し、その結果を返してキャッシュに保存します。
    *
    * @param url http://m.example.com などの URL。
    * @return URL に対応する IPv4 タイプの DomainInfo オブジェクトのコレクションからランダムに選択された DomainInfo オブジェクト。
    */
    public DomainInfo getIPV4DInfoByUrl(String url) 


  /**
    * 特定の URL に対応する IPv6 レコードの DomainInfo オブジェクトを取得します。
    * キャッシュに有効期限内の解決結果が存在する場合、キャッシュから結果が返されます。
    * キャッシュが空の場合、またはキャッシュされた結果の有効期限が切れている場合、サーバーに同期ネットワークリクエストを送信して再帰的な解決結果を取得し、その結果を返してキャッシュに保存します。
    *
    * @param url http://www.example.com などの URL。
    * @return URL に対応する IPv6 タイプの DomainInfo オブジェクトのコレクションからランダムに選択された DomainInfo オブジェクト。
    */
   public DomainInfo getIPV6DInfoByUrl(String url) 

   注:返される DomainInfo オブジェクトは、以下のプロパティを含みます。

  /**
   * アクセスドメインの自動インクリメント 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.example.com などのホスト名。
    * @return ホスト名に対応する IPv4 アドレスのセットからランダムに選択された IPv4 アドレス。IP 速度テストが有効な場合、最適な IPv4 アドレスを返します。
    */
  public String getIPV4ByHost(String hostName) 

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

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

API 例

URL:渡されるアクセスアドレス。例: http://www.example.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); // 指定されたドメイン名を事前解決します (デフォルトのレコードタイプ)。プレースホルダーのドメインを、HTTPDNS で解決したいドメインに置き換えてください。

3. 現在のネットワーク環境に基づくキャッシュからの名前解決データの読み取り

String[] ip = DNSResolver.getInstance().getIpsByHostFromCache(hostname,true); // 現在のネットワーク環境のキャッシュから IP アドレスのリストを取得します。

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 のホストを IP アドレスに置き換えた DomainInfo オブジェクトを取得します。

9. 指定されたドメイン解決結果のクリア

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

10. 成功した HTTPDNS リクエストと失敗した HTTPDNS リクエストに関する統計情報の取得

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

次の表に、名前解決統計の JSON フィールドを示します。

 [
      {
         "avgRtt":"1",                         // 平均名前解決時間 (単位:ミリ秒 (ms))。
         "degradeLocalDnsCount": 0,            // ローカル DNS へのフォールバック数。
         "domainName":"www.example.com",       // 解決されたドメイン名。
         "hitDnsCacheCount": 1,                // キャッシュヒット数。
         "httpabnormalCount": 0,               // 失敗した再帰クエリ数。
         "isp": "China Mobile",                // ISP 名。
         "localDnsResolveErrCount": 0,         // ローカル 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 を取得します。
                      // この URL のホストは IP アドレスに置き換えられています。
                      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) {
                // ネットワークリクエストを送信します。
               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 accountId = "Your Account ID"; // コンソールで取得したアカウント ID に置き換えてください。
    private String accessKeyId = "Your AccessKey ID"; // コンソールで取得した AccessKey ID に置き換えてください。
    private String accessKeySecret = "Your AccessKey Secret"; // コンソールで取得した AccessKey Secret に置き換えてください。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセス用のアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       // キャッシュキープアライブ用のドメイン名を設定します。設定したドメイン名は、TTL の 75% が経過した時点で自動的に名前解決が開始され、その解決リクエストが常にキャッシュにヒットするようになります。
       DNSResolver.setKeepAliveDomains(new String[]{"your-domain-1","your-domain-2",...}); 
       // 指定されたドメインの IPv4 アドレスをプリロードします。プレースホルダーのドメインを、解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}

ベストプラクティス

最適なパフォーマンスを得るには、事前解決と、期限切れの応答の許可を組み合わせて使用します。

ネットワークパフォーマンスに対する要件が高いシナリオでは、事前解決と、期限切れの応答を許可する戦略を組み合わせることで、DNS 解決速度を大幅に向上させ、「ゼロレイテンシー」での解決を実現することもできます。

SDK の組み込みキャッシュにより、プリロードされたドメインに対する後続の解決リクエストは、直接キャッシュにヒットします。これにより、ネットワークのラウンドトリップが回避され、ユーザーエクスペリエンスが大幅に向上します。

1. 事前解決

キャッシングを有効にし、主要なドメインを事前解決します。この操作は、アプリケーションの起動時に実行することを推奨します。

Application の onCreate() メソッドで、アプリケーションで使用するドメイン名をあらかじめ解決し、その結果をローカルメモリにキャッシュします。

1. IPv4 のみのシナリオ

//********IPv4 のみのシナリオの場合*******
public class DnsCacheApplication extends Application{
    private String accountId = "Your Account ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "Your AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "Your AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセス用のアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       DNSResolver.setEnableCache(true); // キャッシングを有効にします。デフォルト値:true。
       // 事前解決用の IPv4 レコードタイプ。
       // 指定されたドメインを IPv4 アドレスにプリロードします。プレースホルダードメインを、HTTPDNS で解決したいドメインに置き換えてください。
       DNSResolver.getInstance().preLoadDomains(DNSResolver.QTYPE_IPV4,new String[]{"your-domain-to-preload-1","your-domain-to-preload-2",...}); 
    }
}

2. IPv6 対応

//********IPv6 対応が必要なシナリオの場合*******
public class DnsCacheApplication extends Application{
    private String accountId = "Your Account ID"; // コンソールから取得したアカウント ID を設定します。
    private String accessKeyId = "Your AccessKey ID"; // コンソールから取得した AccessKey ID を設定します。
    private String accessKeySecret = "Your AccessKey Secret"; // コンソールから取得した AccessKey Secret を設定します。

    @Override
    public void onCreate() {
       super.onCreate();
       // SDK アクセス用のアカウント ID、AccessKey ID、AccessKey Secret を設定します。
       DNSResolver.Init(this, accountId, accessKeyId, accessKeySecret); 
       DNSResolver.setEnableCache(true); // キャッシングを有効にします。デフォルト値:true。
       DNSResolver.setEnableIPv6(true); // IPv6 ネットワーク経由でドメイン名を解決するかどうかを指定します。デフォルト値:false。
       DNSResolver.setEnableSpeedTest(true); // IP 速度テストを有効にするかどうかを指定します。デフォルト値:false。
       // 事前解決用の IPv4 および IPv6 レコードタイプ。
       // 指定されたドメインを IPv4 および IPv6 アドレスにプリロードします。プレースホルダードメインを、HTTPDNS で解決したいドメインに置き換えてください。
       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("your-domain");
    if (ip != null) {
    	// URL 内のホストを IP アドレスに置き換えて API リクエストを実行します。
    } else {
    	// 元のドメイン名のリクエスト URL を使用してフォールバックリクエストを実行します。
        // この場合、ドメイン名を含む元の URL を使用してネットワークリクエストを実行します。
    }
  3. [モバイル解決 HTTPDNS] SDK の使用を開始するために、ダウンロードして参考にできるデモプログラムを提供しています。こちらからデモプログラムをダウンロードしてください。

  4. SDK を統合後、コンソールのトラフィック分析ページで、統合が成功したかを確認してください。トラフィックが生成されない場合は、アカウント ID、[AccessKey ID]、および [AccessKey Secret] パラメーターが正しく設定されているかどうかを確認してください。

オンプレミス DNS

v2.3.0 以降、HTTPDNS Android SDK はオンプレミス DNS のデプロイメントに対応しました。

オンプレミス DNS モードは、金融、行政、大手インターネット企業など、データコンプライアンスやカスタム名前解決ポリシーに対する要件が高いシナリオに適しています。 SDK は、パブリッククラウド DNS のみ、オンプレミス DNS のみ、およびプライマリ/スタンバイハイブリッド (パブリッククラウド DNS とオンプレミス DNS が相互にフォールバックします) という 3 つの典型的なデプロイメントモードをサポートします。これにより、さまざまなサービスアーキテクチャに柔軟に適応できます。

コア機能

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

  • 双方向認証:顧客固有の accessKeyIdaccessKeySecret でリクエストに署名することで、安全な通信を保証します。

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

  • 証明書検証の制御:バージョン 2.3.1.beta 以降、オンプレミス DNS のテスト用に 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");
// オプション:証明書検証を無効にします (テスト環境専用、ベータ版 SDK が必要、例:2.3.1.beta)。
// DNSResolver.setEnableCertificateValidation(false);

3. プライマリ:パブリッククラウド、スタンバイ:オンプレミス

プライマリの Alibaba Cloud パブリック HTTPDNS がドメイン名の解決に失敗した場合、システムは自動的にオンプレミス DNS にフォールバックします。

// プライマリ:パブリック HTTPDNS
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");
// オプション:証明書検証を無効にします (テスト環境専用、ベータ版 SDK が必要、例:2.3.1.beta)。
// DNSResolver.setEnableCertificateValidation(false);

4. プライマリ:オンプレミス、スタンバイ:パブリッククラウド

オンプレミス DNS をプライマリ DNS として使用します。オンプレミス DNS がドメイン名の解決に失敗した場合、システムは自動的に Alibaba Cloud パブリック HTTPDNS にフォールバックします。

// プライマリ:オンプレミス 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");
// オプション:証明書検証を無効にします (テスト環境専用、ベータ版 SDK が必要、例:2.3.1.beta)。
// DNSResolver.setEnableCertificateValidation(false);

// スタンバイ:パブリック HTTPDNS
DNSResolver.Init(this, accountID, accessKeyId, accessKeySecret);

新しい API

オンプレミスデプロイメントおよびオンプレミス DNS の高可用性ディザスタリカバリをサポートするために、SDK は次の 3 つのコアインターフェースを追加します。これらを使用して、オンプレミス DNS サービスを構成し、セキュリティポリシーを制御し、プライマリ/スタンバイ間の自動フォールバックを実装します。

1. エンドポイントと認証の構成

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

2. TLS 証明書検証の制御

ベータ版の TLS 検証

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

3. フォールバックのしきい値の設定

    /** パブリッククラウド DNS とオンプレミス DNS の両方を構成している場合、プライマリ DNS の DNS 名前解決が何回失敗したらシステムがスタンバイ DNS に自動的にフォールバックするかを指定できます。DNS を 1 種類のみ構成している場合、このメソッドを呼び出す必要はありません。
     *
     * @param fallbackThreshold 失敗のしきい値。デフォルト:プライマリ DNS がパブリッククラウド DNS の場合は 4、プライマリ DNS がオンプレミス DNS の場合は 2。
     * 有効範囲:[0, 4]。0 は即時フォールバックを示します。
     */
     public static void setFallbackThreshold(int fallbackThreshold)