Intro
gRPC 是一个很流行的现代化 RPC 框架,它以 HTTP/2 为通信协议基础,gRPC 默认使用 protocol buffers 作为接口定义语言,来描述服务接口和有效载荷消息结构。 尽管 gRPC 有很多应用,但是更为常用的还是基于 HTTP/1.1 的 REST 服务,应用更广,那么能否让 gRPC 同时提供 REST 服务呢?答案是肯定的,现在有一个实验性的项目( SampleProto首先我们来看一下 proto file: syntax = "proto3"; // import "google/api/annotations.proto"; package greet.v1; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) { option (google.api.http) = { get: "/v1/greeter/{name}" }; } rpc SayHelloFrom (HelloRequestFrom) returns (HelloReply) { option (google.api.http) = { post: "/v1/greeter" body: "*" }; } } message HelloRequest { string name = 1; } message HelloRequestFrom { string name = 1; string from = 2; } message HelloReply { string message = 1; } 和之前相比的变化就是引入了 Project update除了 proto file 变化之外,我们还需要引用 在 services.AddGrpcHttpApi(); 如果引用了 swagger,也要注册相应的服务: services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }) .AddGrpcSwagger(); 这样就可以了 Client Sample客户端调用示例如下: using var client = new HttpClient() { DefaultRequestVersion = HttpVersion.Version20, DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher, }; await InvokeHelper.TryInvokeAsync(async () => { var responseText = await client.GetStringAsync("https://localhost:5001/v1/greeter/test"); Console.WriteLine($"Response from https endpoint: {responseText}"); }); await InvokeHelper.TryInvokeAsync(async () => { var responseText = await client.GetStringAsync("http://localhost:5000/v1/greeter/test"); Console.WriteLine($"Response from http endpoint: {responseText}"); }); // await InvokeHelper.TryInvokeAsync(async () => { var responseText = await client.GetStringAsync("http://localhost:5000/v1/todo"); Console.WriteLine($"Response from todo endpoint: {responseText}"); }); 客户端输出示例: 服务器端输出示例: 完整的测试代码可以在 Github 获取 https://github.com/WeihanLi/SamplesInPractice/tree/master/GrpcSample Known IssuesJSON Serialization现在的 JSON 序列化是基于
Http proto file需要在最终用户的源代码中添加 More这个项目使用下来感觉还是挺方便的,相当于在 唯一让我觉得有一些美中不足的地方就是 http 只支持 Http2,如果 http 协议要支持 http1.1 的话,http请求 必须要 如果觉得还不错,记得去 GitHub 上反馈哈 https://github.com/grpc/grpc-dotnet/issues/167 References |
|