为什么需要流式?
对于微服务的服务调用,一般是不需要流式调用的,一般是等待上级服务完全返回响应数据,然后进行后续处理,但是在某些领域,比如AI客户端是需要流式的,因为流式可以尽快地把数据展示给用户,让用户觉得响应速度很快。
例子
给出下面的例子,并使用注释来避免更改代码。
解释:
下面的普通模式和流式不是做的同样的工作,这里只是接受外部服务而已。
普通模式输出了业务信息
流式输出了接收到的 响应数据。
来源
这个例子的普通模式代码来自于《Dapr与.NET微服务实战》。
流式的写法是 获取响应流然后手动处理流,而不是等待响应流结束,拿到响应体。
对应的来源是:
Dapr 客户端 .NET SDK入门 | Dapr 文档库
对照例子
普通模式
var data = new { sku = item.ProductCode, quantity = item.Quantity };
var result = await daprClient.InvokeMethodAsync<object, dynamic>(HttpMethod.Post, "reservation-service", "reserve", data);
// var client = DaprClient.CreateInvokeHttpClient(appId: "reservation-service");
// var response = await client.PostAsJsonAsync("/reserve",data);
// var contentStream = await response.Content.ReadAsStreamAsync();
// var buffer = new byte[50];
// int bytesRead;
// while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
// {
// Console.WriteLine(bytesRead);
// Console.WriteLine(Encoding.UTF8.GetString(buffer,0,bytesRead));
// }
Console.WriteLine($"sku: {result.GetProperty("sku")} === new quantity: {result.GetProperty("quantity")}");
流式处理
var data = new { sku = item.ProductCode, quantity = item.Quantity };
// var result = await daprClient.InvokeMethodAsync<object, dynamic>(HttpMethod.Post, "reservation-service", "reserve", data);
var client = DaprClient.CreateInvokeHttpClient(appId: "reservation-service");
var response = await client.PostAsJsonAsync("/reserve",data);
var contentStream = await response.Content.ReadAsStreamAsync();
var buffer = new byte[50];
int bytesRead;
while ((bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
Console.WriteLine(bytesRead);
Console.WriteLine(Encoding.UTF8.GetString(buffer,0,bytesRead));
}
// Console.WriteLine($"sku: {result.GetProperty("sku")} === new quantity: {result.GetProperty("quantity")}");