添加Yarp.ReverseProxy
修改Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.AddYarpProxy();
....
var app = builder.Build();
app.MapReverseProxy();
...
app.Run();
AddYarpProxy定义
public static partial class Extensions
{
public static WebApplicationBuilder AddYarpProxy(this WebApplicationBuilder builder)
{
builder.Services.AddReverseProxy()
.LoadFromMemory(DaprConfigUtils.Routes, DaprConfigUtils.Clusters)
.AddTransforms<DaprTransformProvider>();
return builder;
}
}
public class DaprConfigUtils
{
public const string DaprApiRouteId = "dapr-service";
public const string DaprApiClusterId = "dapr-sidecar";
public const string DaprApiStartBy = "/api/";
public static RouteConfig[] Routes => new[]
{
new RouteConfig(){
RouteId = DaprApiRouteId,
ClusterId = DaprApiClusterId,
Match = new RouteMatch
{
Path = DaprApiStartBy + "{**catch-all}"
}
}
};
public static ClusterConfig[] Clusters => new[]
{
new ClusterConfig()
{
ClusterId = DaprApiClusterId,
//SessionAffinity = new SessionAffinityConfig { Enabled = true, Policy = "Cookie", AffinityKeyName = ".Yarp.ReverseProxy.Affinity" },
Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
{
{ "destination1", new DestinationConfig() { Address = "http://127.0.0.1:3500" } },
}
}
};
}
定义DaprTransformProvider
public class DaprTransformProvider : ITransformProvider
{
public void Apply(TransformBuilderContext context)
{
if (context.Route.RouteId == DaprConfigUtils.DaprApiRouteId)
{
context.AddRequestTransform( (RequestTransformContext transformContext) =>{
var path = transformContext.Path.Value?.Replace(DaprConfigUtils.DaprApiStartBy,string.Empty);
if (!string.IsNullOrEmpty(path))
{
var index = path.IndexOf('/');
if (index != -1)
{
var appId = path.Substring(0, index);
var newPath = path.Substring(index);
if (!string.IsNullOrEmpty(appId) && !string.IsNullOrEmpty(newPath))
{
transformContext.ProxyRequest.RequestUri = new Uri($"{transformContext.DestinationPrefix}/v1.0/invoke/{appId}/method{newPath}");
return ValueTask.CompletedTask;
}
}
}
return ValueTask.FromException(new Exception($"路径错误,必须格式/api/appid/*,实际:{transformContext.Path}"));
});
}
}
public void ValidateCluster(TransformClusterValidationContext context)
{
/*if (context.Cluster.ClusterId== DaprConfigUtils.DaprApiClusterId)
{
}*/
}
public void ValidateRoute(TransformRouteValidationContext context)
{
/*if (context.Route.RouteId == DaprConfigUtils.DaprApiRouteId)
{
}*/
}
}
搞定!