使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的:

var client = DaprClient.CreateInvokeHttpClient(appId: "routing");
var response = await client.GetAsJsonAsync($"/accounts/{17}", cancellationToken);
var account = await response.Content.ReadFromJsonAsync<Account>(cancellationToken: cancellationToken);
我更希望是这样子调用:

public interface IBank
{
            [HttpGet("/accounts/{accountId}")]
            Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

[HttpPost("/deposit")]
            Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

[HttpPost("/withdraw")]
            [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
            Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}

var account = await bankClient.GetUser("17", cancellationToken);
我们可以用 Refit,RestEase 或者是 WebApiClientCore 来达到这样的效果, 那么在Dapr 里面使用这些库如何做到呢, 在Dapr的客户端库里面有一个Handler 的官方实现:InvocationHandler。搭配这个InvocationHandler 就可以和这几个库,在本文中,我们重点介绍Dapr Client 如何搭配 WebApiClientCore。

public interface IBank
{
          [HttpGet("/accounts/{accountId}")]
          Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

[HttpPost("/deposit")]
          Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

[HttpPost("/withdraw")]
          [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
          Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}

public class WebapiClientExample : Example
   {
       public override string DisplayName => "WebapiClient";

private IBank bankClient;

public WebapiClientExample(IBank bank)
       {
           bankClient = bank;
       }

public override async Task RunAsync(CancellationToken cancellationToken)
       {
           var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);

// Scenario 1: Check if the account already exists.
           Account? account = null;
           try
           {
               account = await bankClient.GetUser("17", cancellationToken);
           }
           catch (ApiException ex)
           {
               // Account does not exist.
           }

Console.WriteLine($"Scenario 1: account '17' {(account is null ? "does not exist" : "already exists")}");

// Scenario 2: Deposit some money
           var transaction = new Transaction()
           {
               Amount = 100m,
               Id = "17",
           };

// read updated balance
           account = await bankClient.Deposit(transaction, cancellationToken);
           Console.WriteLine($"Scenario 2: account '17' has '{account?.Balance}' money");

// Scenario 3: Handle a validation error without exceptions
           transaction = new Transaction()
           {
               Amount = 1_000_000m,
               Id = "17",
           };
           HttpResponseMessage response = null;

response = await bankClient.Withdraw(transaction, cancellationToken);
           if (response.StatusCode != HttpStatusCode.BadRequest)
           {
               // We don't actually expect this example to succeed - we expect a 400
               Console.WriteLine("Something went wrong :(");
               return;
           }
           var problem = await response.Content.ReadFromJsonAsync<ProblemDetails>(cancellationToken: cancellationToken);
           Console.WriteLine($"Scenario 3: got the following errors:");
           foreach (var kvp in problem!.Errors)
           {
               Console.WriteLine($"{kvp.Key}: {string.Join(", ", kvp.Value)}");
           }
       }
   }

var services = new ServiceCollection();
             services.AddTransient<Example, WebapiClientExample>();
             services.AddLogging();

services
                 .AddScoped<InvocationHandler>()
                 .AddHttpApi<WebapiClientExample.IBank>(o => o.HttpHost = new Uri("http://bank"))
                 .AddHttpMessageHandler<InvocationHandler>();
            var serviceprovider = services.BuildServiceProvider();

代码的核心部分就在于上面红色的部分,我们把InvocationHandler 加入到AddHttpApi ,就可以和 dapr 一起玩耍了。

Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用相关推荐

  1. Blazor+Dapr+K8s微服务之服务调用

    1.1  Dapr环境配置 1.1.1        在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和K8s正在运行 ...

  2. 手把手教你学Dapr - 4. 服务调用

    介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用HttpClientFactory呢 先问几个问题: 如何发现和调用不同服务的方 ...

  3. Dapr + .NET 实战(十二)服务调用之GRPC

    欢迎大家参加4小时Dapr+.NET 5的实战课程 课程链接     https://ke.qq.com/course/4000292?tuin=1271860f 什么是GRPC gRPC 是一种与语 ...

  4. Dapr + .NET Core实战(二) 服务调用

    服务调用是什么 在分布式应用程序中的服务之间进行调用会涉及到许多挑战.例如: 维护其他服务的地址. 如何安全地调用服务. 在发生短暂的 暂时性错误 时如何处理重试. 分布式应用程序调用链路追踪. 服务 ...

  5. 面向.NET开发人员的Dapr——服务调用

    目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...

  6. Dapr微服务应用开发系列3:服务调用构件块

    题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...

  7. 3. Caller 服务调用 - dapr

    前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...

  8. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  9. Dapr牵手.NET学习笔记:想入非非的服务调用

    demo运行环境:Windows10,Docker(dapr_zipkin,dapr_redid,dapr_placement) 安装:dapr init 卸载:dapr uninstall,然后删除 ...

最新文章

  1. 基于SSM实现小区物业管理系
  2. docker 常用操作
  3. 2020-11-27(switch的优化问题)
  4. mysql cpu 内存占用_MySQL占用内存与CPU过高测试与解决办法
  5. Elasticsearch query和filter过滤有什么不同
  6. 【完全开源】微信客户端.NET版
  7. leetcode :string字符串和数字
  8. python .py文件变为.so文件进行加密
  9. Redux 进阶 - react 全家桶学习笔记(二)
  10. JQuery选择器中含有冒号的ID处理差异的分析
  11. python 读取csv_Python实现CSV数据的读取--两种方法实现
  12. vue cli 解决跨域 线上 nginx 反向代理配置
  13. Java——变量和数据类型
  14. 2022跨年代码(有烟花)
  15. Linux下设备驱动
  16. Excel表格中两列数据对比,找出异同的数据
  17. 判断是否是ie浏览器 前端js_JavaScript判断IE浏览器版本IE6,IE7,IE8
  18. 曾经决心永不做游戏 但为何阿里巴巴的游戏之心一直死不了?
  19. flutter 实现文字竖排以及动画效果(文字逐一显示)
  20. CF855G Harry Vs Voldemort 题解

热门文章

  1. 第二十四天 多维数组
  2. 运维自动化之基于python语言的文字界面的运维管理软件
  3. 关于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解决办法
  4. bzoj 4598: [Sdoi2016]模式字符串
  5. spring security xml配置详解
  6. 数据结构(java语言描述)顺序栈的使用
  7. magento模板 -- 如何安装magento模板
  8. Hdu 3478 Catch
  9. [恢]hdu 2147
  10. Office SharePoint Server 2007