这是一个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