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
千万别把上面的替换了,这句在最下面
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
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<GreeterService> _logger; public GreeterService(ILogger<GreeterService> logger) { _logger = logger; } public override Task<HelloReply> 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<GreeterService>(); app.MapControllers(); app.Run(); } } }
5.在项目文件中,增加如下代码
然后点击生成
如果报错的话,一定要注意greet.proto中你写的命名空间,命名空间是什么,那么就引用什么,否则继承的时候,一直报错
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup>
所有文件
6.运行webapi和刚才的控制台程序看效果
可以看到,webapi和控制台程序全部通了
此时,我们就可以全部使用了,对自己的软件调用GRPC,增加效率。对外部的软件使用webapi,比较安全
源码:
Net6GrpcService: Net6GrpcService