.netcore grpc截止时间和取消详解
一、截止时间概述
- 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。
- 超过截止时间时,将取消调用。
- 设定一个截止时间非常重要,因为它将提供调用可运行的最长时间。
- 它能阻止异常运行的服务持续运行并耗尽服务器资源。
- 截止时间对于构建可靠应用非常有效,应该进行配置。
二、取消概述
- 客户端主动取消不再需要长期运行的调用
- 线程故障自动取消
- 超出截止时间触发取消操作
三、实战案例
- 首先准备一个grpc后端服务
- 其次准备一个webapi服务作为客户端,方便HttpContext传递
- 客户端工厂配置EnableCallContextPropagation 用于上下文传递截止时间
- 传递CancellationTokenSource
- 话不多说,通过代码可以更好的看出程序的运行轨迹
// 引入proto文件
// 公共messages.protosyntax = "proto3";option csharp_namespace = "GrpcProject";package grpc.serviceing;// 请求体
message ServerRequest{string name = 1;double height = 2;int32 age = 3;bool flag = 4;float x = 5;float y = 6;float z= 7;repeated string departments = 8;
}message ServerFileRequest{bytes fileBytes = 1;
}// 响应体
message ServerResponse{bool result = 1;
}// 服务dollar.proto文件syntax = "proto3";import "google/protobuf/empty.proto";
import "Protos/messages.proto";option csharp_namespace = "GrpcProject";package grpc.serviceing;service DollarRpc{rpc ServerOne (ServerRequest) returns (ServerResponse);rpc ServerTwo (ServerRequest) returns (google.protobuf.Empty);
}
服务端接口实现:
public class DollarService : DollarRpc.DollarRpcBase{public override async Task<ServerResponse> ServerOne(ServerRequest request, ServerCallContext context){await Console.Out.WriteLineAsync("-------------------------ServerOne------------------------------\r\n");await Task.Delay(TimeSpan.FromSeconds(8), context.CancellationToken);foreach (var prop in request.GetType().GetProperties()){await Console.Out.WriteLineAsync($"property name:{prop.Name};value:{prop.GetValue(request)}");}return GetResponse();}public override async Task<Empty> ServerTwo(ServerRequest request, ServerCallContext context){await Console.Out.WriteLineAsync("-------------------------ServerTwo------------------------------\r\n");await Task.Delay(TimeSpan.FromSeconds(8), context.CancellationToken);foreach (var prop in request.GetType().GetProperties()){await Console.Out.WriteLineAsync($"property name:{prop.Name};value:{prop.GetValue(request)}");}return new();}private ServerResponse GetResponse() => new() { Result = true };}
客户端实现重点:
- program注入客户端工厂并启用截止时间配置
- 增加拦截器统一设定超时时间
- 调用查看结果
// program.csbuilder.Services.AddGrpcClient<DollarRpc.DollarRpcClient>(options =>
{options.Address = new Uri("https://localhost:7188");
}).EnableCallContextPropagation();
//拦截器过滤截止时间[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]public class GrpcFilterAttribute : Attribute, IActionFilter{public void OnActionExecuted(ActionExecutedContext context){}public void OnActionExecuting(ActionExecutingContext context){CancellationTokenSource tokenSource = new();GrpcServerCallContextFeature callContext = new(DateTime.UtcNow.AddSeconds(5), tokenSource.Token);context.HttpContext.Features.Set<IServerCallContextFeature>(callContext);}}public class GrpcServerCallContextFeature : ServerCallContext, IServerCallContextFeature{/// <summary>/// 构造/// </summary>/// <param name="deadline"></param>/// <param name="cancellationToken"></param>public GrpcServerCallContextFeature(DateTime deadline, CancellationToken cancellationToken){DeadlineCore = deadline;CancellationTokenCore = cancellationToken;AuthContextCore = new AuthContext(null, new Dictionary<string, List<AuthProperty>>());}public ServerCallContext ServerCallContext => this;protected override string MethodCore { get; }protected override string HostCore { get; }protected override string PeerCore { get; }protected override DateTime DeadlineCore { get; }protected override Metadata RequestHeadersCore { get; }protected override CancellationToken CancellationTokenCore { get; }protected override Metadata ResponseTrailersCore { get; }protected override Status StatusCore { get; set; }protected override WriteOptions? WriteOptionsCore { get; set; }protected override AuthContext AuthContextCore { get; }protected override ContextPropagationToken CreatePropagationTokenCore(ContextPropagationOptions? options){return base.CreatePropagationToken(options);}protected override Task WriteResponseHeadersAsyncCore(Metadata responseHeaders){throw new NotImplementedException();}}
//调用
// 在相应的类上打上标记 [GrpcFilter][Route("api/[controller]")][ApiController][GrpcFilter] // 设定截止时间过滤public class GrpcTestController : ControllerBase{private readonly DollarRpc.DollarRpcClient _dollarRpcClient;public GrpcTestController(DollarRpc.DollarRpcClient dollarRpcClient) => _dollarRpcClient = dollarRpcClient;[HttpGet("one")]public async Task<string> GetOneResult(){ServerRequest request = new ServerRequest(){Departments = {"one","two","three","four","five"},Age = 10,Flag = true,Height = 10,Name = "zhangsan",X = 10F,Y = 11F,Z = 12F};try{var response = await _dollarRpcClient.ServerOneAsync(request);if (response.Result){return "Success";}return "Fail";}catch (RpcException ex) when (ex.StatusCode == Grpc.Core.StatusCode.DeadlineExceeded){return "dealine timeout.";}catch (RpcException ex){return ($"NoResult:{ex.Message}");}}[HttpGet("two")]public async Task<string> GetTwoResult(){ServerRequest request = new ServerRequest(){Departments = {"one","two","three","four","five"},Age = 10,Flag = true,Height = 10,Name = "zhangsan",X = 10F,Y = 11F,Z = 12F};try{var response = await _dollarRpcClient.ServerTwoAsync(request);return "Success";}catch (RpcException ex) when (ex.StatusCode == Grpc.Core.StatusCode.DeadlineExceeded){return "dealine timeout.";}catch (RpcException ex){return ($"NoResult:{ex.Message}");}}}
四、查看执行结果
服务端One:

客户端One:

swagger:

另一个Two效果类似。同时服务端任务取消错误,也在截图上有显示。
五、源码地址
链接:https://pan.baidu.com/s/1vleChFc3F6ILs-5ad8xQCA
提取码:mud0
相关文章:
.netcore grpc截止时间和取消详解
一、截止时间概述 截止时间功能让 gRPC 客户端可以指定等待调用完成的时间。 超过截止时间时,将取消调用。 设定一个截止时间非常重要,因为它将提供调用可运行的最长时间。它能阻止异常运行的服务持续运行并耗尽服务器资源。截止时间对于构建可靠应用非…...
React组件间数据传递(弹框和高阶组件(HOC)特性实现)
前言 在现代前端开发中,React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中,不同组件之间的数据传递问题显得尤为关键。在本文中,我们将探讨一种高效的方法,即如何利用弹框和高阶组件特性来实现 React 组件间的数据…...
只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析
青岛理工大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字,预计阅读:3分钟 2023考情概况 青岛理工…...
SpringMVC之异常处理器
文章目录 前言一、基于配置的异常处理二、基于注解的异常处理总结 前言 SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver。 HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver&#x…...
【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)
👻内容专栏: 《数据结构与算法篇》 🐨本文概括: 利用数据结构栈(Stack)来模拟递归,实现快排的非递归版本;递归版本测试OJ题时,有大量重复元素样例不能通过,导致性能下降࿰…...
docker network
docker network create <network>docker network connect <network> <container>docker network inspect <network>使用这个地址作为host即可 TODO:添加docker-compose...
回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测
回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…...
新亮点!安防视频监控/视频集中存储/云存储平台EasyCVR平台六分屏功能展示
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
深入解析SNMP协议及其在网络设备管理中的应用
SNMP(Simple Network Management Protocol,简单网络管理协议)作为一种用于网络设备管理的协议,在实现网络设备的监控、配置和故障排除方面发挥着重要的作用。本文将深入解析SNMP协议的工作原理、重要概念和功能,并探讨…...
【SA8295P 源码分析】86 - AIS Camera Device 设备初始化 之 AisProcChainManager 模块初始化源码分析
【SA8295P 源码分析】86 - AIS Camera Device 设备初始化 之 AisProcChainManager 模块初始化源码分析 一、AisProcChainManager::CreateInstance()二、AisPProcIsp::Create()三、AisPProcGpu::Create()系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接…...
十五、pikachu之CSRF
文章目录 一、CSRF概述二、CSRF实战2.1 CSRF(get)2.2 CSRF之token 一、CSRF概述 Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击…...
C语言网络编程:实现自己的高性能网络框架
一般生产环境中最耗时的其实是业务逻辑处理。所以,是不是可以将处理业务逻辑的代码给拆出来丢到线程池中去执行。 比如像下面这样: 我们事先创建好一堆worker线程,主线程accepter拿到一个连接上来的套接字,就从线程池中取出一个…...
hive表向es集群同步数据20230830
背景:实际开发中遇到一个需求,就是需要将hive表中的数据同步到es集群中,之前没有做过,查看一些帖子,发现有一种方案挺不错的,记录一下。 我的电脑环境如下 软件名称版本Hadoop3.3.0hive3.1.3jdk1.8Elasti…...
五、Kafka消费者
目录 5.1 Kafka的消费方式5.2 Kafka 消费者工作流程1、总体流程2、消费者组原理3、消费者组初始化流程4、消费者组详细消费流程 5.3 消费者API1 独立消费者案例(订阅主题)2 独立消费者案例(订阅分区)3 消费者组案例 5.4 生产经验—…...
类 中下的一些碎片知识点
判断下面两个函数是否能同时存在 void Print(); void Pirnt() const 答:能同时存在,因为构成函数重载(注意函数的返回值不同是不能构成函数重载的)。 const 对象能调用 非const 成员函数吗 答:不能,因为权…...
JVM第二篇 类加载子系统
JVM主要包含两个模块,类加载子系统和执行引擎,本篇博客将类加载子系统做一下梳理总结。 目录 1. 类加载子系统功能 2. 类加载子系统执行过程 2.1 加载 2.2 链接 2.3 初始化 3. 类加载器分类 3.1 引导类加载器 3.2 自定义加载器 3.2.1 自定义加载器实…...
火爆全网!HubSpot CRM全面集成,引爆营销业绩!
HubSpot CRM是什么?它是一款强大的客户关系管理工具,专为企业优化销售、服务和市场营销流程而设计。它在B2B行业中扮演着极为重要的角色,让我来告诉你为什么吧! HubSpot CRM不仅拥有用户友好的界面和强大的功能,还能够…...
远程调试环境
一、远程调试 1.安装vscode 2.打开vscode,下载插件Remote-SSH,用于远程连接 3.安装php debug 4.远程连接,连接到远端服务器 注:连接远程成功后,在远程依然要进行安装xdebug,刚才只是在vscode中进行的安装。 5.配置la…...
Java面试之用两个栈实现队列
文章目录 题目一、什么是队列和栈?1.1队列1.2栈 二、具体实现2.1 思路分析2.2代码实现 题目 用两个栈实现一个队列,实现在队列尾部插入节点和在队列头部删除节点的功能。 一、什么是队列和栈? 1.1队列 队列是一种特殊的线性表,…...
Python-实用的文件管理及操作
本章,来说说,个人写代码过程中,对于文件管理常用的几种操作。 三个维度 1、指定文件的路径拼接2、检查某文件是否存在3、配置文件的路径管理 1、指定文件的路径拼接 这个操作可以用来管理文件路径也就是上述中的第三点。但是,这里…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
