Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式( 三 )

注意标红的哪一行是我唯一改动的地方,因为Grpc接口增加了Web Api配置后会返回两个Route,一个是原始Grpc的,一个是WebApi的,我们需要后面那个 。
接着重写OnTopicEvent方法
public async override Task<TopicEventResponse> OnTopicEvent(TopicEventRequest request, ServerCallContext context){TopicEventResponse topicResponse = new TopicEventResponse();string payloadString = request.Data.ToStringUtf8();Console.WriteLine("OnTopicEvent Data:" + payloadString);HttpContent postContent = new StringContent(payloadString, new MediaTypeWithQualityHeaderValue("application/json"));var response = await _httpClient4TopicEvent.PostAsync("http://" + context.Host + "/" + request.Path, postContent);string responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine(responseContent);if (response.IsSuccessStatusCode){Console.WriteLine("OnTopicEvent Invoke Success.");topicResponse.Status = TopicEventResponseStatus.Success;}else{Console.WriteLine("OnTopicEvent Invoke Error.");topicResponse.Status = TopicEventResponseStatus.Drop;}return topicResponse;}这里简单处理了事件触发的返回参数TopicEventResponse ,未处理重试的情况 。request.path是在ListTopicSubscriptions方法中返回给Dapr的事件对应的WebApi调用地址 。
参数_httpClient4TopicEvent是这样注入的:
builder.Services.AddHttpClient("HttpClient4TopicEvent", httpClient =>{httpClient.DefaultRequestVersion = HttpVersion.Version20;httpClient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));});因为Grpc是基于Http2.0及以上版本的,所以需要修改HtttpClient默认配置,不然无法访基于Http2.0的WebApi 。
然后将我们的AppCallback.AppCallbackBase实现类DaprAppCallbackService Map到GrpcService即可 。
app.MapGrpcService<DaprAppCallbackService>();四、实现效果分别通过Dapr运行ServiceA和ServiceB微服务,注意指定--app-protocol协议为Grpc,我这里还使用了.Net 热重载技术 。
dapr run --app-protocol grpc --app-id serviceA --app-port 5002 --dapr-grpc-port 50002 -- dotnet watch run --launch-profile httpsdapr run --app-protocol grpc --app-id serviceB --app-port 5003 --dapr-grpc-port 50003 -- dotnet watch run --launch-profile https在ServiceA中发布事件

Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式

文章插图
在ServiceB中查看已订阅的事件和接收到的事件触发
Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式

文章插图
五、找工作博主有15年以上的软件技术实施经验(Technical Leader),专注于微服务(Dapr)和云原生(K8s)软件架构设计、专注于 .Net Core\Java开发和Devops构建发布 。博主10年以上的软件交付管理经验(Project Manager & Product Ower),致力于敏捷(Scrum)项目管理、软件产品业务需求分析和原型设计 。博主熟练配置和使用 Microsoft Azure云 。博主为人诚恳,积极乐观,工作认真负责 。
我家在广州,也可以去深圳工作 。做架构师、产品经理、项目经理都可以 。有工作机会推荐的朋友可以加我微信 15920128707,微信名字叫Jerry 。
本文源代码在这里:iamxiaozhuang/TestDaprGrpcSubscripber (github.com) 大家可以随便取用 。

经验总结扩展阅读