基于gRPC的.NET实战
Posted 码农游乐场
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于gRPC的.NET实战相关的知识,希望对你有一定的参考价值。
我们为什么要使用gRPC?
性能
Protobuf的压缩率是非常高的, 即使你对gRPC没有兴趣,也应该去读一下Protobuf编码规则, 相信会对你有所启发。
HTTP/2的优势很多,这两点在我之前的文章有写,参考《》
强类型,也就是说,写的时候,编译器会帮你检查很多东西,这样就不会留着在运行时报错,正所谓动态一时爽,重构火葬场。从我个人体验来说,强类型的确能够帮助减少很多bug。
当你对接很多RESTful API时,你会发现,每个语言都要封装一份SDK,否则就只能大家都裸写JSON,这是一件很蛋疼的 重复劳动的事情,gRPC解决了这个痛点(其它RPC大多也解决了)。
为什么gRPC难以推广?
gRPC更难,无论是使用还是调试,还缺乏相应工具。
对于web端的支持还不够成熟,要写两套。
历史存量,RESTful存量比gRPC大太多。
实际使用场景比较少。
前面我们介绍了gRPC的一些原理,通过上图我们知道,要想使用gRPC,必须有服务端、客户端。那我们第一步就是创建一个服务端,然后再用客户端进行验证。
编写gRPC server端代码
编写gRPC client端代码
运行调试
服务端
1. 新建一个GrpcServer项目
2. 定义接口和数据类型
syntax = "proto3";
option csharp_namespace = "GrpcService.Server";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
int32 age=2;
string name=3;
}
3. Server代码
using Grpc.Core;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace GrpcService.Server
{
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
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,
Name = request.Name,
Age=12
});
}
}
}
客户端代码
using Grpc.Net.Client;
using GrpcService.Server;
using System;
using System.Threading.Tasks;
namespace GrpcService.Client
{
class Program
{
static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
MaxReceiveMessageSize = 5 * 1024 * 1024,
MaxSendMessageSize = 2 * 1024 * 1024
});
var client = new Greeter.GreeterClient(channel);
Console.WriteLine("已连接...");
//异步请求
//var reply = await client.SayHelloAsync(
// new HelloRequest { Name = "zhan wei" });
//Console.WriteLine("Greeter 服务返回数据: " + reply.Message);
//同步请求
var reply = client.SayHello(new HelloRequest { Name = "World" });
Console.WriteLine("Greeter 服务返回数据: " + reply.Message);
//var custom = new Customer.CustomerClient(channel);
//var result=custom.Test(new CustomRequest() { Name="zhanwei"});
await channel.ShutdownAsync();
Console.WriteLine("已断开连接");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
运行调试
1. 运行服务端
2.运行客户端
以上是关于基于gRPC的.NET实战的主要内容,如果未能解决你的问题,请参考以下文章