.NET Aspire 中的服务发现
.NET Aspire 中的服务发现
https://www.nuget.org/packages/Microsoft.Extensions.ServiceDiscovery
.NET Aspire 中的服务发现
.NET Aspire 包含了对于开发阶段和测试阶段配置服务发现的功能。该功能通过提供基于配置的服务端点解析器来实现,来自 .NET Aspire AppHost 项目中的服务发现配置为每个服务项目增加了服务发现。
配置服务发现仅仅需要对指定的项目添加所引用的服务来实现。例如,考虑如下的 AppHost 代码:
var builder = DistributedApplication.CreateBuilder(args);
var catalog = builder.AddProject<Projects.CatalogService>("catalog");
var basket = builder.AddProject<Projects.BasketService>("basket");
var frontend = builder.AddProject<Projects.MyFrontend>("frontend")
.WithReference(basket)
.WithReference(catalog);
在上面的示例中,frontend 项目引用了 catalog 项目和 basket 项目。两个 WithReference()
调用指示 .NET Aspire 应用为引用的服务 (catalog 和 basket) 传递服务发现信息到 frontend 项目中。
命名端点
有些服务暴露多个命名端点。命名的端点可以通过指定 HTTP 请求的 URL 中的主机部分中的端点名称来解析。遵循的格式为:http://_endpointName.serviceName
。例如,如果服务名称为 basket
,暴露的命名端点为 dashboard
,那么,可以使用 URI http://_dashboard.basket
来指定端点,例如:
builder.Services.AddHttpClient<BasketServiceClient>(
static client => client.BaseAddress = new("http://basket"));
builder.Services.AddHttpClient<BasketServiceDashboardClient>(
static client => client.BaseAddress = new("http://_dashboard.basket"));
在上面的示例中,两个 HttpClient 被添加出来,一个用于核心的 basket 服务,另外一个用于 basket 服务的 dashboard。
通过 Configuration 配置命名端点
对于基于配置的端点解析器,命名端点可以通过 _endpointName
前缀来配置端点的值,这里的 endpointName
就是端点的名称。例如,考虑下面的 appsettings.json,它定义了一个默认端点 (没有名称) 和一个命名端点 ( dashboard )
{
"Services": {
"basket": [
"10.2.3.4:8080", /* the default endpoint, when resolving http://basket */
"_dashboard.10.2.3.4:9999" /* the "dashboard" endpoint, resolved via http://_dashboard.basket */
]
}
}
.NET Aspire 中的命名端点
.NET Aspire 在开发阶段和测试阶段使用基于配置的服务解析器。提供了方便的 API 来配置命名端点,随后使用到目标服务的配置中。例如:
var builder = DistributedApplication.CreateBuilder(args);
var basket = builder.AddProject<Projects.BasketService>("basket")
.WithEndpoint(hostPort: 9999, scheme: "http", name: "admin");
var adminDashboard = builder.AddProject<Projects.MyDashboardAggregator>("admin-dashboard")
.WithReference(basket.GetEndPoint("admin"));
var frontend = builder.AddProject<Projects.Frontend>("frontend")
.WithReference(basket);
对于这个示例来说,basket
服务暴露了 admin
端点,该服务端点被 admin-dashboard
项目所使用,而 frontend
项目则使用了来自 basket
的所有端点。同时,对于 frontend
项目来说,它还可以只使用来自 basket
的默认 http
端点,通过使用 GetEndPoint(string name) 方法来使用,如下所示:
// The preceding code is the same as in the above sample
var frontend = builder.AddProject<Projects.Frontend>("frontend")
.WithReference(basket.GetEndpoint("http"));
应该是 admin
Kubernetes 中使用 DNS SRV 的命名端点
当部署在 Kubernetes 中的时候,DNS SRV 服务端点解析器可以被用于解析命名端点。例如,下面的资源定义将创建命名端点 default
的 DNS SRV 记录和名为 dashboard
的命名记录。它们都在服务 basket
中。
apiVersion: v1
kind: Service
metadata:
name: basket
spec:
selector:
name: basket-service
clusterIP: None
ports:
- name: default
port: 8080
- name: dashboard
port: 8888
为了配置服务解析 basket
服务中的命名端点 dashboard
,在 Host Builder 中增加 DNS SRV 服务端点解析器,如下所示:
builder.Services.AddServiceDiscoveryCore();
builder.Services.AddDnsSrvServiceEndPointResolver();
专用的端口名称 default
用于默认端点,使用 URI http://basket
可以解析。
对于上面的示例,为 basket 服务增加服务发现支持:
builder.Services.AddHttpClient<BasketServiceClient>(
static client => client.BaseAddress = new("http://basket"));
类似的,对于 dashboard
服务端点,可以使用如下方式:
builder.Services.AddHttpClient<BasketServiceDashboardClient>(
static client => client.BaseAddress = new("http://_dashboard.basket"));
Azure Container Apps 中的命名端点
目前不支持