作为B-S架构的软件开发遵循一定原则,其中调用接口要求轻协议,所以Restfull Api 就开始受到广泛推,但是作为http协议的代码在调用的时候往往需要通zhong过httpRequest等网络请求模式 并且返回的数据都是基于html/text 的格式一般以JSON格式返回,但因为这样调用方式并不友好,因此remote api 顺应了发展趋势(类似WCF WebService )但WCF Websevice 往往又比较重协议。
废话不多说先上一段代码来演示grpc的应用。
1.服务端
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup>
在项目文件中增加上述配置,并编译项目,然后添加如下服务代码
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 }); } } }
Greeter.GreeterBase 是基于 greet.proto 的模板生成的代码。至此服务端代码生成完毕。
//在启动页增加终结点配置。 app.UseEndpoints(endpoints => { endpoints.MapGrpcService<GreeterService>(); endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); }); });
启动服务
客户端调用grpc 服务
创建一个控制台客户端,并且通过nuget 引用 Google.Protobuf Grpc.Net.Client Grpc.Tools 包,然后编译代码生成
class Program { static async Task Main(string[] args) { var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "老毛" }); Console.WriteLine("Greeter 服务返回数据: " + reply.Message); Console.ReadKey(); } }
运行控制台,至此一个由客户端调用grpc 远程服务的 web api 格式生成完毕。