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 玩耍服务调用的更多相关文章
- Dapr实战(二) 服务调用
服务调用是什么 在分布式应用程序中的服务之间进行调用会涉及到许多挑战. 例如: 维护其他服务的地址. 如何安全地调用服务. 在发生短暂的 暂时性错误 时如何处理重试. 分布式应用程序调用链路追踪. 服 ...
- Blazor+Dapr+K8s微服务之服务调用
1.1 Dapr环境配置 1.1.1 在开发机安装Docker Desktop并启用Kubernetes 安装过程略,安装好后效果如下:(左下角两个绿色指示Docker和 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- Dapr微服务应用开发系列3:服务调用构件块
题记:这篇开始逐一深入介绍各个构件块,从服务调用开始 原理 所谓服务调用,就是通过这个构件块让你方便的通过HTTP或者gRPC协议同步调用其他服务的方法,这些方法也是通过HTTP或者gRPC来暴露的. ...
- Dapr + .NET Core实战(十二)服务调用之GRPC
什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...
- 手把手教你学Dapr - 4. 服务调用
上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...
- Caller 服务调用 - Dapr
前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...
- 3. Caller 服务调用 - dapr
前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...
- Http 调用netty 服务,服务调用客户端,伪同步响应.ProtoBuf 解决粘包,半包问题.
实际情况是: 公司需要开发一个接口给新产品使用,需求如下 1.有一款硬件设备,客户用usb接上电脑就可以,但是此设备功能比较单一,所以开发一个服务器程序,辅助此设备业务功能 2.解决方案,使用Sock ...
随机推荐
- Mysql优化(出自官方文档) - 第七篇
Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...
- 从HTTP到HTTPS
从HTTP到HTTPS HTTP存在的缺陷 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改 防窃听 通信加密 HTTP 协议 ...
- 如何优雅的实现Mysql 增删改查,看完你就会了
接着上期说,上期没写一条sql就把数据查询出来了,那如果要保存或者更新数据怎么办呢?能不能自己写sql呢? 保存数据 @GetMapping("save")//保存数据 publi ...
- div和img垂直居中的方法
div垂直居中可以使用height和line-height,多个div的话就不适用了. 可以使用下面的方式垂直居中 <div class="parent"> <d ...
- CloudCanal
CloudCanal 是一款数据迁移同步工具,帮助企业快速构建高质量数据流通通道,产品包含 SaaS 模式和私有输出专享模式.开发团队核心成员来自大厂,具备数据库内核.大规模分布式系统.云产品构建背景 ...
- 955.WLB 不加班公司名单!再新增 5 家公司!
大家好!我是<Visual Studio Code 权威指南>的作者韩骏.相信不少童鞋都是因为 VS Code 认识到我:也许是用了我写的 20 多个 VS Code 插件(比如 Code ...
- SpringMVC(6)数据验证
在系列SpringMVC(4)数据绑定-1.SpringMVC(5)数据绑定-2中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. ...
- WPF DataGrid RowDetailsTemplate 鼠标滚动通知到 DataGrid 滚动
前言:上次做了数据驱动UI虽然已经实现,但是在明细中鼠标滚动并不能带动外部 DataGrid 滚动条滚动,上文地址 https://www.cnblogs.com/luguangguang/p/14 ...
- Java | 一个".java"源文件中是否可以包括多个类(不包括内部类)
第一种情况:(有public) 定义一个java源文件(Hello.java),里面只有一个类: public class Hello { public static void main(string ...
- libzip开发笔记(二):libzip库介绍、ubuntu平台编译和工程模板
前言 Qt使用一些压缩解压功能,选择libzip库,libzip库比较原始,也是很多其他库的基础支撑库,编译过了windows版本,有需求编译一个ubuntu版本的,交叉编译需求的同样可参照本文章 ...