YARP实现Dapr服务调用的反向代理

Yarp服务收到http请求
自定义Yarp转换:
http(s)😕/<Yarp服务>/api/<服务名>/XXXXX
转为
http:///v1.0/invoke/<服务名>/method/XXXXX
注:这里的可能是动态的,因此不应该写死在配置文件里

请求转给Dapr-sidecar
Dapr 服务发现 终端服务并调用
返回响应
开发
创建两个Asp.Net Core项目:

GatewayDemo 网关Demo
ServiceSample 示例服务
完成 ServiceSample
这个示例比较简单,所以不需要引用Dapr SDK,只需加一个测试用的Controller就好了:

[Controller]
[Route(“sample”)]
public class SampleController
{
[HttpGet("{account}")]
public ActionResult Get(string account)
{
return new JsonResult(new
{
Account = account,
Balance = 100
});
}
}
添加引用

GatewayDemo.csproj 增加包引用:
注:Yarp.ReverseProxy从preview.10开始包名字变了,之前叫"Microsoft.ReverseProxy"。

这个示例比较简单,不需要引用Dapr的SDK
动态添加Yarp的Clusters自定义配置

public static IConfigurationBuilder AddDaprConfig(this IConfigurationBuilder configurationBuilder)
{
var httpEndpoint = DaprDefaults.GetDefaultHttpEndpoint(); //参考Dapr.Client,获取到dapr-sidecar的url
return configurationBuilder.AddInMemoryCollection(new[]
{
new KeyValuePair<string, string>(“Yarp:Clusters:dapr-sidecar:Destinations:d1:Address”, httpEndpoint),
});
}
//GatewayDemo的Program.cs
Host.CreateDefaultBuilder(args)

.ConfigureAppConfiguration((_, builder) => builder.AddDaprConfig())
GatewayDemo appsettings 增加Yarp相关配置

Yarp:
Routes:
- RouteId: r-module-master
ClusterId: dapr-sidecar
Match:
Path: api/service-sample/{**catch-all}
Metadata:
Dapr: method #标注Dapr
不用在意为什么是yaml,而不是json。

添加Yarp的自定义转换

public class DaprTransformProvider : ITransformProvider
{
public void ValidateRoute(TransformRouteValidationContext context)
{
}

public void ValidateCluster(TransformClusterValidationContext context)
{
}

public void Apply(TransformBuilderContext context)
{
    string daprAct = null;
    if (context.Route.Metadata?.TryGetValue(DaprYarpConst.MetaKeys.Dapr, out daprAct) ?? false) //通过元数据判断是否是Dapr服务,在配置文件中设置
    {
        switch (daprAct)
        {
            case DaprYarpConst.DaprAct.Method:
                context.AddRequestTransform(transformContext =>
                {
                    var index = transformContext.Path.Value!.IndexOf('/', 5); // format: /api/<服务>/xxxx
                    var appId = transformContext.Path.Value.Substring(5, index - 5);
                    var newPath = transformContext.Path.Value.Substring(index);
                    transformContext.ProxyRequest.RequestUri = new Uri($"{transformContext.DestinationPrefix}/v1.0/invoke/{appId}/method{newPath}");
                    return ValueTask.CompletedTask;
                });
                break;
        }
    }
}

}

//GatewayDemo的Startup
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddReverseProxy()
.LoadFromConfig(_configuration.GetSection(“Yarp”))
.AddTransforms(); //加上自定义转换
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapReverseProxy();
//endpoints.MapGet("/", async context => { await context.Response.WriteAsync(“Hello World!”); });
});
}
}
配置tye
参考:

name: dapr-yarp.sample
extensions:

  • name: dapr
    components-path: “./components/”
    config: dapr-config
    exclude-placement-container: true
    placement-port: 6050
  • name: zipkin
    services:
  • name: gateway-demo #服务名称最好不要有大写,容易出问题
    project: ./GatewayDemo/GatewayDemo.csproj
  • name: service-sample #服务名称最好不要有大写,容易出问题
    project: ./ServiceSample/ServiceSample.csproj
  • name: zipkin #dapr的追踪服务
    external: true
    bindings:
    • name: http
      port: 9411
      ingress:
  • name: ingress
    rules:
    • service: gateway-demo
      path: /
      bindings:
    • name: ingress
      protocol: https
      port: 44363 #对外端口
      ./componnets/文件夹下还有一些配置文件,这里就不贴了

用tye同时运行多个项目
确保dapr那3个容器服务正常运行后,运行 tye run,通过tye的Dapr扩展,运行显示以下几个服务:

gateway-demo
service-sample
zipkin
gateway-demo-dapr
service-sample-dapr
ingress
测试:
浏览器直接打开:https://localhost:44363/api/service-sample/sample/1234
如果显示 {“account”:“1234”,“balance”:100} 就说明通了。

附上Demo代码
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值