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
调用结果如下: