Grpc MagicOnion库 之 客户端和服务端 (案例版)

之前通过自己写动态代理和用现成的动态代理库等实现过RPC功能,今天,就写一下如何直接引用GRPC的库来实现业务逻辑。

gRPC的介绍,之前我也说了这个g的含义太多,也包含谷歌的意思了。

可以看这个gRPC的文档介绍 : https://grpc.io/docs/what-is-grpc/

MagicOnion这个库用它是因为它内部使用了 MessagePack-CSharp 序列化方式,这种方式效果要比谷歌的protobuf 效果还要好,更重要的是在Net这个平台下来看的。

MagicOnion 是用于 .NET 平台的现代 RPC 框架,它提供双向实时通信(例如SignalR和Socket.io)以及 RPC 机制(例如 WCF 和基于 Web 的 API)。
该框架基于gRPC,它是一种用于 HTTP/2 的快速且紧凑的二进制网络传输。但是,与普通 gRPC 不同,它将 C# 接口视为协议模式,从而无需.proto(Protocol Buffers IDL)即可在 C# 项目之间实现无缝代码共享。

c99aa19e842fa4b9c8fac42337011d3f.png

接口是模式并提供 API 服务,就像普通的 C# 代码一样

f8293e9abe618a964d1391fd3873ca0e.png

其中 MagicOnion开源地址:https://github.com/Cysharp/MagicOnion

实现gRPC业务

我这边结构如下:

01a7971e2229267b9ecf82bfeca34ae6.png

客户端,服务端,以及共享接口,三部分组成。

主要引用的Nuget包为:

MagicOnion
MagicOnion.Server
MagicOnion.Client

接口定义

接口定义,是我直接拿之前做的demo的样子直接搞的。也方便。

IDemo.cs

public interface IDemo : IService<IDemo>
{UnaryResult<string> Say1(string msg);UnaryResult<int> Say2(string a, int b, List<string> c, Kind kind);UnaryResult<Kind> Say3(int b, List<string> c, Kind kind);   
}
public enum Kind
{a,b
}

用了这个服务才发现,它不能像我之前自己实现的那样,还能实现Viod返回类型和重载函数名等操作。

所以,它只能用于服务类的通讯,不能像函数那样用,另外 UnaryResult 返回类型是必须的,这是需要注意的。

服务端

我这边是直接新建了一个asp.net core web api,注释新增的部分,就是我新增的代码。

public static void Main(string[] args)
{var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbucklebuilder.Services.AddEndpointsApiExplorer();builder.Services.AddSwaggerGen();//新增//增加Grpcbuilder.Services.AddGrpc();builder.Services.AddMagicOnion();var app = builder.Build();//新增app.UseRouting();// Configure the HTTP request pipeline.if (app.Environment.IsDevelopment()){app.UseSwagger();app.UseSwaggerUI();}app.UseAuthorization();app.MapControllers();//新增app.UseEndpoints(endpoints =>{endpoints.MapMagicOnionService();endpoints.MapGet("/", async context =>{context.Response.ContentType = "text/plain; charset=utf-8"; await context.Response.WriteAsync("Grpc服务端已经创立,等待Grpc客户端连接!");});});app.Run();
}

Demo接口服务端实现

public class Demo : ServiceBase<IDemo>, IDemo
{public async UnaryResult<string> Say1(string msg){return msg;}public async UnaryResult<int> Say2(string a, int b, List<string> c, Kind kind){return b;}public async UnaryResult<Kind> Say3(int b, List<string> c, Kind kind){return kind;}
}

实现接口的同时也要继承eBase类,要不然,总有一些接口的方法未实现。

客户端

客户端就简单许多了

static async Task Main(string[] args)
{Console.Title = "GrpcDemo by 蓝创精英团队";var channel = GrpcChannel.ForAddress("https://localhost:5001");var demo = MagicOnionClient.Create<IDemo>(channel);Console.WriteLine(await demo.Say1("123"));Console.WriteLine(await demo.Say2("demo", 6, new List<string>() { "6" }, Kind.b));Console.WriteLine(await demo.Say3(1, new List<string>(), Kind.a));Console.WriteLine("不错,完成了任务!");Console.ReadLine();
}

效果

先运行服务端:

游览器打开地址 : https://localhost:5001/

就可以看到下面的内容,说明服务成功启动!

2b3f134bb1c0b948f1bdfbae59d7bb6d.png

然后,再运行客户端

结果如下:

8ee111ca69b70bb903de76228bba9e9f.png

用别人的库,确实方便许多。

总结

至此,RPC系列已经完结了,撒花,欧耶!

看着简单,搞着不知不觉已经夜深人静了,山中无岁月,世上已千年啊。

代码地址

https://github.com/kesshei/GrpcDemo.git

https://gitee.com/kesshei/GrpcDemo.git

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!

f135441527e76f86861844463ca4d3bf.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows11右下角出现评估副本水印如何去除?

Universal Watermark Disabler是一款十分好用的桌面工具&#xff0c;这款工具可以帮助用户轻松的去除Windows11 版本的操作系统右下角的水印。 使用方法 1、打开Universal Watermark Disabler软件&#xff0c;显示出当前系统的版本与水印状态。 2、Status中显示Ready for insta…

【GlobalMapper精品教程】001:GlobalMapper23+24 Pro-x64中文安装教程(附软件包下载)

Global Mapper 23是一款非常专业的地图绘制软件&#xff0c;功能非常的丰富&#xff0c;内置距离和面积计算&#xff0c;包括光栅混合、对比度调节、海拔高度查询、视线计算以及一些高级功能&#xff0c;可轻松实现图像校正、通过地表数据进行轮廓生成、通过地表数据观察分水岭…

JIL 编译与 AOT 编译

JIT&#xff1a;Just-in-time compilation&#xff0c;即时编译&#xff1b;AOT&#xff1a;Ahead-of-time compilation&#xff0c;事前编译。 JVM即时编译&#xff08;JIT&#xff09; 1. 动态编译与静态编译 动态编译&#xff08;dynamic compilation&#xff09;指的是“在…

中台基础指标列表

便于大家进行更方便的指标圈定&#xff0c;这里我将前面提到的通用指标进行一次拓展&#xff0c;为大家整理了一份完整的数据中台基础指标列表&#xff0c;方便大家在搭建指标体系时进行速查。 &#xff08;1&#xff09;App类产品分析指标 &#xff08;2&#xff09;网站类产…

期末作品检查

1、学期个人总结 在这个学期在杜老师的带领下学习了Python语言&#xff0c;这是一门相对于Java语言来说是比较简单的语言&#xff0c;用处也十分的广大。python是一种面向对象的解释型计算机程序设计语言&#xff0c;语法简洁清晰&#xff0c;目前已超越java成为最热门的编程语…

C# 通过不安全代码看内存加载

&#xff08;注&#xff1a;本篇用点长&#xff0c;有点绕&#xff0c;耐心浏览&#xff09;C#中类型分为值类型和引用类型&#xff0c;值类型存储在堆栈中&#xff0c;是栈结构&#xff0c;先进后出&#xff0c;引用类型存储在托管堆中。接下来用不安全代码的地址&#xff0c;…

[转]SDK与API区别

转载&#xff1a;https://www.zhihu.com/question/21691705/answer/149935191 SDK&#xff08;software development kit&#xff09;&#xff0c;中文可译为“软件开发工具包”。 一般都是一些被软件工程师用于为特定的软件包、软件架构、硬件平台、操作系统等建立应用软件的开…

详谈如何定制自己的博客园皮肤【转】

转自&#xff1a;http://www.cnblogs.com/jingmoxukong/p/7826982.html 目录 前言Quickstart定制博客园 CSS 的原理页面定制CSS代码博客侧边栏公告页首Html代码页脚Html代码定制细节独立控件小老鼠游戏动画动画时钟百度分享栏Github 角标签云背景动画动态标题文章内容样式定制带…

【ArcGIS微课1000例】0025:ArcGIS Online当前未连接到在线资源终极解决办法

ArcGIS Online在线资源列表: World Imagery: 底图服务: 中国地图彩色版: 打开ArcGIS时,系统托盘提示“ArcGIS Online当前未连接到在线资源”,如下图所示,如果无法连接到ArcGIS Online,则就无法添加在线资源,如World Imagery等。 关于该问题,网上有多种解决办法,然而…

华为笔记本Win11更新时由于驱动问题引起蓝牙鼠标经常断开问题解决方法

每次Win11升级后如果发现蓝牙鼠标经常断开&#xff0c;打开“华为电脑管家”执行以下操作即可&#xff1a; 然后更新蓝牙驱动 重启电脑OK。

【ArcGIS微课1000例】0026:ArcGIS10如何自定义工具条?

ArcGIS中,可以创建用户工具条,将自己常用的工具命令放到一起,方便实用提高工作效率。本文讲解如何自定义工具条并添加与删除工具。 1. 创建工具条 点击【自定义】菜单→【自定义模式】,如下图所示: 或者在任一工具条上点击最后面的下拉三角形→自定义: 以上两种方法都可…

基于 KubeSphere 流水线的 GitOps 最佳实践

背景Kubesphere 3.3.0 集成了 ArgoCD&#xff0c;但与笔者目前使用的 K8S 版本不兼容。再者&#xff0c;目前 Kubesphere 中持续集成和流水线打通还是不太友好&#xff0c;也缺少文档说明&#xff08;可能是笔者没有找到&#xff09;。目前遇到最主要的问题就是流水线制作完成的…

【ArcGIS微课1000例】0027:ArcGIS属性表(dbf)转Excel的4中方法

ArcGIS中的矢量数据Shapefile属性表存放在后缀名为.dbf的文件中,它是GIS数据分析的核心,如果将属性表转为别的平台使用,一般需要将其转为Excel格式。本文以ArcGIS自带矢量数据continent为例,讲解dbf转excel的常见4种方法。 文章目录 1. 表转Excel工具2. 直接打开3. 导出属性…

微信公众号自定义菜单直接跳转到小程序指定页面

首页我们要先拿到需要的小程序的页面地址&#xff1a;&#xff08;如何拿到小程序页面地址自行百度&#xff09; 然后登录公众号后台&#xff0c;添加自定义菜单&#xff1a; 菜单的路径选择“跳转小程序” &#xff0c;从绑定的小程序中选择要跳转的小程序&#xff0c;默认小程…

javascript高级程序设计 学习笔记 第五章 上

第五章引用类型的值(对象)是引用类型的一个实例。在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管 ECMAScript 从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构。引用…

HTTP协议之Expect爬坑

前言今天&#xff0c;在对接一个第三方平台开放接口时遇到一个很棘手的问题&#xff0c;根据接口文档组装好报文&#xff0c;使用HttpClient发起POST请求时一直超时&#xff0c;对方服务器一直不给任何响应。发起请求的代码如下&#xff1a;using (var httpClient new HttpCli…

【ArcGIS微课1000例】0028:ArcGIS根据属性快速分割生成多个shp文件

ArcGIS10.5及以上的版本提供了按属性分割工具,(分析工具->提取->按属性分割)工具。也可以使用10.2版本的分割工具,效果应该是一样的。本文演示使用分割工具批量快速提取一个县范围内的多个镇,生成多个镇矢量shp数据。 扩展阅读:【ArcGIS遇上Python】ArcGIS Python按…

Win11 恢复 Win10经典右键菜单 亲测有效

管理员运行命令&#xff1a; reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 重…

【ArcGIS微课1000例】0029:ArcGIS绘制平行线(构造平行公路)

在实际工作中,有时需要绘制平行线,比如道路两边的边界线,可以使用“平行复制”功能快速绘制平行线,本文介绍如何使用“平行复制”功能快速绘制平行线。 1. 加载公路矢量 加载配套实验数据包中的数据0029.rar中的矢量数据:公路。 2. 生成平行公路 点击“编辑器”→“开始…

Win11 没有磁盘清理工具,如何清理磁盘旧的windows.old文件

win11 磁盘右键没有了“磁盘清理工具” 如果想清理文件&#xff0c;可以打开设置&#xff08;WinI&#xff09;系统—存储—清理建议 您也可以打开“存储感知”&#xff0c;系统会在需要时帮你自动清理文件。