关于gRPC的相关配置
-
配置 TLS 证书和 HTTP2 协议
appsettings.json 配置文件{ "Kestrel": { "Endpoints": { "HttpsInlineCertFile": { "Url": "https://localhost:5001", "Protocols": "Http2", "Certificate": { //证书 "Path": "<path to .pfx file>", "Password": "<certificate password>" } } } } }
-
硬编码配置
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; listenOptions.UseHttps("<path to .pfx file > ", " < certificate password > "); }); }); webBuilder.UseStartup<Startup>(); });
-
gRPC 服务直接使用 ASP.NET Core 依赖注入容器注入。
public class GreeterService : Greeter.GreeterBase { public GreeterService(ILogger<GreeterService> logger) { } }
-
从 gRPC 服务方法中解析 HttpContext 实例
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { var httpContext = context.GetHttpContext(); //获取客户端证书 var clientCertificate = httpContext.Connection.ClientCertificate; return Task.FromResult(new HelloReply { Message = "Hello " + request.Name + " from " + clientCertificate.Issuer }); } }
-
gRPC 配置选项
-
配置服务端
//作用全局 public void ConfigureServices(IServiceCollection services) { services.AddGrpc(options => { options.EnableDetailedErrors = true; options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB }); } //作用单个 public void ConfigureServices(IServiceCollection services) { services.AddGrpc().AddServiceOptions<MyService>(options => { options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB }); }
-
配置客户端
static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
});
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name =
"GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
}
-
服务端日志配置
由于 gRPC 服务托管在 ASP.NET Core 上,因此它使用 ASP.NET Core 日志记录系统。 在默认配置
中,gRPC 记录的信息非常小,但这可以进行配置。{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information", "Grpc": "Debug" } } }
-
硬编码配置
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.AddFilter("Grpc", LogLevel.Debug); }) .ConfigureWebHostDefaults(webBuilder => {{ webBuilder.UseStartup<Startup>(); });
-
环境变量配置
Logging:LogLevel:Grpc = Debug -
客户端日志配置
如果要从 ASP.NET Core 的应用程序调用 gRPC 服务,则可以通过依赖关系注入(DI)来解析记录
器工厂:[ApiController] [Route("[controller]")] public class GreetingController : ControllerBase { private ILoggerFactory _loggerFactory; public GreetingController(ILoggerFactory loggerFactory) { _loggerFactory = loggerFactory; } [HttpGet] public async Task<ActionResult<string>> Get(string name) { var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions { LoggerFactory = _loggerFactory }); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync(new HelloRequest { Name = name }); return Ok(reply.Message); } }
-
如果你的应用未使用依赖注入容器,则可以使用 LoggerFactory 创建日志记录:
var loggerFactory = LoggerFactory.Create(logging => { logging.AddConsole(); logging.SetMinimumLevel(LogLevel.Debug); }); var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions { LoggerFactory = loggerFactory }); var client = Greeter.GreeterClient(channel);