Blazor+Dapr+K8s微服務(wù)之事件發(fā)布訂閱
我們要實現(xiàn)的是:在blazorweb服務(wù)中發(fā)布一個事件,并傳遞事件參數(shù),然后在serviceapi1服務(wù)中訂閱該事件,接收到blazorweb服務(wù)中發(fā)布的事件和參數(shù)。
1 在blazorweb服務(wù)中發(fā)布一個事件
在DaprTest1.Server項目的WeatherForecastController.cs文件中增加事件發(fā)布API:
[HttpPost(nameof(PublishTestEvent))] public async Task PublishTestEvent(TestEventModel eventModel) { await _daprClient.PublishEventAsync<TestEventModel>("pubsub", "TestEventName", eventModel); }
"TestEventModel"是自定義的事件消息類,"TestEventName"是事件的名稱,"pubsub" 是事件發(fā)布訂閱的名稱,定義在“pubsub.yaml” 組件中:
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: ""
這個組件中定義的發(fā)布訂閱采用了Redis 的 Stream 特性,要注意舊版本的Redis是否支持Stream。
2 在serviceapi1服務(wù)中訂閱該事件
在DaprTest1.ServiceApi1項目中添加Dapr.AspNetCore包,該包實現(xiàn)了ASP.NET Core與Dapr的集成,例如依賴注入DaprClient對象,將事件訂閱發(fā)布功能直接集成到 ASP.NET Core 模型綁定功能中等。

在DaprTest1.ServiceApi1項目的Startup.cs 文件增加事件訂閱相關(guān)代碼(注意綠色部分):
public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddDapr(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "DaprTest1.ServiceApi1", Version = "v1" }); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "DaprTest1.ServiceApi1 v1")); } app.UseRouting(); app.UseAuthorization(); app.UseCloudEvents(); app.UseEndpoints(endpoints => { endpoints.MapSubscribeHandler(); endpoints.MapControllers(); }); }
在DaprTest1.ServiceApi1項目的WeatherForecastController文件增加事件訂閱API
[Topic("pubsub", "TestEventName")] [HttpPost(nameof(SubscribleTestEvent))] public async Task SubscribleTestEvent(TestEventModel eventModel) { await Task.CompletedTask; }
[Topic("pubsub", "TestEventName")] 訂閱了"pubsub"訂閱名稱的TestEventName事件。
3 在Blazor項目中增加Blazor前端事件發(fā)布菜單和頁面
@page "/pubsub" @using DaprTest1.Shared @using System.Text.Json @inject HttpClient Http <h1>發(fā)布訂閱</h1> <p>This component demonstrates publish and subscrible event.</p> <p>編碼:<input type="text" @bind="eventModel.Code" />, 數(shù)量:<input type="text" @bind="eventModel.Amount" /></p> <button class="btn btn-primary" @onclick="PublishEvent">發(fā)布事件</button> @code { private TestEventModel eventModel = new TestEventModel(); private async Task PublishEvent() => await Http.PostAsJsonAsync<TestEventModel>("WeatherForecast/PublishTestEvent", eventModel); }
4 事件發(fā)布訂閱測試
和上一節(jié)一樣,我們先開啟每個微服務(wù)的SideCar,注意,因為的SideCar 指定了狀態(tài)存儲的Redis,所以我們先要開啟Redis,不然SideCar會啟動失敗。確保每個微服務(wù)的SideCar都是運行狀態(tài)。

然后啟動兩個微服務(wù),并訪問http://localhost:5000

在ServiceApi1服務(wù)的事件接收處設(shè)置好斷點,然后點擊“發(fā)布事件”按鈕

可以看到,我們成功接收到了TestEventName事件和事件發(fā)布的參數(shù)。
5 將Dapr的發(fā)布訂閱組件修改為RabbitMQ
通常情況下,我們會用RabbitMQ來支持事件的發(fā)布和訂閱,我們將Dapr 發(fā)布訂閱組件“pubsub.yaml”,修改為如下內(nèi)容即可:
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.rabbitmq version: v1 metadata: - name: host value: "amqp://admin:******@localhost:5672" - name: durable value: true
相關(guān)代碼:iamxiaozhuang/dapr-test (github.com)
浙公網(wǎng)安備 33010602011771號