中國十大品牌網(wǎng)官網(wǎng)seo工具下載
一、截止時間概述
- 截止時間功能讓 gRPC 客戶端可以指定等待調(diào)用完成的時間。
- ?超過截止時間時,將取消調(diào)用。
- ?設(shè)定一個截止時間非常重要,因為它將提供調(diào)用可運行的最長時間。
- 它能阻止異常運行的服務(wù)持續(xù)運行并耗盡服務(wù)器資源。
- 截止時間對于構(gòu)建可靠應(yīng)用非常有效,應(yīng)該進行配置。
二、取消概述
- 客戶端主動取消不再需要長期運行的調(diào)用
- 線程故障自動取消
- 超出截止時間觸發(fā)取消操作
三、實戰(zhàn)案例
- 首先準備一個grpc后端服務(wù)
- 其次準備一個webapi服務(wù)作為客戶端,方便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;
}// 響應(yīng)體
message ServerResponse{bool result = 1;
}// 服務(wù)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);
}
服務(wù)端接口實現(xiàn):
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 };}
客戶端實現(xiàn)重點:
- program注入客戶端工廠并啟用截止時間配置
- 增加攔截器統(tǒng)一設(shè)定超時時間
- 調(diào)用查看結(jié)果
// 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>/// 構(gòu)造/// </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();}}
//調(diào)用
// 在相應(yīng)的類上打上標記 [GrpcFilter][Route("api/[controller]")][ApiController][GrpcFilter] // 設(shè)定截止時間過濾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}");}}}
四、查看執(zhí)行結(jié)果
服務(wù)端One:
客戶端One:
?
?swagger:
?另一個Two效果類似。同時服務(wù)端任務(wù)取消錯誤,也在截圖上有顯示。
五、源碼地址
鏈接:https://pan.baidu.com/s/1vleChFc3F6ILs-5ad8xQCA?
提取碼:mud0