Introduction

我在 components 配置文件夹下写了 pubsub.yaml 但是在 gRPC 服务中未使用发布订阅。在启动服务的时候报错

1
2
3
Error status code 'Unimplemented' raised.
Grpc.Core.RpcException: Status(StatusCode="Unimplemented", Detail="")
at Dapr.AppCallback.Autogen.Grpc.v1.AppCallback.AppCallbackBase.ListTopicSubscriptions(Empty request, ServerCallContext context)

正文

这是因为 dapr 认为我们的 gRPC 服务使用了发布订阅,但是没有重写 ListTopicSubscriptions 方法。解决方案就是在服务中重写 ListTopicSubscriptions。 或者不使用含有 pubsub.yamlcomponents-path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Threading.Tasks;
using Dapr.AppCallback.Autogen.Grpc.v1;
using Dapr.Client.Autogen.Grpc.v1;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using MediatR;
using static Dapr.AppCallback.Autogen.Grpc.v1.AppCallback;

namespace FileService.Services.GrpcService
{
public class GrpcService : AppCallbackBase
{
private readonly IMediator _mediator;

public GrpcService(IMediator mediator)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}

public override async Task<InvokeResponse> OnInvoke(
InvokeRequest request,
ServerCallContext context
)
{
// Implement OnIvoke
}

public override Task<ListTopicSubscriptionsResponse> ListTopicSubscriptions(Empty request, ServerCallContext context)
{
// implement ListTopicSubscriptions to register subscriber
}
}
}

最后别忘了在 startup 中注册服务

1
2
3
4
5
6
7
8
9
10
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

app.UseEndpoints(
endpoints =>
{
endpoints.MapGrpcService<GrpcService>();
}
);
}