注意标红的哪一行是我唯一改动的地方,因为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中发布事件
文章插图
在ServiceB中查看已订阅的事件和接收到的事件触发
文章插图
五、找工作博主有15年以上的软件技术实施经验(Technical Leader),专注于微服务(Dapr)和云原生(K8s)软件架构设计、专注于 .Net Core\Java开发和Devops构建发布 。博主10年以上的软件交付管理经验(Project Manager & Product Ower),致力于敏捷(Scrum)项目管理、软件产品业务需求分析和原型设计 。博主熟练配置和使用 Microsoft Azure云 。博主为人诚恳,积极乐观,工作认真负责 。
我家在广州,也可以去深圳工作 。做架构师、产品经理、项目经理都可以 。有工作机会推荐的朋友可以加我微信 15920128707,微信名字叫Jerry 。
本文源代码在这里:iamxiaozhuang/TestDaprGrpcSubscripber (github.com) 大家可以随便取用 。
经验总结扩展阅读
- 是什么让.NET7的Min和Max方法性能暴增了45倍?
- React动画实现方案之 Framer Motion,让你的页面“自己”动起来
- AR人体姿态识别,实现无边界的人机交互
- 17 基于SqlSugar的开发框架循序渐进介绍-- 基于CSRedis实现缓存的处理
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 19 基于.NetCore开发博客项目 StarBlog - Markdown渲染方案探索
- 支付宝怎样实现银行卡之间转账(如何利用支付宝进行银行卡转账)
- 2023年下半年,哪个星座最有可能实现人生突破与转变?
- Eureka Server 实现在线扩容
- React实现一个简易版Swiper