Supported languages | gRPC,官网。至于原理就不说了,可以百度原理之后,然后再结合代码,事半功倍,就能很好理解GRPC了。
目录
一、简单使用
二、实际应用
一、简单使用
1.使用vs2022创建一个grpc程序,直接就默认值,下一步
2.文件说明
文件1:就是对外面调用的自定义协议,也可以理解是接口,双方必须规定一致性,把写的方法暴露出去。
文件2:就是一般写的方法,业务逻辑。
greet.proto文件
Greeter 定义的服务名字
这里结合下面写的,SayHello方法名字,HelloRequest请求参数,HelloReply返回的参数
3.此时,默认的程序就是一个服务端,那么我们就创建一个客户端去访问它
为了方便我们建立一个控制台程序,实际情况,什么程序都是可以的
4.客户端需要安装3个包
Google.Protobuf
Grpc.Net.Client
Grpc.Tools
5. 然后把服务端的这个文件夹整体拿过来放在客户端下面
这个意思就是,他们有共同的协议,就互通了
6.同理,也把服务端的ItemGroup复制到客户端
把Server改成Client
千万别把上面的替换了,这句在最下面
7.然后在Program中调用
using Grpc.Net.Client;
using GrpcService1;
namespace ClientGRPC
{
internal class Program
{
static void Main(string[] args)
{
string url = "https://localhost:5001"; //https
using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Greeter.GreeterClient(channel);
var reply = client.SayHello(new HelloRequest()
{
Name = "故里2130"
});
Console.WriteLine($"结果:message:{reply.Message}");
}
Console.ReadKey();
//AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); //http调用
//string url = "http://localhost:5000";
//using (var channel = GrpcChannel.ForAddress(url))
//{
// var client = new Greeter.GreeterClient(channel);
// var reply = client.SayHello(new HelloRequest()
// {
// Name = "故里2130"
// });
// Console.WriteLine($"结果:message:{reply.Message}");
//}
//Console.ReadKey();
}
}
}
8.效果
这样,我们就完成了,简单的使用过程,和webapi的效果差不多。但是它的速度远远大于webapi。
补充:在IOC注入的方式调用GRPC,后面可以参考源码
二、实际应用
实际中使用,我们应该结合webapi和grpc一起使用的
其实就是把刚才创建的GrpcService1全部迁移到webapi中就行了
1.安装包Grpc.AspNetCore
2.复制文件
3.创建GreeterService.cs,直接复制就行了
using Grpc.Core;
using GrpcService1;
namespace webapiGRPC.Controllers
{
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger _logger;
public GreeterService(ILogger logger)
{
_logger = logger;
}
public override Task SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
}
4.在Program.cs中注入
using GrpcService1;
using webapiGRPC.Controllers;
namespace webapiGRPC
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddGrpc();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapGrpcService();
app.MapControllers();
app.Run();
}
}
}
所有文件
5.运行webapi和刚才的控制台程序看效果
可以看到,webapi和控制台程序全部通了