asp.net core 3.0中Grpc.AspNetCore.Server带来了什么 - Go语言中文社区

asp.net core 3.0中Grpc.AspNetCore.Server带来了什么


Grpc.AspNetCore.Server带来了什么

dotnet core 3.0在公布的时候有一个重要的feature, 那就是支持gRPC.
gRPC作为一个nuget包早就能工作在Net Core下面.
那dotnet core 3.0中对gRPC的支持到底实现了哪些功能呢?

在.net core 2.2中Host Grpc服务器

参考上一篇文章, 使用protoc或者Visual Studio编辑生成了C#的服务器端代码.
实现服务器端具体的逻辑:

class GreeterImpl : Greeter.GreeterBase
{
    // Server side handler of the SayHello RPC
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
    }

    // Server side handler for the SayHelloAgain RPC
    public override Task<HelloReply> SayHelloAgain(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply { Message = "Hello again " + request.Name });
    }
}

在Console项目中Host gRPC服务:

public static void Main(string[] args)
{
    Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);

    var client = new Greeter.GreeterClient(channel);
    String user = "you";

    var reply = client.SayHello(new HelloRequest { Name = user });
    Console.WriteLine("Greeting: " + reply.Message);

    var secondReply = client.SayHelloAgain(new HelloRequest { Name = user });
    Console.WriteLine("Greeting: " + secondReply.Message);

    channel.ShutdownAsync().Wait();
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

Console项目可以考虑作为Windows服务.
或者在asp.net core中采用IHostedService方式Host. 可参考: Background tasks with hosted services in ASP.NET Core

在.net core 3.0中使用Grpc.AspNetCore.Server Host gRPC

在.net core 3.0中可以直接支持gRPC, 项目的创建模版中可以直接选择gRPC, 生成项目的startup.cs中可以找到看到grpc已经作为默认的middleware添加:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            // Communication with gRPC endpoints must be made through a gRPC client.
            // To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

这也意味者该项目中还可以添加其他的中间件比如说MVC Controller, 让gRPC可以与restful api可以工作在同一个项目中.

Grpc.AspNetCore.Server带来了哪些功能

添加了gRPC middleware之后, asp.net core默认的功能都能够使用.

DI与Logging

asp.net core中最核心的功能DI可以在gRPC服务中使用.

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

HttpContext支持

gRPC是基于http/2的, 在ServerCallContext中可以访问到metadata, 比如说method, host, header等等http的基本信息.
在Grpc.AspNetCore.Server中对ServerCallContext进行了扩展, 可以直接转换到HttpContext, 这样就可以访问session, user ClaimsPrincipal这些基本的数据.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply>
        SayHello(HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();

        return Task.FromResult(new HelloReply
        {
            Message = "Using https: " + httpContext.Request.IsHttps
        });
    }
}
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/bf14f3cfb7b3
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-02 14:50:53
  • 阅读 ( 1195 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢