CAP-微服務間通訊實踐
阿新 • • 發佈:2020-10-23
## 微服務間通訊常見的兩種方式
由於微服務架構慢慢被更多人使用後,迎面而來的問題是如何做好微服務間通訊的方案。我們先分析下目前最常用的兩種服務間通訊方案。
### gRPC(rpc遠端呼叫)
[gRPC-微服務間通訊實踐](https://zhuanlan.zhihu.com/p/260390840)
- 場景:A服務主動發起請求到B服務,同步方式
- 範圍:只在微服務間通訊應用
### EventBus(基於訊息佇列的整合事件)
- 技術:NotNetCore.Cap + Rabbitmq + Database
- 場景:A服務要在B服務做某件事情後響應,非同步方式
- 實現:B服務在完成某件事情後釋出訊息,A服務訂閱此訊息
- 範圍:只在微服務間通訊應用
> 通過對比,兩種方式完全不一樣。rpc是類似於http請求的及時響應機制,但是比http更輕量、快捷,它更像以前的微軟的WCF,可以自動生成客戶端程式碼,充分體現了面向實體物件的遠端呼叫的思想;Eventbus是非同步的訊息機制,基於cap的思想,不關心下游訂閱方服務是否消費成功,保障了主服務業務的流暢性,同時也是一款分散式事務的實現方案,可以保障分散式架構中的資料的最終一致性。
我們今天主要介紹CAP在微服務中的實踐案例。
## 搭建框架介紹
![](https://img2020.cnblogs.com/blog/1145796/202010/1145796-20201023145746997-2052754460.jpg)
### 新建專案
1. 新建解決方案 DotNetCore.Cap.Demo
2. 新建專案 DotNetCore.Cap.Demo.Publisher 訊息釋出端
3. 新建專案 DotNetCore.Cap.Demo.Subscriber 訊息訂閱端
![](https://img2020.cnblogs.com/blog/1145796/202010/1145796-20201023145808252-1271379299.jpg)
### 主要sdk
- 專案框架 netcoreapp 3.1
- 訊息佇列選用RabbitMQ
- 資料庫儲存選用PostgreSql
>根據實際情況選擇合適的訊息佇列和資料庫儲存
CAP 支援 Kafka、RabbitMQ、AzureServiceBus 訊息佇列:
```
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
```
CAP 提供了 Sql Server, MySql, PostgreSQL,MongoDB 作為資料庫儲存:
```
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB
```
本次demo使用的nuget包如下所示
```
$ dotnet list package
專案“DotNetCore.Cap.Demo.Publisher”具有以下包引用
[netcoreapp3.1]:
頂級包 已請求 已解決
> DotNetCore.CAP 3.1.1 3.1.1
> DotNetCore.CAP.PostgreSql 3.1.1 3.1.1
> DotNetCore.CAP.RabbitMQ 3.1.1 3.1.1
> Microsoft.VisualStudio.Azure.Containers.Tools.Targets 1.10.9 1.10.9
> Npgsql.EntityFrameworkCore.PostgreSQL 3.1.4 3.1.4
> Npgsql.EntityFrameworkCore.PostgreSQL.Design 1.1.0 1.1.0
專案“DotNetCore.Cap.Demo.Subscriber”具有以下包引用
[netcoreapp3.1]:
頂級包 已請求 已解決
> DotNetCore.CAP 3.1.1 3.1.1
> DotNetCore.CAP.PostgreSql 3.1.1 3.1.1
> DotNetCore.CAP.RabbitMQ 3.1.1 3.1.1
> Microsoft.VisualStudio.Azure.Containers.Tools.Targets 1.10.9 1.10.9
> Npgsql.EntityFrameworkCore.PostgreSQL 3.1.4 3.1.4
> Npgsql.EntityFrameworkCore.PostgreSQL.Design 1.1.0 1.1.0
```
## DotNetCore.Cap.Demo.Publisher 訊息釋出端
### 修改Startup檔案
> 注入dotnetcore.cap元件及資料庫上下文
```C#
services.AddDbContext