Dapr专题之03服务调用

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.项目创建

  1. 新建解决方案:Dapr.Demo
  2. 新建两个.Net 6 Web API项目:BackEnd(需开启https),FrontEnd
  3. 设置默认端口:
    BackEnd
    builder.WebHost.UseUrls("https://*:5000");
    
    FrontEnd
    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中的状态管理,欢迎各位朋友点赞收藏,同时希望本文能够给大家带来一丝帮助与启发。
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值