我刚开始玩谷歌原型.当我尝试编译proto-java示例中存在的proto文件时,它不会生成任何grpc文件.
proto文件, https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/hello_world.proto
终端输出,
rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ protoc --version libprotoc 3.0.0 rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ protoc --java_out = test/-I ../../ grpc-java/examples ../../grpc-java/examples/src/main/proto/hello_world.proto rsonkhla @ raman-OptiPlex-9020:〜/ sandbox/grpc-java/examples $ ls -R test/test /:io
test/io:grpc
test/io/grpc:示例
test/io/grpc/examples:helloworld
test/io/grpc/examples/helloworld:HelloRequest.java
HelloResponse.java HelloWorldProto.java HelloRequestOrBuilder.java HelloResponseOrBuilder.java
还有其他人遇到过这个问题吗?
在gRPC中,如何添加拦截任何RuntimeException并将有意义的信息传播给客户端的全局异常拦截器?
例如,一个divide方法可能引发ArithmeticException与/ by zero消息.在服务器端,我可以写:
@Override
public void divide(DivideRequest request, StreamObserver<DivideResponse> responseObserver) {
int dom = request.getDenominator();
int num = request.getNumerator();
double result = num / dom;
responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
responseObserver.onCompleted();
}
Run Code Online (Sandbox Code Playgroud)
如果客户端通过denominator = 0,它将得到:
Exception in thread "main" io.grpc.StatusRuntimeException: UNKNOWN
Run Code Online (Sandbox Code Playgroud)
并且服务器输出
Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$2@62e95ade
java.lang.ArithmeticException: / by zero
Run Code Online (Sandbox Code Playgroud)
客户不知道发生了什么.
如果我想将/ by zero消息传递给客户端,我必须将服务器修改为:(如本问题所述)
try {
double result = num / dom;
responseObserver.onNext(DivideResponse.newBuilder().setValue(result).build());
responseObserver.onCompleted();
} catch (Exception e) {
logger.error("onError …Run Code Online (Sandbox Code Playgroud) 使用gRPC向客户端发送有关错误的更多详细信息的模式是什么?
例如,假设我有一个用于注册用户的表单,用于发送消息
message RegisterUser {
string email = 1;
string password = 2;
}
Run Code Online (Sandbox Code Playgroud)
电子邮件必须格式正确且唯一,密码长度必须至少为8个字符.
如果我正在编写JSON API,我将使用以下正文返回400错误:
{
"errors": [{
"field": "email",
"message": "Email does not have proper format."
}, {
"field": "password",
"message": "Password must be at least 8 characters."
}],
}
Run Code Online (Sandbox Code Playgroud)
并且客户端可以向用户提供好的错误消息(即通过突出显示密码字段并特别告诉用户他们输入的内容有问题).
有了gRPC有没有办法做类似的事情?似乎在大多数客户端语言中,错误会导致抛出异常,无法获取响应.
例如,我喜欢类似的东西
message ValidationError {
string field = 1;
string message = 2;
}
message RegisterUserResponse {
repeated ValidationError validation_errors = 1;
...
}
Run Code Online (Sandbox Code Playgroud)
或类似的.
使用aspnetcore 3.1nugetGrpc.AspNetCore包,我成功地使 gRPC 服务与标准 asp.net 控制器一起成功运行,如本教程中所述。
不过,我想将 gRPC 服务绑定到特定端口(例如 5001),如果可能的话最好通过配置而不是代码。这是因为我想限制 gRPC 服务的公开方式。
我最接近的是RequireHost在映射端点时使用的:
// Startup.cs
public void Configure(IApplicationBuilder app)
{
// ...
app.useEndpoints(endpoints =>
{
endpoints.MapGrpcService<MyService>()
.RequireHost("0.0.0.0:5001");
});
}
Run Code Online (Sandbox Code Playgroud)
这似乎符合我的要求,但我找不到任何有关它的文档,并且它需要在每个服务的代码中进行配置。也许有更好的方法?
我创建了一个非常简单的程序,该程序应该列出Google Cloud项目中可用的主题.代码很简单:
using System;
using Google.Pubsub.V1;
public class Test
{
static void Main()
{
var projectId = "(fill in project ID here...)";
var projectName = PublisherClient.FormatProjectName(projectId);
var client = PublisherClient.Create();
foreach (var topic in client.ListTopics(projectName))
{
Console.WriteLine(topic.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我从针对.NET 4.5的"常规"msbuild项目运行它时,它工作正常.当我尝试将dotnet cli(1.0.0-preview2-003121)与以下project.json文件一起使用时:
{
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Google.Pubsub.V1": "1.0.0-beta01"
},
"frameworks": {
"net45": { }
}
}
Run Code Online (Sandbox Code Playgroud)
......我看到一个例外:
Unhandled Exception: System.IO.FileNotFoundException: Error loading native library.
Not found in any of the possible locations c:\[...]\Pubsub.Demo\bin\Debug\net45\win7-x64\nativelibs\windows_x64\grpc_csharp_ext.dll …Run Code Online (Sandbox Code Playgroud) 尝试调用存根方法时出现以下错误。知道是什么原因造成的吗?
[bolt.api.handlers] 2019-08-21 20:07:57,792 ERROR handlers:1066: 'ResourceHandler' object has no attribute 'ontology_service_handler'
Traceback (most recent call last):
File "/bolt-webserver/bolt/api/onse/onse_handlers/ontology_service.py", line 17, in post
ontology_id = await self.onse_stub.createOntology()
File "/bolt-webserver/bolt/api/onse/onse_stub.py", line 41, in createOntology
return self.stub.CreateOntology(ontology_messages_pb2.Ontology())
File "/usr/local/lib/python3.6/site-packages/grpc/_channel.py", line 565, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "/usr/local/lib/python3.6/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses"
debug_error_string = "{"created":"@1566418077.791002345","description":"Failed to pick …Run Code Online (Sandbox Code Playgroud) 我试图了解 gRPC 队列的管理方式以及 gRPC 队列大小是否有任何大小限制。
根据此,帖子请求已排队:
如果您的服务器已经同时处理了maximum_concurrent_rpcs个请求,并且又收到另一个请求,则该请求将立即被拒绝。
如果ThreadPoolExecutor的max_workers小于maximum_concurrent_rpcs,那么在所有线程都忙于处理请求后,下一个请求将排队,并在线程完成处理时处理。
根据此 GitHub 帖子,队列由 gRPC 服务器管理:
因此,maximum_concurrent_rpcs 为您提供了一种方法来设置服务器队列中等待线程服务的 RPC 数量的上限。
但微软的这篇文章让我很困惑,它说请求在客户端排队:
当活动呼叫数量达到连接流限制时,其他呼叫将在客户端中排队。排队的呼叫等待活动呼叫完成后再发送。
但请注意,微软在这里谈论的是连接流限制。当达到该限制时,客户端上会形成一个队列。
有两种类型的队列吗?一个是在满足某些限制时在服务器(gRPC 队列)上创建的(如上所述),另一个是在达到此连接流限制时在客户端上创建的。
gRPC 队列的大小限制是多少?我的意思是,它仅受底层硬件(RAM)的限制?
我们是否有可能因为队列大小过大而导致服务器失败?是否可以限制此队列大小?
如果我们谈论的是 2 个不同的队列,我们是否也可以管理和限制客户端上的队列?
我对python的观点特别感兴趣。
谢谢!
PS 我假设当人们谈论 gRPC 队列时,他们谈论的是在服务器上创建的队列。
按照有关如何设置 gRPC 网关的文档,我发现自己陷入了生成 grpc 网关的第四步。
也就是说,当添加以下行时,事情就会崩溃:
import "google/api/annotations.proto";
Run Code Online (Sandbox Code Playgroud)
该文档说了You will need to provide the required third party protobuf files to the protoc compiler- 但实际上并没有说明如何做到这一点。
如何添加google/api/annotations.proto为依赖项?
我想创建一个简单的gRPC端点,用户可以上传他/她的图片.协议缓冲区声明如下:
message UploadImageRequest {
AuthToken auth = 1;
// An enum with either JPG or PNG
FileType image_format = 2;
// Image file as bytes
bytes image = 3;
}
Run Code Online (Sandbox Code Playgroud)
无论gRPC文档中的警告如何,这种上传图片(和接收图片)的方法仍然可以吗?
如果没有,使用标准表格上传图片并存储图像文件位置是更好的方法(标准)吗?
我正在使用gRPC和Python作为kubernetes pods中的客户端/服务器......我希望能够启动多个相同类型的pod(gRPC服务器)并让客户端(随机)连接它们.
我发送了10个服务器的pod并设置了一个"服务"来定位它们.然后,在客户端,我连接到服务的DNS名称 - 意味着kubernetes应该进行负载平衡并将我引导到随机服务器pod.实际上,客户端调用gRPC函数(效果很好)但是当我查看日志时,我看到所有调用都转到同一个服务器pod.
我假设客户端正在进行某种DNS缓存,这导致所有调用都被发送到同一服务器.是这样的吗?无论如何要禁用它并设置相同的存根客户端进行"新"呼叫并通过DNS每次呼叫获取新的IP?
我知道如果它每次都会查询DNS服务器,我可能会产生的开销,但是分配负载对我来说更重要.
编辑
可能不是缓存问题......可能只是gRPC的工作方式.HTTP/2和持久可重用连接.每次通话后有什么方法可以"断开"?
grpc ×10
c# ×2
grpc-python ×2
python ×2
.net ×1
.net-core ×1
asp.net-core ×1
dns ×1
dotnet-cli ×1
go ×1
grpc-java ×1
http ×1
java ×1
kubernetes ×1
protoc ×1