您当前的位置: 首页 >  nio

寒冰屋

暂无认证

  • 2浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2022-07-21 22:45:00 ,浏览量:2

目录

实现gRPC业务

接口定义

IDemo.cs

服务端

Demo接口服务端实现

客户端

效果

总结

代码地址

 

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

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

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

实现gRPC业务

我这边结构如下:

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

主要引用的Nuget包为:

MagicOnion
MagicOnion.Server
MagicOnion.Client
接口定义

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

IDemo.cs
public interface IDemo : IService
{
    UnaryResult Say1(string msg);
    UnaryResult Say2(string a, int b, List c, Kind kind);
    UnaryResult Say3(int b, List 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/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
{
    public async UnaryResult Say1(string msg)
    {
        return msg;
    }

    public async UnaryResult Say2(string a, int b, List c, Kind kind)
    {
        return b;
    }

    public async UnaryResult Say3(int b, List 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(channel);
    Console.WriteLine(await demo.Say1("123"));
    Console.WriteLine(await demo.Say2("demo", 6, new List() { "6" }, Kind.b));
    Console.WriteLine(await demo.Say3(1, new List(), Kind.a));
    Console.WriteLine("不错,完成了任务!");
    Console.ReadLine();
}
效果

先运行服务端:

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

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

然后,再运行客户端

结果如下:

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

总结

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

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

代码地址

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

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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0444s