Penemuan layanan di .NET
Dalam artikel ini, Anda mempelajari cara menggunakan Microsoft.Extensions.ServiceDiscovery
pustaka. Penemuan layanan adalah cara bagi pengembang untuk menggunakan nama logis alih-alih alamat fisik (alamat IP dan port) untuk merujuk ke layanan eksternal.
Memulai
Untuk mulai menggunakan penemuan layanan di .NET, instal paket NuGet Microsoft.Extensions.ServiceDiscovery .
dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease
Untuk informasi selengkapnya, lihat menambahkan paket dotnet atau Mengelola dependensi paket dalam aplikasi .NET.
Contoh penggunaan
Dalam file Program.cs proyek Anda, panggil AddServiceDiscovery metode ekstensi untuk menambahkan penemuan layanan ke host, mengonfigurasi pemecah masalah titik akhir layanan default:
builder.Services.AddServiceDiscovery();
Tambahkan penemuan layanan ke individu IHttpClientBuilder dengan memanggil AddServiceDiscovery
metode ekstensi:
builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
{
client.BaseAddress = new("https://catalog");
})
.AddServiceDiscovery();
Atau, Anda dapat menambahkan penemuan layanan ke semua HttpClient instans secara default:
builder.Services.ConfigureHttpClientDefaults(static http =>
{
// Turn on service discovery by default
http.AddServiceDiscovery();
});
Pemilihan skema saat menyelesaikan titik akhir HTTP(S)
Adalah umum untuk menggunakan HTTP saat mengembangkan dan menguji layanan secara lokal dan HTTPS ketika layanan disebarkan. Penemuan Layanan mendukung ini dengan memungkinkan daftar prioritas skema URI ditentukan dalam string input yang diberikan kepada Penemuan Layanan. Penemuan Layanan akan mencoba menyelesaikan layanan untuk skema secara berurutan dan akan berhenti setelah titik akhir ditemukan. Skema URI dipisahkan oleh +
karakter, misalnya: "https+http://basket"
. Penemuan Layanan pertama-tama akan mencoba menemukan titik akhir HTTPS untuk "basket"
layanan dan kemudian akan kembali ke titik akhir HTTP. Jika ada titik akhir HTTPS yang ditemukan, Penemuan Layanan tidak akan menyertakan titik akhir HTTP.
Skema dapat difilter dengan mengonfigurasi AllowedSchemes
properti dan AllowAllSchemes
pada ServiceDiscoveryOptions
. Properti AllowAllSchemes
digunakan untuk menunjukkan bahwa semua skema diizinkan. Secara default, AllowAllSchemes
adalah true
dan semua skema diizinkan. Skema dapat dibatasi dengan mengatur AllowAllSchemes
ke false
dan menambahkan skema yang diizinkan ke AllowedSchemes
properti . Misalnya, untuk hanya mengizinkan HTTPS:
services.Configure<ServiceDiscoveryOptions>(options =>
{
options.AllowAllSchemes = false;
options.AllowedSchemes = ["https"];
});
Untuk secara eksplisit mengizinkan semua skema, atur properti ke ServiceDiscoveryOptions.AllowAllSchemes
true
:
services.Configure<ServiceDiscoveryOptions>(
options => options.AllowAllSchemes = true);
Mengatasi titik akhir layanan dari konfigurasi
Metode AddServiceDiscovery
ekstensi menambahkan penyelesai titik akhir berbasis konfigurasi secara default.
Resolver ini membaca titik akhir dari sistem konfigurasi .NET. Pustaka mendukung konfigurasi melalui appsettings.json, variabel lingkungan, atau sumber lainnya IConfiguration .
Berikut adalah contoh yang menunjukkan cara mengonfigurasi titik akhir untuk layanan bernama katalog melalui appsettings.json
:
{
"Services": {
"catalog": {
"https": [
"localhost:8080",
"10.46.24.90:80"
]
}
}
}
Contoh sebelumnya menambahkan dua titik akhir untuk layanan bernama katalog: https://localhost:8080
, dan "https://10.46.24.90:80"
. Setiap kali katalog diselesaikan, salah satu titik akhir ini dipilih.
Jika penemuan layanan ditambahkan ke host menggunakan AddServiceDiscoveryCore metode ekstensi pada IServiceCollection, pemecah masalah titik akhir berbasis konfigurasi dapat ditambahkan dengan memanggil AddConfigurationServiceEndpointProvider metode ekstensi pada IServiceCollection
.
Konfigurasi
Resolver konfigurasi dikonfigurasi menggunakan ConfigurationServiceEndpointProviderOptions kelas , yang menawarkan opsi konfigurasi ini:
SectionName: Nama bagian konfigurasi yang berisi titik akhir layanan. Ini default ke
"Services"
.ApplyHostNameMetadata: Delegasi yang digunakan untuk menentukan apakah metadata nama host harus diterapkan ke titik akhir yang diselesaikan. Ini default ke fungsi yang mengembalikan
false
.
Untuk mengonfigurasi opsi ini, Anda dapat menggunakan Configure
metode ekstensi pada IServiceCollection
dalam kelas atau Program
file aplikasi Startup
Anda:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<ConfigurationServiceEndPointResolverOptions>(
static options =>
{
options.SectionName = "MyServiceEndpoints";
// Configure the logic for applying host name metadata
options.ApplyHostNameMetadata = static endpoint =>
{
// Your custom logic here. For example:
return endpoint.EndPoint is DnsEndPoint dnsEp
&& dnsEp.Host.StartsWith("internal");
};
});
Contoh sebelumnya menunjukkan pengaturan nama bagian kustom untuk titik akhir layanan Anda dan menyediakan logika kondisional kustom untuk menerapkan metadata nama host.
Mengatasi titik akhir layanan menggunakan penemuan layanan yang disediakan platform
Platform tertentu, seperti Azure Container Apps dan Kubernetes (jika dikonfigurasi sesuai), menawarkan kemampuan penemuan layanan tanpa memerlukan pustaka klien penemuan layanan. Dalam kasus di mana aplikasi disebarkan di lingkungan tersebut, menggunakan fungsionalitas bawaan platform dapat menguntungkan. Resolver pass-through dirancang untuk memfasilitasi skenario ini. Ini memungkinkan pemanfaatan pemecah masalah alternatif, seperti konfigurasi, di lingkungan yang berbeda, seperti komputer pengembang. Yang penting, fleksibilitas ini dicapai tanpa perlu modifikasi kode atau implementasi penjaga kondisional.
Pemecah masalah pass-through tidak melakukan resolusi eksternal dan sebaliknya menyelesaikan titik akhir dengan mengembalikan nama layanan input yang diwakili sebagai DnsEndPoint.
Penyedia pass-through dikonfigurasi secara default saat menambahkan penemuan layanan melalui AddServiceDiscovery
metode ekstensi.
Jika penemuan layanan ditambahkan ke host menggunakan AddServiceDiscoveryCore
metode ekstensi pada IServiceCollection
, penyedia pass-through dapat ditambahkan dengan memanggil AddPassThroughServiceEndpointProvider metode ekstensi pada IServiceCollection
.