首页 > 其他分享 >Grpc MagicOnion库 之 客户端和服务端 (案例版)

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

时间:2023-05-16 22:00:36浏览次数:55  
标签:Kind Console Grpc UnaryResult builder MagicOnion app 服务端


之前通过自己写动态代理和用现成的动态代理库等实现过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# 项目之间实现无缝代码共享。

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

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

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

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

实现gRPC业务

我这边结构如下:

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

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

主要引用的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
}

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

所以,它只能用于服务类的通讯,不能像函数那样用,另外 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/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    //新增
    //增加Grpc
    builder.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/

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

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

然后,再运行客户端

结果如下:

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

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

总结

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

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

代码地址

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


标签:Kind,Console,Grpc,UnaryResult,builder,MagicOnion,app,服务端
From: https://blog.51cto.com/kesshei/6287469

相关文章

  • .Net6创建grpc
    .NetCore(.Net6)创建grpc 1.环境要求.Net6,VisualStudio2019以上官方文档: https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/grpc/grpc-startNetFramework版本: https://www.cnblogs.com/dennisdong/p/17119944.html2.搭建帮助类2.1新建类库GrpcCommon......
  • gRPC 实现服务端消息推送
    1.gRPC简介gRPC是一种高性能、开源和通用的RPC框架,支持多种编程语言。在gRPC中,有四种类型的RPC,分别是UnaryRPC、ServerStreamingRPC、ClientStreamingRPC和BidirectionalStreamingRPC。UnaryRPC:一元RPC一元RPC是最简单的RPC类型,它是一种单向的请求-......
  • 音频 caf转MP3 到上传服务端
    今天一个录制音频到服务端的功能音频录制 导入头文件#import<CoreMedia/CoreMedia.h>#import<AVFoundation/AVFoundation.h>两个对象@property(nonatomic,strong)AVAudioRecorder*audioRecorder;// 录音对象@property(nonatomic,strong)AVAudioPlayer*audioP......
  • socket服务端
    Socket实现在接收到不同的消息时启动PeriodicCallback返回不同的数据,并且关闭时只关闭其中某一个定时器首先,你需要对MainHandler进行修改,添加一个字典callbacks,用于保存每个消息对应的回调函数和其它相关信息,例如:importtornado.ioloopimporttornado.webclassMainHand......
  • SVN服务端使用说明(二)
    服务端使用说明服务端安装完成后,进行创建用户,新建Repositiories等 项目描述Repositories仓库,可分不同文件夹进行存储项目。Users用户,可新增,删除,设置密码等Groups用户组,对不同用户可进行组划分Jobs计划任务,属于企业版高级功能(本文档暂不涉及),可定时备份仓库文件。1)创建用......
  • 浅谈Protocol Buffers、GRPC、Buf、GRPC-Gateway
    1.ProtocolBuffers什么是proto?ProtocolBuffers如何理解ProtocolBuffers?协议缓冲区非proto协议如何订立、传播以及维护?如何理解协议缓冲区?Protocolbuffers提供了一种语言中立、平台中立、可扩展的机制,用于以向前兼容和向后兼容的方式序列化结构化数据。它......
  • 获取WebView发送给服务端的Accept-Language请求头
    1,WebView没有提供获取Accept-Language请求头的接口2,WebView的publicWebResourceResponseshouldInterceptRequest(WebViewview,WebResourceRequestrequest){}回调中WebResourceRequest不包含Accept-Language请求头,即使客户端向服务器端发送的请求中包含该请求头3,javascr......
  • PostgreSQL 12 文档: PostgreSQL 服务端程序
    PostgreSQL服务器应用这一部分包含PostgreSQL服务器应用和支持工具的参考信息。这些命令只在数据库服务器所在的主机上运行才有用。其他工具程序在PostgreSQL客户端应用中列出。目录initdb —创建一个新的PostgreSQL数据库集簇pg_archivecleanup —清理PostgreSQL WAL......
  • 魔兽服务端编译部署NPCBots和机器人模块教程
    魔兽服务端编译部署NPCBots和机器人模块教程大家好,我是艾西。在平时自己一个人玩魔兽的时候是不是会比较无聊,因为游戏机制或副本难度自己一个人无法进行快乐的玩耍。今天艾西教大家编译部署NPCBots和Al机器人模块,直接一个人玩魔兽也不孤单首先到GIT去下载ai机器人以及bots模块解压......
  • 魔兽世界服务端自定义添加NPC教程
    魔兽世界自定义NPC教程大家好,我是艾西今天跟大家聊一下自定义NPC,自定义NPC可以添加自己想要售卖的物品以及定价等可以更好的将一个游戏设定以及游戏的拓展性有质的提升creature表是游戏所有生物人物等表格Creature_template是所有生物模板,根据生物模板可以创建很多的生物。我们在某......