大家好,关于基于 gRPC 和 .NET Core 的服务器流-.net core backgroundservice很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
[[415137]]
https://chandankkrr.medium.com/mapping-location-data-with-mapbox-9b256f64d569
什么是 gRPC
gRPC 是一种现代开源、高性能RPC 框架,可以在任何环境中运行。它有效地连接数据中心内部和数据中心之间的服务,并为负载平衡、跟踪、运行状况检查和身份验证提供可插入的支持。 gRPC 最初由Google 创建,十多年来,该公司一直使用名为Stubby 的单一通用RPC 基础设施来连接其数据中心内和数据中心之间运行的大量微服务。 2015 年3 月,Google 决定构建Stubby 的下一个版本并将其开源。结果就是现在gRPC,被许多企业或组织使用。
https://grpc.io/
gRPC 服务器流
服务器流式RPC,客户端向服务器发送请求并获取流来读取一系列消息。客户端从返回的流中读取信息,直到没有更多消息为止。 gRPC 保证单个RPC 调用中的信息是有序的。
rpc GetLocationData (GetLocationRequest) 返回(stream GetLocationResponse);
协议缓冲区(Protobuf)
gRPC 使用协议缓冲区作为接口定义语言(IDL) 来定义客户端和服务器之间的合同。在下面的proto 文件中,定义了一个RPC 方法GetLocations,该方法接收GetLocationsRequest 消息类型并返回GetLocationsResponse 消息类型。响应消息类型前面的stream关键字表示响应是流类型,而不是单个响应。
stytax='proto3'; optioncsharp_namespace='gprcstreaming'; packagelocation_data; serviceLocationdata {rpcgetLocations(getLocationsReques requesReques) int32longitudee7=2;} 33 360
创建 gRPC 服务
在ASP.NETCorehttps://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-5.0tabs=visual-studio-code中创建agRPC客户端和服务器
添加proto 文件并生成gRPC 服务资源文件后,接下来我添加了LocationService 类。在下面的代码片段中,我有一个LocationService 类,它继承了从Location.proto 文件生成的LocationDataBase 类型。客户端可以通过Startup.cs文件中的Configure方法中的endpoints.MapGrpcService()来访问LocationService。当服务器收到GetLocations请求时,首先通过GetLocationData方法调用读取Data文件夹(不包含在源代码存储库中)中的LocationHistory.json文件中的所有数据。该方法返回RootLocation类型,其中包含List类型的Location属性。 Location 类由两个内部属性Longitude 和Latitude 组成。接下来,我循环遍历每个位置并将它们写入返回客户端的响应流中。服务器将消息写入流,最多达到客户端在GetLocationRequest 对象中指定的dataLimit。
usingSystem.Threading.Tasks;usingGrpc.Core;usingMicrosoft.Extensions.Logging;usingSystem.IO;usingSystem;usingSystem.Linq;namespaceGPRCStreaming{publicclassLocationService:LocationData.LocationDataBase{privatereadonlyFileReader_fileReader;privatereadonlyILogger_logger;publicLocationService(FileReaderfileReader,ILoggerlogger){_fileReader=fileReader ;_logger=logger ;}publicoverrideasyncTaskGetLocations(GetLocationsRequestrequest,IServerStreamWriterresponseStream,ServerCallContextcontext){try{_logger.LogInformation('IncomingrequestforGetLocationData');varlocationData=awaitGetLocationData();varlocationDataCount=locationData.Locations.Count;vardataLimit=request.DataLimitlocationDataCount?locationDataCount:request .DataLimit;for(vari=0;i=dataLimit-1;i++){varitem=locationData.Locations[i];awaitresponseStream.WriteAsync(newGetLocationsResponse{LatitudeE7=item.LatitudeE7,LongitudeE7=item.LongitudeE7});}}catch(ExceptionException){_logger.LogError (异常,'发生错误');抛出;}}privateasyncTaskGetLocationData(){varcurrentDirectory=Directory.GetCurrentDirectory();varfilePath=$'{currentDirectory}/Data/Location_History.json';varlocationData=await_fileReader.ReadAllLinesAsync(filePath);returnlocationData; }}}
现在,让我们运行该服务并发送请求。我将使用一个名为grpcurl 的命令行工具,它允许您与gRPC 服务器交互。它基本上是gRPC 服务器的curl。
https://github.com/fullstorydev/grpcurl 仅当启用gRPC 反射服务时,才可以通过grpcurl 与gRPC 端点进行交互。这允许查询服务以发现服务器上的gRPC 服务。扩展方法MapGrpcReflectionService需要引入Microsoft.AspNetCore.Builder的命名空间:
publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseEndpoints(endpoints={endpoints.MapGrpcService();if(env.IsDevelopment()){endpoints.MapGrpcReflectionService();}endpoints.MapGet('/',asynccontext={awaitcontext.Response .WriteAsync('与gRPC端点的通信必须通过agRPCclient进行。了解如何创建客户端,访问:https://go.microsoft.com/fwlink/?linkid=2086909');});});}
grpcurl-plaintext-d'{'dataLimit':'100000'}'localhost:80location_data.LocationData/GetLocations 一旦服务器收到请求,它就会读取文件,然后循环遍历位置列表,直到达到dataLimit 计数并获取位置数据返回给客户端。
接下来,我们创建一个Blazor 客户端来调用gRPC 服务。我们可以使用IServiceCollection 接口上的AddGrpcClient 扩展方法来设置gRPC 客户端:
publicvoidConfigureServices(IServiceCollectionservices){services.AddRazorPages();services.AddServerSideBlazor();services.AddSingleton();services.AddGrpcClient(client={client.Address=newUri('http://localhost:80');});}
我使用Virtualize Blazor 组件来渲染这些位置。 Virtualize 组件不会一次渲染列表中的每个项目,只会渲染当前可见的项目。
ASP.NETCoreBlazorcomponentvirtualizationhttps://docs.microsoft.com/en-us/aspnet/core/blazor/components/virtualization?view=aspnetcore-5.0
相关代码:
@page'/locationdata'@usingGrpc.Core@usingGPRCStreaming@usingthirdmillion.Data@usingSystem.Diagnostics@usingMicrosoft.AspNetCore.Components.Web.Virtualization@injectIJSRuntimeJSRuntime;@injectSystem.Net.Http.IHttpClientFactory_clientFactory@injectGPRCStreaming.LocationData.LocationDataClient_locationDataClienttableclass='表操作''data-input'for'dataLimit'Noofrecordstofetch'dataLimit'type='number'@bind='_dataLimit'/'FetchData'class='btn-submit'CallgRPC'info'Totalrecords:'count'@_locations.Count
'info'Timetaken:'time'@_stopWatch.ElapsedMilliseconds毫秒
表'tableFixHead'tableclass='表'LongitudeLatitude'@_locations'Context='locations'@locations.LongitudeE7@locations.LatitudeE7table@code{privateint_dataLimit=1000;privateList_locations=newList();privateStopwatch_stopWatch=newStopwatch();protectedoverrideasyncTaskOnInitializedAsync(){ waitFetchData();}privateasyncTaskFetchData(){ResetState();_stopWatch.Start();using(varcall=_locationDataClient.GetLocations(newGetLocationsRequest{DataLimit=_dataLimit})){awaitforeach(varresponseincall.ResponseStream.ReadAllAsync()){_locations.Add (newLocation{LongitudeE7=response.LongitudeE7,LatitudeE7=response.LatitudeE7});StateHasChanged();}}_stopWatch.Stop();}privatevoidResetState(){_locations.Clear();_stopWatch.Reset();StateHasChanged(); }}
在本地运行流调用时,大约需要8 秒才能从gRPC 服务器接收2,876,679 个单独响应。我们也将数据加载到Mapbox 中:
@page'/mapbox'@usingGrpc.Core@usingGPRCStreaming@usingSystem.Diagnostics@injectIJSRuntimeJSRuntime;@injectSystem.Net.Http.IHttpClientFactory_clientFactory@injectGPRCStreaming.LocationData.LocationDataClientLocationDataClienttableclass='tableAction''数据输入'for'dataLimit'Noofrecordstofetch'dataLimit' type='number'@bind='_dataLimit'/'LoadMap'class='btn-submit'Loaddata'info'Totalrecords:'count'@_locations.Count
'info'Timetaken:'time'@_stopWatch.ElapsedMilliseconds毫秒
表'map'style='width:100%;height:90vh;'@code{privateint_dataLimit=100;privateList_locations=newList();privateStopwatch_stopWatch=newStopwatch();protectedoverrideasyncTaskOnAfterRenderAsync(boolfirstRender){if(!firstRender){return;}awaitJSRuntime.Invo keVoidAsync ( 'mapBoxFunctions.initMapBox');}privateasyncTaskLoadMap(){ResetState();_stopWatch.Start();using(varcall=LocationDataClient.GetLocations(newGetLocationsRequest{DataLimit=_dataLimit})){awaitforeach(varresponseincall.ResponseStream.ReadAllAsync()) { varpow=Math.Pow(10,7);varlongitude=response.LongitudeE7/pow;varlatitude=response.LatitudeE7/pow;_locations.Add(new{type='特征',geometry=new{type='点',坐标=newdouble[]{经度,纬度}}});StateHasChanged();}_stopWatch.Stop();awaitJSRuntime.Inv
okeVoidAsync("mapBoxFunctions.addClusterData", _locations); } } private void ResetState() { JSRuntime.InvokeVoidAsync("mapBoxFunctions.clearClusterData"); _locations.Clear(); _stopWatch.Reset(); StateHasChanged(); } } 源代码在我的 GitHub 上 : https://github.com/Chandankkrr/threemillion文章分享结束,基于 gRPC 和 .NET Core 的服务器流-.net core backgroundservice和的答案你都知道了吗?欢迎再次光临本站哦!
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7345.html
用户评论
这听起来是一个超酷的技术!一直想学习下 gRPC
有5位网友表示赞同!
用 .NET Core 做服务端流,效率应该很高吧?
有14位网友表示赞同!
背景任务(background service),是不是很适合实时更新应用状态?
有20位网友表示赞同!
这种技术有没有什么开源实现案例可以参考一下?
有8位网友表示赞同!
.NET Core 的性能一直不错,加上了 gRPC,更棒了!
有12位网友表示赞同!
服务端流感觉应用场景很多啊,像直播とか实时聊天都合适吧?
有14位网友表示赞同!
想问问这方面有什么相关的书籍或视频教程推荐吗?
有15位网友表示赞同!
这个技术点太有意思了,有机会要学习一下!
有9位网友表示赞同!
.NET 和 gRPC 的组合感觉很有潜力,未来会越来越流行?
有17位网友表示赞同!
后台任务的实现应该比较复杂吧?
有16位网友表示赞同!
实时的数据传输用这种方式更加高效吗?比传统的HTTP API好?
有5位网友表示赞同!
请问这种技术对服务器资源的要求高吗?
有14位网友表示赞同!
学完之后 bisa做什么工作呢?想看看这个技术的应用场景。
有19位网友表示赞同!
gRPC 的开发文档是不是比较难懂啊?新手可能会觉得有点困难?
有9位网友表示赞同!
.NET Core 不太熟悉,这个技术还需要学习很久吗?
有20位网友表示赞同!
在什么情况下需要使用服务端流呢?感觉不太了解它的应用场景。
有17位网友表示赞同!
想知道这个技术和传统长轮询机制相比有什么优势?
有17位网友表示赞同!
.NET Core 后台任务的效率怎么样?
有20位网友表示赞同!
这种技术对网络状况敏感吗?高延迟网络会影响性能吗?
有8位网友表示赞同!
服务端流的安全性如何保证?有针对性的防护措施吗?
有20位网友表示赞同!