Dapr服务调用
提示:以下是本篇文章正文内容,下面案例可供参考
Dapr服务调用的优势
- 服务调用失败时会自动重试(三次)
- 通过mTLS加密确保服务间通信安全
- 能捕获服务间所有调用的跟踪和指标
- 实现负载均衡
Dapr服务调用终结点
http://localhost:<dapr-port>/v1.0/invoke/<application-id>/method/<method-name>
-
<dapr-port>:Dapr正在侦听的HTTP端口 -
<application-id>:要调用的服务的应用程序ID -
<application-id>: 要在远程服务上调用的方法的名称
1.项目创建
- 新建解决方案:Dapr.Demo
- 新建两个.Net 6 Web API项目:BackEnd(需开启https),FrontEnd
- 设置默认端口:
BackEnd
FrontEndbuilder.WebHost.UseUrls("https://*:5000");builder.WebHost.UseUrls("http://*:5001");
2.HTTP服务
- FrontEnd
- 新增Nuget引用:Dapr.Client,Dapr.AspNetCore
- 注册Dapr
builder.Services.AddControllers().AddDapr(); - 新增控制器:DaprController,注入DaprClient
private readonly ILogger<DaprController> _logger; private readonly DaprClient _daprClient; public DaprController(ILogger<DaprController> logger, DaprClient daprClient) { _logger = logger; _daprClient = daprClient; } - 新增接口,通过HttpClient调用BackEnd
[HttpGet] public async Task<ActionResult> GetAsync() { using var httpClient = DaprClient.CreateInvokeHttpClient(); var result = await httpClient.GetAsync("http://backend/WeatherForecast"); var resultContent = await result.Content.ReadAsStringAsync(); return Ok(resultContent); } - 新增接口,通过注入的DaprClient调用BackEnd
[HttpGet("di")] public async Task<ActionResult> GetDIAsync() { var result = await _daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(HttpMethod.Get, "backend", "WeatherForecast"); return Ok(result); }
3.启动与测试HTTP服务
- 启动BackEnd
dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend dotnet .\BackEnd\bin\Debug\net6.0\BackEnd.dll --app-ssl - 启动FrontEnd
dapr run --dapr-http-port 3501 --app-port 5001 --app-id frontend dotnet .\FrontEnd\bin\Debug\net5.0\FrontEnd.dll - 发送请求,可以使用浏览器或者ApiPost等工具测试
http://localhost:5001/api/Dapr http://localhost:3501/v1.0/invoke/frontend/method/api/Dapr
调用结果如下:


4.GRPC服务
-
BackEnd
- 新增Nuget引用:Dapr.AspNetCore,Grpc.AspNetCore
-
新增Protos/greet.proto,写入以下代码
syntax = "proto3"; option csharp_namespace = "GrpcGreeter"; package greet; message HelloRequest { string name = 1; } message HelloReply { string message = 1; } -
打开csproj文件,指定Server端
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup> -
新增新增Services/HelloService,写入以下代码
public class HelloService : AppCallback.AppCallbackBase { public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context) { var response = new InvokeResponse(); switch (request.Method) { case "sayhi": var input = request.Data.Unpack<HelloRequest>(); response.Data = Any.Pack(new HelloReply { Message = $"Hi,i'm {input.Name},nice to meet you!" }); break; } return response; } } -
注册GRPC,Program中写入以下代码
builder.Services.AddGrpc(); app.MapGrpcService<HelloService>(); -
FrontEnd
- 新增Nuget引用:Google.Protobuf,Grpc.Net.Client,Grpc.Tools
- Copy一份BackEnd中的Protos/greet.proto 并修改csproj文件 指定client
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup> - 新增接口,通过Grpc调用BackEnd
[HttpGet("grpc")] public async Task<ActionResult> GrpcAsync() { using var daprClient = new DaprClientBuilder().Build(); var result = await daprClient.InvokeMethodGrpcAsync<HelloRequest, HelloReply>("backend", "sayhi", new HelloRequest { Name = "tom" }); return Ok(result); }
5.启动与测试GRPC服务
- 启动BackEnd
dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend --app-protocol grpc dotnet .\BackEnd\bin\Debug\net6.0\BackEnd.dll --app-ssl - 启动FrontEnd
dapr run --dapr-http-port 3501 --app-port 5001 --app-id frontend dotnet .\FrontEnd\bin\Debug\net6.0\FrontEnd.dll - 发送请求,可以使用浏览器或者ApiPost等工具测试
http://localhost:5001/api/Dapr/grpc http://localhost:3501/v1.0/invoke/frontend/method/api/Dapr/grpc
调用结果如下:


Dapr服务调用实战:HTTP与GRPC通信详解

本文介绍了Dapr服务调用的HTTP和GRPC两种方式,详细展示了如何在.NET6 WebAPI项目中实现。通过Dapr的服务调用,实现了服务间的自动重试、安全通信和跟踪。HTTP服务调用通过HttpClient和DaprClient演示,GRPC服务调用则涉及ProtoBuf定义、服务端和客户端的配置。通过实例,阐述了Dapr在服务间通信的便捷性和安全性。
984





