このトピックでは、Node.js アプリケーションで HTTPDNS を統合して使用する方法について説明します。
Node.js は、Chrome V8 エンジン上に構築された JavaScript ランタイム環境です。サーバーサイド開発、API 構築、マイクロサービスモデルの実装に広く使用されています。
Alibaba Cloud は、Node.js 環境向けに @alicloud-emas/httpdns ソフトウェア開発キット (SDK) を提供しています。Node.js のベストプラクティスに従って、SDK を Node.js アプリケーションに統合し、HTTPDNS の機能を使用できます。
以降のセクションでは、SDK の使用方法とベストプラクティスの概要について説明します。
クイックスタート
1.1 サービスの有効化
クイックスタートをご参照のうえ、HTTPDNS を有効化してください。
1.2 設定の取得
開発設定をご参照のうえ、EMAS コンソールの開発設定セクションから AccountId、SecretKey、およびその他の情報を取得してください。この情報は SDK の初期化に必要です。
インストール
npm を使用して SDK をインストールします:
npm install @alicloud-emas/httpdns統合例:
サンプルコードとドキュメントについては、「GitHub」リポジトリをご参照ください。
設定と使用方法
3.1 構成の初期化
アプリケーションの起動後に SDK を初期化して、HTTPDNS 機能を使用します。初期化中に、AccountId、SecretKey、および機能のスイッチを設定する必要があります。次のコードは例です:
import { createClient } from '@alicloud-emas/httpdns';
const client = createClient({
accountId: 'your-account-id',
secretKey: 'your-secret-key',
enableExpiredIP: true,
enableHTTPS: true,
});
enableHTTPS パラメーターを true に設定すると、課金コストが増加します。詳細については、製品の課金ドキュメントをご参照ください。
3.1.1 ログ設定
アプリケーション開発中に HTTPDNS ログを出力するには、初期化中にロガーを設定します。次のコードは例です:
const client = createClient({
...,
logger: console
});
3.2 ドメイン名前解決
3.2.1 同期非ブロッキング名前解決 (推奨)
同期非ブロッキング名前解決メソッドを使用します。このメソッドは、プログラムの実行をブロックすることなく、キャッシュされた結果を即座に返します。次のコードは例です:
function resolve() {
const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
if (result) {
console.log('Resolution result:', result.ipv4);
console.log('Domain name:', result.domain);
console.log('IPv6:', result.ipv6);
} else {
console.log('Cache miss. Asynchronous resolution in progress...');
// 非同期名前解決がバックグラウンドで開始されました。次回の呼び出しで結果が返されます。
}
}3.2.2 同期名前解決
名前解決の結果を確実に受け取るには、同期名前解決メソッドを使用します。このメソッドは、名前解決が完了するまで待機してから次に進みます。次のコードは例です:
async function resolve() {
try {
const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
console.log('Domain name:', result.domain);
console.log('IPv4:', result.ipv4);
console.log('IPv6:', result.ipv6);
} catch (error) {
console.error('Resolution failed:', error);
}
}
Node.js のベストプラクティス
4.1 仕組み
アプリケーションでカスタム DNS ルックアップ関数を作成します。
HTTPDNS を使用して解決する必要があるリクエストについては、カスタムルックアップ関数を使用するように設定します。
ルックアップ関数で、リクエストされたドメイン名を取得し、HTTPDNS を使用して IP アドレスに解決します。
ルックアップ関数で、解決された IP アドレスを返して実際のリクエストを開始します。このプロセスにより、ローカル DNS を使用した名前解決が回避されます。
4.2 ネットワークライブラリの統合
4.2.1 Axios の統合
エージェントを使用して Axios を統合します。主な手順は次のとおりです:
ステップ 1: カスタムルックアップ関数の作成
const dns = require('dns');
function createHTTPDNSLookup(httpdnsClient) {
return (hostname, options, callback) => {
// パラメーターを標準化します
if (typeof options === 'function') {
callback = options;
options = {};
}
// コールバックが存在することを確認します
if (typeof callback !== 'function') {
throw new Error('callback must be a function');
}
// HTTPDNS を使用してドメイン名を解決します
const result = httpdnsClient.getHttpDnsResultForHostSyncNonBlocking(hostname);
if (result) {
const hasIPv4 = result.ipv4 && result.ipv4.length > 0;
const hasIPv6 = result.ipv6 && result.ipv6.length > 0;
if (hasIPv4 || hasIPv6) {
if (options && options.all) {
// すべての IP アドレスを返します
const addresses = [
...(hasIPv4 ? result.ipv4.map(ip => ({ address: ip, family: 4 })) : []),
...(hasIPv6 ? result.ipv6.map(ip => ({ address: ip, family: 6 })) : [])
];
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> Returning all IP addresses (${addresses.length})`);
callback(null, addresses);
} else {
// IPv4 を優先し、次に IPv6 を使用します
if (hasIPv4) {
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv4[0]} (IPv4)`);
callback(null, result.ipv4[0], 4);
} else {
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv6[0]} (IPv6)`);
callback(null, result.ipv6[0], 6);
}
}
return;
}
}
console.log(`[DNS Lookup] No available IP from HTTPDNS. Falling back to system DNS for: ${hostname}`);
dns.lookup(hostname, options, callback);
};
}ステップ 2: カスタムエージェントの作成
const https = require('https');
const httpsAgent = new https.Agent({
lookup: createHTTPDNSLookup(httpdnsClient),
keepAlive: true,
maxSockets: 10
});
ステップ 3: Axios インスタンスの作成
const axios = require('axios');
const instance = axios.create({
httpsAgent: httpsAgent,
timeout: 10000
});
// 使用方法
const response = await instance.get('https://www.aliyun.com');
4.2.2 urllib の統合
エージェントを使用して urllib を統合します。主な手順は次のとおりです:
ステップ 1: カスタムルックアップ関数の作成
const dns = require('dns');
function createHTTPDNSLookup(httpdnsClient) {
return (hostname, options, callback) => {
// パラメーターを標準化します
if (typeof options === 'function') {
callback = options;
options = {};
}
// コールバックが存在することを確認します
if (typeof callback !== 'function') {
throw new Error('callback must be a function');
}
// HTTPDNS を使用してドメイン名を解決します
const result = httpdnsClient.getHttpDnsResultForHostSyncNonBlocking(hostname);
if (result) {
const hasIPv4 = result.ipv4 && result.ipv4.length > 0;
const hasIPv6 = result.ipv6 && result.ipv6.length > 0;
if (hasIPv4 || hasIPv6) {
if (options && options.all) {
// すべての IP アドレスを返します
const addresses = [
...(hasIPv4 ? result.ipv4.map(ip => ({ address: ip, family: 4 })) : []),
...(hasIPv6 ? result.ipv6.map(ip => ({ address: ip, family: 6 })) : [])
];
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> Returning all IP addresses (${addresses.length})`);
callback(null, addresses);
} else {
// IPv4 を優先し、次に IPv6 を使用します
if (hasIPv4) {
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv4[0]} (IPv4)`);
callback(null, result.ipv4[0], 4);
} else {
console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv6[0]} (IPv6)`);
callback(null, result.ipv6[0], 6);
}
}
return;
}
}
console.log(`[DNS Lookup] No available IP from HTTPDNS. Falling back to system DNS for: ${hostname}`);
dns.lookup(hostname, options, callback);
};
}ステップ 2: カスタムエージェントの作成
const urllib = require('urllib');
const https = require('https');
const httpsAgent = new https.Agent({
lookup: createHTTPDNSLookup(httpdnsClient),
keepAlive: true,
maxSockets: 10
});
ステップ 3:リクエストの送信
async function request(url, options = {}) {
// URL タイプに基づいてエージェントを選択します
if (url.startsWith('https://')) {
options.httpsAgent = httpsAgent;
} else {
options.agent = httpAgent; // 同様に httpAgent を作成します
}
options.timeout = options.timeout || 10000;
try {
return await urllib.request(url, options);
} catch (error) {
// 自動リトライロジック
if (isConnectionError(error) && !options._retried) {
options._retried = true;
delete options.httpsAgent; // システム DNS を使用してリトライします
return await urllib.request(url, options);
}
throw error;
}
}
API
5.1 初期化
アプリケーションの起動時に設定を初期化します。
const { createClient } = require('@alicloud-emas/httpdns');
const client = createClient({
accountId: 'your-account-id',
secretKey: 'your-secret-key',
timeout: 5000, // 名前解決のタイムアウト (ミリ秒)
maxRetries: 1, // 最大リトライ回数
enableHTTPS: false, // HTTPS を使用するかどうかを指定します
enableCache: true, // IP アドレスをキャッシュするかどうかを指定します
enableExpiredIP: true, // 期限切れの IP アドレスの使用を許可するかどうかを指定します
});
パラメーター:
パラメーター | タイプ | 必須 | 機能 |
accountId | String | 必須パラメーター | AccountId |
secretKey | String | オプションパラメーター | 署名キー |
bootstrapIPs | Array | オプションパラメーター | ブートストラップ IP アドレスのリスト |
timeout | Number | オプションパラメーター | 名前解決のタイムアウト |
maxRetries | Number | オプションパラメーター | 最大リトライ回数 |
enableHTTPS | Boolean | オプションパラメーター | HTTPS を使用するかどうかを指定します |
enableCache | Boolean | オプションパラメーター | IP アドレスをキャッシュするかどうかを指定します |
logger | Object | オプションパラメーター | ロガー |
enableExpiredIP | Boolean | オプションパラメーター | 期限切れの IP アドレスの使用を許可するかどうかを指定します |
enableHTTPS パラメーターを true に設定すると、課金コストが増加します。詳細については、製品の課金ドキュメントをご参照ください。
5.2 ドメイン名の事前解決
事前解決するドメイン名のリストを設定します。これにより、SDK が事前にそれらを解決し、後続の名前解決リクエストのレイテンシーを短縮できます。
// 事前解決リストを設定
client.setPreResolveHosts(['www.aliyun.com']);
5.3 同期非ブロッキング名前解決
指定されたドメイン名を解決します。このメソッドは、プロセスをブロックすることなく、キャッシュされた結果を即座に返します。
const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
if (result) {
console.log('Cached result:', result.ipv4);
}
パラメーター:
パラメーター | タイプ | 必須 | 特徴 |
domain | String | 必須パラメーター | ドメイン名 |
options | Object | オプションパラメーター | 名前解決オプション |
返される JSON フィールドの説明:
フィールド | タイプ | 機能 |
domain | String | ドメイン名 |
ipv4 | Array | IPv4 アドレスのリスト |
ipv6 | Array | IPv6 アドレスのリスト |
ipv4Ttl | Number | IPv4 の有効期限 |
ipv6Ttl | Number | IPv6 の有効期限 |
ipv4Timestamp | Date | IPv4 名前解決のタイムスタンプ |
ipv6Timestamp | Date | IPv6 名前解決のタイムスタンプ |
5.4 同期名前解決
指定されたドメイン名を同期的に解決します。
const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
console.log('Resolution result:', result);
5.5 クライアント管理
クライアントのステータスを取得し、クライアントのライフサイクルを管理します。
// クライアントのヘルスステータスを確認
const isHealthy = client.isHealthy();
// 現在のサービス IP アドレスのリストを取得
const serviceIPs = client.getServiceIPs();
// サービス IP アドレスを手動で更新
await client.updateServiceIPs();
// クライアントをシャットダウン
await client.close();
まとめ
このトピックでは、Node.js 環境で HTTPDNS SDK を使用する方法とベストプラクティスについて説明しました。エージェントを使用して SDK をネットワークライブラリと統合することで、パフォーマンス専有型で高可用性のドメイン名名前解決を実現できます。主な機能は次のとおりです:
使いやすさ:シンプルな API 操作を提供し、同期および同期非ブロッキングの両方の名前解決をサポートします。
高可用性: フェールオーバーおよびスペックダウンポリシーをサポートし、サービスの安定性を確保します。
パフォーマンスの最適化: 組み込みのキャッシュ機構と接続の再利用により、名前解決の効率を向上させます。
安全性と信頼性:認証付き名前解決と HTTPS 通信をサポートし、データのセキュリティを確保します。
このトピックのベストプラクティスに従って、HTTPDNS サービスを Node.js アプリケーションに効率的に統合してください。