我有一个在Dapr中启动的应用程序,它有一个gRPC服务。用id MyGrpcApi001启动Dapr。HTTP端口: 55319。gRPC端口: 55320
我用以下命令启动了它:
dapr run --app-id MyGrpcApi001 --app-protocol grpc --app-port 5000 -- dotnet run
原语:
syntax = "proto3";
import "google/protobuf/empty.proto";
option csharp_namespace = "MyGrpcService";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
rpc Test (google.protobuf.Empty) returns (google.protobuf.Empty);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}我有一个客户端,它有两个使用gRPC连接到服务的方法
class Program
{
private static string LOCAL_ADDRESS = @"http://localhost:5000";
private static string DAPR_ADDRESS = $"http://localhost:55320";
static async Task Main(string[] args)
{
await CallToLocalHost().ConfigureAwait(false); // runs OK
await CallWithClient().ConfigureAwait(false); // exception: Service is unimplemented
}
private static async Task CallToLocalHost()
{
using var channel = GrpcChannel.ForAddress(LOCAL_ADDRESS);
var cl = new MyGrpcService.Greeter.GreeterClient(channel);
MyGrpcService.HelloReply response = await cl.SayHelloAsync(new MyGrpcService.HelloRequest { Name = "ThinkPad" });
Console.WriteLine(response.Message);
}
private static async Task CallWithClient()
{
using DaprClient client = new DaprClientBuilder()
.UseGrpcEndpoint(DAPR_ADDRESS)
.Build();
var request = new MyGrpcService.HelloRequest { Name = "ThinkPad" };
var result = await client.InvokeMethodGrpcAsync<MyGrpcService.HelloRequest, MyGrpcService.HelloReply>("MyGrpcApi001", "SayHello", request).ConfigureAwait(false);
}
}第二种方法似乎不起作用,因此直接调用起作用,但侧call似乎找不到服务。以下是这两种日志的日志:
来自正在运行的服务的日志:
第一种方法可以:
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
== APP == Request starting HTTP/2 POST http://localhost:5000/greet.Greeter/SayHello application/grpc -
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
== APP == Executing endpoint 'gRPC - /greet.Greeter/SayHello'
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
== APP == Executed endpoint 'gRPC - /greet.Greeter/SayHello'
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
== APP == Request finished HTTP/2 POST http://localhost:5000/greet.Greeter/SayHello application/grpc - - 200 - application/grpc 0.3074ms第二个方法错误:
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
== APP == Request starting HTTP/2 POST http://127.0.0.1:5000/dapr.proto.runtime.v1.AppCallback/OnInvoke application/grpc -
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
== APP == Executing endpoint 'gRPC - Unimplemented service'
== APP == info: Grpc.AspNetCore.Server.Internal.ServerCallHandlerFactory[1]
== APP == Service 'dapr.proto.runtime.v1.AppCallback' is unimplemented.
== APP == info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
== APP == Executed endpoint 'gRPC - Unimplemented service'
== APP == info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
== APP == Request finished HTTP/2 POST http://127.0.0.1:5000/dapr.proto.runtime.v1.AppCallback/OnInvoke application/grpc - - 200 0 application/grpc 0.1474ms第二个似乎包含了/dapr.proto.runtime. ...的错误URL。
我在这里做错什么了?dapr运行命令是错误的,还是InvokeMethodGrpcAsync方法的参数错误?
由于我可以通过自动生成的客户机直接运行该方法,所以我认为服务器正常工作,所以dapr找不到服务和/或方法。
有什么想法吗?
谢谢!
发布于 2022-09-14 08:36:45
我在调用gRPC服务时遇到了同样的问题。Greeter服务看起来是这样的,gRPC调用无法用问题'gRPC - Unimplemented service'来解决这个问题。
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}相反,从AppCallbackBase类继承解决了这个问题。
public class GreeterService : AppCallback.AppCallbackBase
{
public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context)
{
InvokeResponse response = new();
switch (request.Method)
{
case "SayHello":
HelloRequest input = request.Data.Unpack<HelloRequest>();
HelloReply output = await Task.FromResult(new HelloReply() { Message = "Hello " + input.Name });
response.Data = Any.Pack(output);
break;
default:
Console.WriteLine("Method not supported");
break;
}
return response;
}
}发布于 2022-04-04 09:10:45
当我调用dapr端口时,我更喜欢使用Dapr代理并在grpc元数据通道中添加服务id,因为我可以直接使用Grpc方法。
您可以阅读文献资料
但是,您需要在Dapr configuration.yml文件中添加预览Dapr功能:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: serverconfig
spec:
features:
- name: proxy.grpc
enabled: true您可以在DaprClient.CreateInvocationInvoker SDK中检查.Net方法。
public static CallInvoker CreateInvocationInvoker(string appId, string daprEndpoint = null, string daprApiToken = null)
{
var channel = GrpcChannel.ForAddress(daprEndpoint ?? DaprDefaults.GetDefaultGrpcEndpoint());
return channel.Intercept(new InvocationInterceptor(appId, daprApiToken ?? DaprDefaults.GetDefaultApiToken()));
}代码在Grpc通道中添加一个键值:"dapr- app -id":{您的app id}
示例:
var callInvoker = DaprClient.CreateInvocationInvoker("my-app-id");
var tenantServiceClient =
new TenantService.TenantServiceClient(callInvoker);
var tenantModel = await tenantServiceClient.FindOneAsync(new FindOneTenantRequest()
{
Id = tenantId
});https://stackoverflow.com/questions/68349953
复制相似问题