Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用
使用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 玩耍服务调用相关推荐
- Blazor+Dapr+K8s微服务之服务调用
1.1 Dapr环境配置 1.1.1 在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和K8s正在运行 ...
- 手把手教你学Dapr - 4. 服务调用
介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用HttpClientFactory呢 先问几个问题: 如何发现和调用不同服务的方 ...
- Dapr + .NET 实战(十二)服务调用之GRPC
欢迎大家参加4小时Dapr+.NET 5的实战课程 课程链接 https://ke.qq.com/course/4000292?tuin=1271860f 什么是GRPC gRPC 是一种与语 ...
- Dapr + .NET Core实战(二) 服务调用
服务调用是什么 在分布式应用程序中的服务之间进行调用会涉及到许多挑战.例如: 维护其他服务的地址. 如何安全地调用服务. 在发生短暂的 暂时性错误 时如何处理重试. 分布式应用程序调用链路追踪. 服务 ...
- 面向.NET开发人员的Dapr——服务调用
目录: 面向.NET开发人员的Dapr--前言 面向.NET开发人员的Dapr--分布式世界 面向.NET开发人员的Dapr--俯瞰Dapr 面向.NET开发人员的Dapr--入门 面向.NET开发人 ...
- Dapr微服务应用开发系列3:服务调用构件块
题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...
- 3. Caller 服务调用 - dapr
前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- Dapr牵手.NET学习笔记:想入非非的服务调用
demo运行环境:Windows10,Docker(dapr_zipkin,dapr_redid,dapr_placement) 安装:dapr init 卸载:dapr uninstall,然后删除 ...
最新文章
- 基于SSM实现小区物业管理系
- docker 常用操作
- 2020-11-27(switch的优化问题)
- mysql cpu 内存占用_MySQL占用内存与CPU过高测试与解决办法
- Elasticsearch query和filter过滤有什么不同
- 【完全开源】微信客户端.NET版
- leetcode :string字符串和数字
- python .py文件变为.so文件进行加密
- Redux 进阶 - react 全家桶学习笔记(二)
- JQuery选择器中含有冒号的ID处理差异的分析
- python 读取csv_Python实现CSV数据的读取--两种方法实现
- vue cli 解决跨域 线上 nginx 反向代理配置
- Java——变量和数据类型
- 2022跨年代码(有烟花)
- Linux下设备驱动
- Excel表格中两列数据对比,找出异同的数据
- 判断是否是ie浏览器 前端js_JavaScript判断IE浏览器版本IE6,IE7,IE8
- 曾经决心永不做游戏 但为何阿里巴巴的游戏之心一直死不了?
- flutter 实现文字竖排以及动画效果(文字逐一显示)
- CF855G Harry Vs Voldemort 题解
热门文章
- 第二十四天 多维数组
- 运维自动化之基于python语言的文字界面的运维管理软件
- 关于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解决办法
- bzoj 4598: [Sdoi2016]模式字符串
- spring security xml配置详解
- 数据结构(java语言描述)顺序栈的使用
- magento模板 -- 如何安装magento模板
- Hdu 3478 Catch
- [恢]hdu 2147
- Office SharePoint Server 2007