綁定有點像訂閱發布,但又不一樣,綁定更簡單,綁定輸出(調用方)-綁定輸入(被調用方)。
本例是用docker compose編排,并且用rabbitMQ來支持,因為rabbitMQ支持輸入和輸出綁定。
demo的目錄結構:
?binding.yaml,放在components目錄下
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: orderupdate
spec:type: bindings.rabbitmqversion: v1metadata:- name: queueNamevalue: bindQueue- name: hostvalue: amqp://admin:!2021que@rabbitmq:5672- name: durablevalue: true- name: deleteWhenUnusedvalue: false- name: ttlInSecondsvalue: 60- name: prefetchCountvalue: 0- name: exclusivevalue: false- name: maxPriorityvalue: 5
B2C目錄中的docker-compose.yml
version: '3.4'services:#┌────────────────────────────────┐#│ ordersystem app + Dapr sidecar │#└────────────────────────────────┘ordersystem:image: ${DOCKER_REGISTRY-}ordersystemdepends_on:- redis- placement build:context: ../dockerfile: OrderSystem/Dockerfileports:- "3500:3500"volumes: - ../OrderSystem:/OrderSystem networks:- b2c-daprordersystem-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "order", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components"]depends_on:- ordersystemnetwork_mode: "service:ordersystem"volumes: - ../components:/components #┌───────────────────────────────────┐#│ paymentsystem1 app + Dapr sidecar │#└───────────────────────────────────┘ paymentsystem1:image: ${DOCKER_REGISTRY-}paymentsystemdepends_on:- redis- placement - rabbitmq build:context: ../dockerfile: PaymentSystem/Dockerfileports:- "3601:3500"volumes: - ../PaymentSystem:/PaymentSystem networks:- b2c-dapr paymentsystem1-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- paymentsystem1network_mode: "service:paymentsystem1"volumes: - ../components:/components #┌───────────────────────────────────┐#│ paymentsystem2 app + Dapr sidecar │#└───────────────────────────────────┘ paymentsystem2:image: ${DOCKER_REGISTRY-}paymentsystemdepends_on:- redis- placement - rabbitmq build:context: ../dockerfile: PaymentSystem/Dockerfilevolumes: - ../PaymentSystem:/PaymentSystem ports:- "3602:3500"networks:- b2c-dapr paymentsystem2-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "pay", "-app-port", "80" ,"-placement-host-address", "placement:50006","-components-path","/components"]depends_on:- paymentsystem2network_mode: "service:paymentsystem2"volumes: - ../components:/components #┌───────────────────────────────────┐#│ noticesystem1 app + Dapr sidecar │#└───────────────────────────────────┘ noticesystem1:image: ${DOCKER_REGISTRY-}noticesystemdepends_on:- redis- placement - rabbitmq build:context: ../dockerfile: NoticeSystem/Dockerfileports:- "3701:3500"volumes: - ../NoticeSystem:/NoticeSystem networks:- b2c-dapr noticesystem1-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "notice", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- noticesystem1network_mode: "service:noticesystem1"volumes: - ../components:/components #┌───────────────────────────────────┐#│ noticesystem2 app + Dapr sidecar │#└───────────────────────────────────┘ noticesystem2:image: ${DOCKER_REGISTRY-}noticesystemdepends_on:- redis- placement - rabbitmq build:context: ../dockerfile: NoticeSystem/Dockerfileports:- "3702:3500"volumes: - ../NoticeSystem:/NoticeSystem networks:- b2c-dapr noticesystem2-dapr:image: "daprio/daprd:latest"command: [ "./daprd", "-app-id", "notice", "-app-port", "80","-placement-host-address", "placement:50006","-components-path","/components" ]depends_on:- noticesystem2network_mode: "service:noticesystem2"volumes: - ../components:/components #┌────────────────────────┐#│ Dapr placement service │#└────────────────────────┘ placement:image: "daprio/dapr"command: ["./placement", "-port", "50006"]ports:- "50006:50006"networks:- b2c-dapr#┌───────────────────┐#│ Redis state store │#└───────────────────┘ redis:image: "redis:latest"ports:- "6380:6379"networks:- b2c-dapr#┌──────────────────────┐#│ RabbitMQ state store │#└──────────────────────┘ rabbitmq:image: "rabbitmq:management"ports:- "15672:15672"- "5672:5672" environment:- RABBITMQ_DEFAULT_USER=admin- RABBITMQ_DEFAULT_PASS=!2021que networks:- b2c-dapr networks:b2c-dapr:
在PaymentSystem和NoticeSystem添加監聽傳入的事件
[HttpPost("/orderupdate")]
public async Task<IActionResult> OrderUpdate()
{_logger.LogInformation("NoticeSystem OrderUpdate……");using var reader = new StreamReader(Request.Body, System.Text.Encoding.UTF8);var content = await reader.ReadToEndAsync();_logger.LogInformation(content);return?Ok();
}
啟動 docker-compose?up?-d
會發現所有的挎斗都失敗,如下圖:
查看日志,發現是rabbitMQ的5672沒有連接成功,
綁過一段分析,配置和代碼都沒有問題 ,問題?出現在時差上,雖然在docker-compose中,配置了所有服務依賴rabbitMQ,但rabbitMQ的容器雖然啟動了,但rabbitMQ服務還沒有完全啟動起來,這個時間挎斗連接時,就發生連接錯誤,可以等上一會,手動再次啟動挎斗容器就可以了。(這塊在生產上需要解決,不能每次都手動)
服務都啟動后,可以測試了,調用綁定
http://localhost:3601/v1.0/bindings/orderupdate
需要用post一個json,來調用綁定,分別post了包含10個1 ,10個2,10個3,10個4的四個請求,四個請求會分別觸發四個服務的orderupdate事件(這里orderupdate業務不太適合用綁定,應該用發布訂閱,因為一個訂單變是多,PaymentSystem和NoticeSystem都應該被通知到,但綁定事件不可以,這也是兩者的區別)
總結
以上是生活随笔為你收集整理的Dapr牵手.NET学习笔记:绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。