做网站经常加班还是app,wordpress导入ssl证书,WordPress设置文章权限,一个ip两个网站怎么做让 gRPC 提供 REST 服务IntrogRPC 是一个高性能、开源和通用的 RPC 框架#xff0c;面向移动和 HTTP/2 设计。gRPC 基于 HTTP/2 标准设计#xff0c;带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好#xff0c;更省电… 让 gRPC 提供 REST 服务IntrogRPC 是一个高性能、开源和通用的 RPC 框架面向移动和 HTTP/2 设计。gRPC 基于 HTTP/2 标准设计带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好更省电和节省空间占用。gRPC 是一个很流行的现代化 RPC 框架它以 HTTP/2 为通信协议基础gRPC 默认使用 protocol buffers 作为接口定义语言来描述服务接口和有效载荷消息结构。尽管 gRPC 有很多应用但是更为常用的还是基于 HTTP/1.1 的 REST 服务应用更广那么能否让 gRPC 同时提供 REST 服务呢答案是肯定的现在有一个实验性的项目(gRPC HTTP API)正在进行如果觉得这个项目不错欢迎在 Github 上进行反馈将你的意见反馈给 gRPC 团队或者去点个赞以提升项目的优先级 https://github.com/grpc/grpc-dotnet/issues/167gRPC loves RESTSampleProto首先我们来看一下 proto filesyntax 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/greeterbody: *};}
}message HelloRequest {string name 1;
}message HelloRequestFrom {string name 1;string from 2;
}message HelloReply {string message 1;
}
和之前相比的变化就是引入了 google/api/annotations.proto然后在声明方法的地方声明了 http 请求的方式和路由Project update除了 proto file 变化之外我们还需要引用 Microsoft.AspNetCore.Grpc.HttpApi 这个包为了更好的和 swagger 整合也可以引用 Microsoft.AspNetCore.Grpc.Swagger 这是一个 swagger 的扩展在 Startup 中注册服务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/GrpcSampleKnown IssuesJSON Serialization现在的 JSON 序列化是基于Google.Protobuf这个实现有两个问题它是线程阻塞的非 async没有做过性能优化Http proto file需要在最终用户的源代码中添加 google / api / annotations.proto和 google / api / http.proto以便Protobuf编译器可以将它们与用户的proto文件一起加载。如果以某种方式用户不必关心这些文件那将是更好的开发人员体验。More这个项目使用下来感觉还是挺方便的相当于在 proto 文件中加了 http 请求相关的注解就可以自动提供 REST 服务这样对于 gRPC 和 REST 服务的整合就很方便了唯一让我觉得有一些美中不足的地方就是 http 只支持 Http2如果 http 协议要支持 http1.1 的话http请求 必须要 https如果是 http2 就可以比较好的支持 http但是大部分的客户端都是 httpClient 都是直接请求的大多没有设置过 Http Version要手动设置 http2 才可以如果觉得还不错记得去 GitHub 上反馈哈 https://github.com/grpc/grpc-dotnet/issues/167Referenceshttps://github.com/grpc/grpc-dotnet/issues/167https://docs.microsoft.com/en-us/aspnet/core/grpc/httpapi?viewaspnetcore-5.0http://james.newtonking.com/archive/2020/03/31/introducing-grpc-http-apihttps://github.com/aspnet/AspLabs/tree/master/src/GrpcHttpApihttps://grpchttpapi.azurewebsites.net/https://github.com/WeihanLi/SamplesInPractice/tree/master/GrpcSample