Bagikan melalui


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.AllowAllSchemestrue:

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.

Lihat juga