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) 大家可以隨便取用 。

推薦閱讀