Topik ini menjelaskan cara mengintegrasikan dan menggunakan HTTPDNS dalam aplikasi Node.js.
Node.js adalah lingkungan runtime JavaScript yang dibangun di atas mesin Chrome V8, banyak digunakan untuk pengembangan sisi server, pembuatan API, dan penerapan arsitektur mikroservis.
Alibaba Cloud menyediakan kit pengembangan perangkat lunak (SDK) @alicloud-emas/httpdns untuk lingkungan Node.js. Anda dapat mengintegrasikan SDK ke dalam aplikasi Node.js dan memanfaatkan fitur-fitur HTTPDNS dengan mengikuti praktik terbaik untuk Node.js.
Bagian berikut menjelaskan cara menggunakan SDK beserta praktik terbaiknya.
Quick start
1.1 Aktifkan layanan
Lihat Quick Start untuk mengaktifkan HTTPDNS.
1.2 Dapatkan konfigurasi
Lihat Development Configurations untuk mendapatkan AccountId, SecretKey, dan informasi lainnya dari bagian konfigurasi pengembangan di Konsol EMAS. Informasi ini diperlukan untuk inisialisasi SDK.
Instalasi
Instal SDK menggunakan npm:
npm install @alicloud-emas/httpdnsContoh integrasi:
Untuk kode contoh dan dokumentasi, lihat repositori GitHub.
Konfigurasi dan penggunaan
3.1 Inisialisasi konfigurasi
Inisialisasi SDK setelah aplikasi dimulai agar dapat menggunakan fitur-fitur HTTPDNS. Selama inisialisasi, Anda harus mengonfigurasi AccountId, SecretKey, dan sakelar fitur. Kode berikut memberikan contohnya:
import { createClient } from '@alicloud-emas/httpdns';
const client = createClient({
accountId: 'your-account-id',
secretKey: 'your-secret-key',
enableExpiredIP: true,
enableHTTPS: true,
});
Mengatur parameter enableHTTPS ke true akan meningkatkan biaya penagihan Anda. Untuk informasi selengkapnya, lihat dokumen Product Billing.
3.1.1 Konfigurasi log
Untuk menampilkan log HTTPDNS selama pengembangan aplikasi, konfigurasikan logger saat inisialisasi. Kode berikut memberikan contohnya:
const client = createClient({
...,
logger: console
});
3.2 Resolusi nama domain
3.2.1 Resolusi sinkron non-blocking (Direkomendasikan)
Gunakan metode resolusi sinkron non-blocking yang langsung mengembalikan hasil dari cache tanpa memblokir eksekusi program. Kode berikut memberikan contohnya:
function resolve() {
const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
if (result) {
console.log('Hasil resolusi:', result.ipv4);
console.log('Nama domain:', result.domain);
console.log('IPv6:', result.ipv6);
} else {
console.log('Cache miss. Resolusi asinkron sedang berlangsung...');
// Resolusi asinkron telah dimulai di latar belakang. Panggilan berikutnya akan mengembalikan hasilnya.
}
}3.2.2 Resolusi sinkron
Untuk memastikan Anda menerima hasil resolusi, gunakan metode resolusi sinkron yang menunggu hingga proses resolusi selesai sebelum melanjutkan. Kode berikut memberikan contohnya:
async function resolve() {
try {
const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
console.log('Nama domain:', result.domain);
console.log('IPv4:', result.ipv4);
console.log('IPv6:', result.ipv6);
} catch (error) {
console.error('Resolusi gagal:', error);
}
}
Praktik terbaik Node.js
4.1 Cara kerja
Buat fungsi lookup DNS kustom di dalam aplikasi.
Untuk permintaan yang perlu diselesaikan menggunakan HTTPDNS, konfigurasikan agar menggunakan fungsi lookup kustom tersebut.
Dalam fungsi lookup, ambil nama domain yang diminta dan selesaikan menjadi alamat IP menggunakan HTTPDNS.
Dalam fungsi lookup, kembalikan alamat IP yang telah diselesaikan untuk memulai permintaan aktual. Proses ini menghindari penggunaan DNS lokal untuk resolusi.
4.2 Integrasi library jaringan
4.2.1 Integrasi Axios
Integrasikan Axios menggunakan agent. Langkah-langkah utamanya sebagai berikut:
Langkah 1: Buat fungsi lookup kustom
const dns = require('dns');
function createHTTPDNSLookup(httpdnsClient) {
return (hostname, options, callback) => {
// Standarkan parameter
if (typeof options === 'function') {
callback = options;
options = {};
}
// Pastikan callback tersedia
if (typeof callback !== 'function') {
throw new Error('callback must be a function');
}
// Gunakan HTTPDNS untuk menyelesaikan nama domain
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) {
// Kembalikan semua alamat 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 {
// Prioritaskan IPv4, lalu 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);
};
}Langkah 2: Buat agen kustom
const https = require('https');
const httpsAgent = new https.Agent({
lookup: createHTTPDNSLookup(httpdnsClient),
keepAlive: true,
maxSockets: 10
});
Langkah 3: Buat instance Axios
const axios = require('axios');
const instance = axios.create({
httpsAgent: httpsAgent,
timeout: 10000
});
// Penggunaan
const response = await instance.get('https://www.aliyun.com');
4.2.2 Integrasi urllib
Integrasikan urllib menggunakan agent. Langkah-langkah utamanya sebagai berikut:
Langkah 1: Buat fungsi lookup kustom
const dns = require('dns');
function createHTTPDNSLookup(httpdnsClient) {
return (hostname, options, callback) => {
// Standarkan parameter
if (typeof options === 'function') {
callback = options;
options = {};
}
// Pastikan callback tersedia
if (typeof callback !== 'function') {
throw new Error('callback must be a function');
}
// Gunakan HTTPDNS untuk menyelesaikan nama domain
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) {
// Kembalikan semua alamat 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 {
// Prioritaskan IPv4, lalu 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);
};
}Langkah 2: Buat agen kustom
const urllib = require('urllib');
const https = require('https');
const httpsAgent = new https.Agent({
lookup: createHTTPDNSLookup(httpdnsClient),
keepAlive: true,
maxSockets: 10
});
Langkah 3: Kirim permintaan
async function request(url, options = {}) {
// Pilih agent berdasarkan jenis URL
if (url.startsWith('https://')) {
options.httpsAgent = httpsAgent;
} else {
options.agent = httpAgent; // Buat httpAgent secara serupa
}
options.timeout = options.timeout || 10000;
try {
return await urllib.request(url, options);
} catch (error) {
// Logika retry otomatis
if (isConnectionError(error) && !options._retried) {
options._retried = true;
delete options.httpsAgent; // Ulangi menggunakan DNS sistem
return await urllib.request(url, options);
}
throw error;
}
}
API
5.1 Inisialisasi
Inisialisasi konfigurasi saat aplikasi dimulai.
const { createClient } = require('@alicloud-emas/httpdns');
const client = createClient({
accountId: 'your-account-id',
secretKey: 'your-secret-key',
timeout: 5000, // Timeout resolusi dalam milidetik
maxRetries: 1, // Jumlah maksimum percobaan ulang
enableHTTPS: false, // Menentukan apakah akan menggunakan HTTPS
enableCache: true, // Menentukan apakah akan menyimpan cache alamat IP
enableExpiredIP: true, // Menentukan apakah akan mengizinkan penggunaan alamat IP kedaluwarsa
});
Parameter:
Parameter | Tipe | Wajib | Fitur |
accountId | String | Parameter wajib | AccountId |
secretKey | String | Parameter opsional | Kunci tanda tangan |
bootstrapIPs | Array | Parameter opsional | Daftar alamat IP bootstrap |
timeout | Number | Parameter opsional | Timeout resolusi |
maxRetries | Number | Parameter opsional | Jumlah maksimum percobaan ulang |
enableHTTPS | Boolean | Parameter opsional | Menentukan apakah akan menggunakan HTTPS |
enableCache | Boolean | Parameter opsional | Menentukan apakah akan menyimpan cache alamat IP |
logger | Object | Parameter opsional | Logger |
enableExpiredIP | Boolean | Parameter Opsional | Menentukan apakah akan mengizinkan penggunaan alamat IP kedaluwarsa |
Mengatur parameter enableHTTPS ke true akan meningkatkan biaya penagihan Anda. Untuk informasi selengkapnya, lihat dokumen Product Billing.
5.2 Pra-selesaikan nama domain
Tetapkan daftar nama domain untuk pra-resolusi sehingga SDK dapat menyelesaikannya lebih awal dan mengurangi latensi pada permintaan resolusi berikutnya.
// Tetapkan daftar pra-resolusi
client.setPreResolveHosts(['www.aliyun.com']);
5.3 Resolusi sinkron non-blocking
Selesaikan nama domain tertentu. Metode ini langsung mengembalikan hasil dari cache tanpa memblokir proses.
const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
if (result) {
console.log('Hasil cache:', result.ipv4);
}
Parameter:
Parameter | Tipe | Wajib | Fitur |
domain | String | Parameter wajib | Nama domain |
options | Object | Parameter opsional | Opsi resolusi |
Deskripsi bidang JSON yang dikembalikan:
Bidang | Tipe | Fitur |
domain | String | Nama domain |
ipv4 | Array | Daftar alamat IPv4 |
ipv6 | Array | Daftar alamat IPv6 |
ipv4Ttl | Number | Waktu kedaluwarsa IPv4 |
ipv6Ttl | Number | Waktu kedaluwarsa IPv6 |
ipv4Timestamp | Date | Timestamp resolusi IPv4 |
ipv6Timestamp | Date | Timestamp resolusi IPv6 |
5.4 Resolusi sinkron
Selesaikan secara sinkron nama domain tertentu.
const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
console.log('Hasil resolusi:', result);
5.5 Manajemen klien
Ambil status klien dan kelola siklus hidup klien.
// Periksa status kesehatan klien
const isHealthy = client.isHealthy();
// Dapatkan daftar alamat IP layanan saat ini
const serviceIPs = client.getServiceIPs();
// Perbarui manual alamat IP layanan
await client.updateServiceIPs();
// Matikan klien
await client.close();
Ringkasan
Topik ini menjelaskan cara menggunakan SDK HTTPDNS dalam lingkungan Node.js dan memberikan praktik terbaik. Mengintegrasikan SDK dengan library jaringan menggunakan agent membantu Anda mencapai resolusi nama domain berkinerja tinggi dan berdaya tahan tinggi. Fitur utamanya sebagai berikut:
Mudah digunakan: Menyediakan operasi API yang sederhana dan mendukung resolusi sinkron maupun sinkron non-blocking.
Ketersediaan tinggi: Mendukung kebijakan failover dan menurunkan spesifikasi untuk memastikan stabilitas layanan.
Optimalisasi kinerja: Menyertakan mekanisme caching bawaan dan penggunaan kembali koneksi untuk meningkatkan efisiensi resolusi.
Aman dan andal: Mendukung resolusi terautentikasi dan komunikasi HTTPS untuk menjamin keamanan data.
Ikuti praktik terbaik dalam topik ini untuk mengintegrasikan layanan HTTPDNS secara efisien ke dalam aplikasi Node.js Anda.