基于gRPC的.NET实战

Posted 码农游乐场

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于gRPC的.NET实战相关的知识,希望对你有一定的参考价值。

我们为什么要使用gRPC?

性能

  1. Protobuf的压缩率是非常高的, 即使你对gRPC没有兴趣,也应该去读一下Protobuf编码规则, 相信会对你有所启发。

  2. HTTP/2的优势很多,这两点在我之前的文章有写,参考《》

  3. 强类型,也就是说,写的时候,编译器会帮你检查很多东西,这样就不会留着在运行时报错,正所谓动态一时爽,重构火葬场。从我个人体验来说,强类型的确能够帮助减少很多bug。

  4. 当你对接很多RESTful API时,你会发现,每个语言都要封装一份SDK,否则就只能大家都裸写JSON,这是一件很蛋疼的 重复劳动的事情,gRPC解决了这个痛点(其它RPC大多也解决了)。


为什么gRPC难以推广?

  1. gRPC更难,无论是使用还是调试,还缺乏相应工具。

  2. 对于web端的支持还不够成熟,要写两套。

  3. 历史存量,RESTful存量比gRPC大太多。

  4. 实际使用场景比较少。


前面我们介绍了gRPC的一些原理,通过上图我们知道,要想使用gRPC,必须有服务端、客户端。那我们第一步就是创建一个服务端,然后再用客户端进行验证。

  1. 编写gRPC server端代码

  2. 编写gRPC client端代码

  3. 运行调试

服务端

1. 新建一个GrpcServer项目

基于gRPC的.NET实战

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. 运行服务端

基于gRPC的.NET实战

2.运行客户端




以上是关于基于gRPC的.NET实战的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core gRPC 实战

Envoy实现.NET架构的网关代理GRPC

Dapr + .NET 实战服务调用之GRPC

grpc| python 实战 grpch

基于gRPC的注册发现与负载均衡的原理和实战

基于 gRPC 的服务注册与发现和负载均衡的原理与实战