C# (.NetCore) 一种CodeFirst的Grpc框架 -- Kadder

420 阅读1分钟

这是一个C#项目下采用CodeFirst方式开发的Grpc框架,对于调用方和服务方都是C#语言可免写Proto文件,使用基本的类即可,代码侵入性极低。同时也支持根据proto文件生成c#代码进而支持调用。

此外框架支持流式调用,具体使用方法请移步到 Kadder (GitHub) 查看。这里就简单演示下使用。

使用

服务端安装组件 Kadder

dotnet add package Kadder

创建Protocol类库并声明接口和消息体

namespace Kadder.Protocol
{
    public interface IPersonService:IMessagingServicer
    {
        Task<HelloMessageResult> HelloAsync(HelloMessage message);
    }

    [ProtoContract]
    public class HelloMessage
    {
        [ProtoMember(1)]
        public string Name{get;set;}
    }

    [ProtoContract]
    public class HelloMessageResult
    {
        [ProtoMember(1)]
        public string Result{get;set;}
    } 
}

服务端引用服务

namespace Kadder.Server
{
     class Program
    {
        static async Task Main(string[] args)
        {
            var host = new Microsoft.Extensions.Hosting.HostBuilder()
                .UseGrpcServer((context, services, builder) =>
                {
                    builder.Assemblies.Add(typeof(HelloMessage).Assembly);
                    builder.Options = new GrpcServerOptions();
                    builder.Options.PackageName = "Kadder.Servicer";
                    builder.Options.Ports.Add(new GrpcServerPort() { Port = 3001 });

                    services.AddScoped<IPersonService, PersonService>();
                }).Build();

            host.StartGrpcServer();
            Console.WriteLine("Server is running...");
            await host.RunAsync();
        }
    }
   
    class PersonService:IPersonService
    {
        public Task<HelloMessageResult> HelloAsync(HelloMessage message)
        {
            return Task.FromResult(new MessageResult(){Result="Hello Server!"});
        }
    }
}

客户端引用组件

dotnet add package Kadder

客户端调用

namespace Kadder.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder()
                .UseEnvironment("Development")
                .UseGrpcClient((context, servicers, builder) =>
                {
                    var clientOptions = new GrpcClientOptions();
                    clientOptions.PackageName = "Kadder.Servicer";
                    clientOptions.Addresses.Add(new GrpcChannelOptions() { Address = "127.0.0.1:3002", Credentials = ChannelCredentials.Insecure });
                    clientOptions.AddAssembly(typeof(IPersonServicer).Assembly);

                    builder.AddClient(clientOptions);
                })
                .Build();

            var provider = host.Services;
            var personServicer = provider.GetService<IPersonServicer>();
            var response = await personServicer.HelloAsync(new HelloRequest() { Msg = "Hello, I'm Client!" });
            Console.WriteLine(response.Msg);
        }
    }
}

如果大家觉得好用欢迎Star一下哈,有啥建议啥的也欢迎提Issue