首页 > 其他分享 >.NET使用Graphql的演示

.NET使用Graphql的演示

时间:2024-10-17 12:42:53浏览次数:1  
标签:订阅 演示 查询 Graphql var graphql NET 推送 客户端

Graphql是什么?先来一段AI给的回答: GraphQL是一种为API设计的查询语言,与REST相比,它提供了更高效、强大和灵活的方法来与数据交互。GraphQL由Facebook于2012年开发,并于2015年开源。其主要的优势在于能够允许客户端精确地指定他们需要的数据,从而避免了过度获取或数据不足的问题。 主要特性

  1. 精确获取需要的数据:
  1. 单一端点:
  1. 类型系统:
  1. 查询与修改:
  1. 实时数据(Subscription):
优势和局限 优势:
  • 减少数据传输:只返回客户端请求的数据。
  • 减少请求数:多个数据需求可以在单一查询中解决。
  • 灵活性高:客户端可以自由构造查询,无需服务器频繁更新API。
局限:
  • 复杂查询性能问题:如果不加限制地进行深度查询或大规模的数据嵌套,可能会对服务器性能造成影响。
  • 缓存策略:相比于REST的URL级别缓存,GraphQL需要更复杂的缓存策略来优化性能。
  • 学习曲线:对于开发者来说,需要学习新的查询语法及其底层实现。
  其他内容就不过多介绍了,大家感兴趣可以自行去搜索有关理论或说明。接下来我直接提供实战入门演示。   以下开始正式演示正文: 先创建一个webapi项目作为服务端和一个控制台项目作为客户端,用来测试使用。以及对应的引用包,如下图所示: 0   新建Quries文件夹,用来存放查询使用的类和方法。以及新增一个测试用的类和string类型返回值的方法 Hello()   0 在启动项或Program里面,添加Graphql服务,并添加Query的类型注册:   0   最后还要记得映射端点: 0 然后运行程序,例如我默认运行起来端口是5264,则打开url(根据自己情况更改url地址):http://localhost:5264/graphql/ 然后输入查询语句:query:{hello}就可以查出对应的返回内容。 0 客户端里面,创建graphql的客户端请求,并输入查询的方法为hello的query语句,以及输出的结果,如下图所示。结果和上面的一样,只是我只输出data里面的数据,data里面的数据就是我们需要的结果。 0   接着做个拓展演示,创建一个嵌套实体类,用来模拟多种情况: 0   创建一个测试使用的服务,模拟具体查询业务使用。 0   注册服务和接口以后,运行程序,并在graphql里面进行运行测试。当前测试的是输出所有字段。 0   现在,例如我把子集合去掉不要,那查询出来也就不会带有子集合的任何内容: 0   或者只需要指定的其他字段,删掉了描述、子集合的城市字段: 0   同样的,把查询语句丢到客户端程序里面进行查询,也可以查出指定字段的内容: 0   上面演示的是查询效果,也可以做增删改等其他操作。 在测试服务类新增一个业务操作,模拟接收到参数以后进行了业务操作,最终返回一个代表成功的数据。例如: 0   新建一个Mutations文件夹,用来存放增删改操作的类等。例如此处的测试使用的TestMutation.然后创建一个模拟传入参数进行操作的方法,该方法返回上面服务类里面的测试方法。 0   需要添加对修改有关操作的注册: 0   然后启动,做个测试。使用mutation语句进行操作,操作指定方法,方法里面指定参数和字段数据。可以看到服务端进入了前面预设的业务方法内,并且返回的true被客户端成功接收。 0   在控制台客户端,也执行一下mutation操作,也能够成功调用: 0   以上是查询和修改操作的例子,graphql还可以做数据推送和订阅,用于实现websocket的效果。 新建一个subscriptions文件夹,用来存放所有的消息推送和订阅有关的定义类。例如TestSub,里面定义了一个推送方法OnTestPublish 0   在前面的测试服务里面,新增ITopicEventSender事件接口的注入,以及新增一个方法,用来触发推送功能。并且推送的主题,使用刚才定义的OnTestPublish 0   然后需要提供对推送服务的注册,以及持久化选择。 0 使用默认的持久化,该持久化选择不建议上生产。具体原因,我去AI一下:
  1. 可扩展性问题:AddInMemorySubscriptions 存储订阅信息是在内存中进行的。这意味着订阅数据仅存在于单个进程中。如果你的应用程序需要在多个服务器实例之间进行扩展,每个实例的内存中都会有独立的订阅状态,从而导致状态不一致。因此,在大型应用或高负载环境中,这种方法不能很好地扩展。
  2. 持久性缺失:使用内存存储的另一个主要问题是数据的持久性。服务器重启或发生故障时,所有在内存中的订阅数据将丢失。这对于生产环境来说是不可接受的,因为需要保证服务的稳定性和数据的持久性。
  3. 资源使用效率:随着订阅数量的增加,内存的使用量也会随之上升。在内存资源有限的环境中,这可能会影响应用程序的整体性能和响应速度。
  4. 故障恢复:在内存中的订阅管理缺乏有效的故障恢复机制。如果系统崩溃或需要进行维护,恢复订阅状态将非常困难,可能需要从客户端重新建立订阅。
为了解决这些问题,生产环境中通常建议使用持久化和可扩展的订阅存储方案,比如基于 Redis 的 AddRedisSubscriptions 方法。大佬们感兴趣可以自己去拓展下。   现在缺少一个触发条件,由于咱们创建的是webapi项目,自带控制器,那我把控制器做个改造,通过swagger来调用进行触发数据推送,直接在请求里面,调用推送方法: 0   最后,由于推送使用了websocket,所以也需要添加对websocket的注册: 0   然后启动程序,使用subscription进行订阅onTestPublish主题消息。运行以后,会一直监听,除非我们取消监听。 0   打开swagger,直接调用并测试,可以看到面板接收到了测试推送的数据。 0   客户端要实现订阅,需要做一些改动。订阅的事件是字符串类型,所以需要创建一个字符串类型的属性,用来接收数据: 0   然后客户端创建时候,需要使用websocket端点。然后再创建订阅语句 0   接下来是订阅的具体实现演示: 0   允许,并通过swagger调用两次测试,都可以被监听到。 0   同时,之前打开的graphql演示面板,也可以看到能够收到后续消息,说明支持多客户端接收,符合websocket的推送效果。 0   有关实现的核心代码。服务端注册有关:
 // 添加GraphQL服务
 builder.Services
     .AddGraphQLServer()
     .AddQueryType<TestQuery>()
     .AddMutationType<TestMutation>()
     .AddSubscriptionType<TestSub>()
     .AddInMemorySubscriptions(); // 默认消息持久化(生产情况建议更换)

 var app = builder.Build();

 app.UseWebSockets();

 // 映射GraphQL端点
 app.MapGraphQL();

 

  客户端实现:
 var option = new GraphQLHttpClientOptions
 {
     EndPoint = new Uri("http://localhost:5264/graphql"),
     // 设置 WebSocket 端点以支持订阅
     WebSocketEndPoint = new Uri("ws://localhost:5264/graphql")
 };

 using var client = new GraphQLHttpClient(/*"http://localhost:5264/graphql"*/ option , new NewtonsoftJsonSerializer());
 //            var request = new GraphQLRequest
 //            {
 //                Query = @"mutation{
 //  otherOperation(info:{address:""龙岗区宝龙街道"",city:""大大大深圳"",phone:""10100011""})
 //}"
 //            };

 //            var response = await client.SendQueryAsync<object>(request);
 //            Console.WriteLine(response.Data);

 // 定义订阅请求
 var subscriptionRequest = new GraphQLRequest
 {
     Query = @"
     subscription {
         onTestPublish
     }"
 };

 // 创建订阅流
 var subscriptionStream = client.CreateSubscriptionStream<OnTestPublishResponse>(subscriptionRequest);

 // 订阅消息流
 var subscription = subscriptionStream.Subscribe(
     response =>
     {
         if (response.Errors != null)
         {
             Console.WriteLine("Error occurred: " + response.Errors);
         }
         else
         {
             Console.WriteLine($"Received message: {response.Data.OnTestPublish}");
         }
     },
     error => Console.WriteLine($"Subscription error: {error.Message}"),
     () => Console.WriteLine("Subscription completed."));

 // 模拟其他逻辑(例如,在某个时刻取消订阅,这儿通过输入任意按键触发取消和释放)
 Console.WriteLine("Press any key to exit...");
 Console.ReadKey();

 // 取消订阅并关闭 WebSocket 连接
 subscription.Dispose();
 client.Dispose();

 

 如果需要我本地演示的代码项目,可以在本人公众号【Dotnet Dancer】回复: 代码演示  即可获取开源项目地址。如果需要其他咨询或合作,可V:WeskyNet001

 

如果以上内容对你有帮助,欢迎大佬们点赞、关注公众号或转发。谢谢大家!

 

 

标签:订阅,演示,查询,Graphql,var,graphql,NET,推送,客户端
From: https://www.cnblogs.com/weskynet/p/18471829

相关文章

  • 【大画丹青】——AI电商主图,controlnet
    浅试一下电商图,效果还行,能加一些电商lora模型就更好了第一步:抠图,这个很简单,PS2024都可以直接抠主体或者去除背景了第二步:文生图,这个CN我选的控制轮廓,效果质量不错,只用了主模型【maji写实】,加lora会更稳定一些,效果更好。第三步:叠图,把原商品图叠上去,局部重绘背景(主要为了......
  • DTL698电表数据 转 profinet IO协议项目案例
    目录1 案例说明 12 VFBOX网关工作原理 13 准备工作 24 配置VFBOX网关 25 用PROFINETIO协议转发数据 46 其他说明 67 案例总结 71 案例说明设置网关采集DLT698电表数据数据把采集的数据转成profinetIO协议转发给其他系统。2 VFBOX网关工作原理VFBOX网关是协议转换......
  • .NET 7+Vue 3 开源仓库管理系统 ModernWMS
    前言本系统的设计目标是帮助中小企业乃至大型企业实现仓库操作的自动化与数字化,从而提升工作效率,降低成本,并最终实现业务增长。项目采用 Vue3+TS+.NET7 等前沿框架进行开发,为企业提供一套现代化的仓库管理解决方案。项目介绍ModernWMS是一款开源的简易完整仓库管理系......
  • 移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程
     之前给大家介绍过使用使用.NETMAUI开发第一个安卓APP,今天给大家介绍如何打包成APK,然后安装到安卓手机正常运行。这里还是沿用之前搭建好的应用程序。首先确保项目可以正常运行,具体如下图: 一、修改AndroidManifest.xml配置APP基本信息权限首先设置AndroidManifest.......
  • asp.net core 跨域配置不起作用的原因
    1、中间件配置跨域的顺序不对中间件顺序配置对了基本上就能解决大部分问题中间件顺序配置对了基本上就能解决大部分问题附上官网简单的启用跨域的代码varMyAllowSpecificOrigins="_myAllowSpecificOrigins";varbuilder=WebApplication.CreateBuilder(args);build......
  • 从 net-tools 到 iproute2
    从net-tools到iproute2来源  https://www.jiatcool.com/?p=762 linux操作系统的一个突出优势就是其提供了稳定而强大的网络功能。linux通过内核对网络核心功能的运行进行管理。与此同时,在用户空间,linux也提供了相关工具包对内核层的网络参数进行修改和配置。根据对内......
  • 盘点.NET支持的 处理器架构
    在一个会议上,中国招投标协会的技术负责人居然当着很多领导的面说.NET不能在国产服务器上运行,可以说这个技术负责人非蠢即坏。国产服务器的处理器架构主要包括x86、ARM、LoongArch、risc-v。这些国产服务器处理器架构各有特点,ARM架构在自主可控和生态建设方面具有优势,x86架构则在现......
  • 【可答疑】基于51单片机的自动烘手器(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 【可答疑】基于51单片机的自动洗手器(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • 【可答疑】基于51单片机的智能水温控制系统(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......