You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.zh-cn.md 6.9 KiB

7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
7 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. # CAP                       [English](https://github.com/dotnetcore/CAP/blob/develop/README.md)
  2. [![Travis branch](https://img.shields.io/travis/dotnetcore/CAP/develop.svg?label=travis-ci)](https://travis-ci.org/dotnetcore/CAP)
  3. [![AppVeyor](https://ci.appveyor.com/api/projects/status/4mpe0tbu7n126vyw?svg=true)](https://ci.appveyor.com/project/yuleyule66/cap)
  4. [![NuGet](https://img.shields.io/nuget/v/DotNetCore.CAP.svg)](https://www.nuget.org/packages/DotNetCore.CAP/)
  5. [![NuGet Preview](https://img.shields.io/nuget/vpre/DotNetCore.CAP.svg?label=nuget-pre)](https://www.nuget.org/packages/DotNetCore.CAP/)
  6. [![Member project of .NET China Foundation](https://img.shields.io/badge/member_project_of-.NET_CHINA-red.svg?style=flat&colorB=9E20C8)](https://github.com/dotnetcore)
  7. [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)
  8. CAP 是一个在分布式系统(SOA、MicroService)中实现最终一致性的库,它具有轻量级、易使用、高性能等特点。
  9. 你可以在这里[CAP Wiki](https://github.com/dotnetcore/CAP/wiki)看到更多详细资料。
  10. ## 预览(OverView)
  11. CAP 是在一个 ASP.NET Core 项目中使用的库,当然他可以用于 ASP.NET Core On .NET Framework 中。
  12. 你可以把 CAP 看成是一个 EventBus,因为它具有 EventBus 的所有功能,并且 CAP 提供了更加简化的方式来处理 EventBus 中的发布和订阅。
  13. CAP 具有消息持久化的功能,当你的服务进行重启或者宕机时它可以保证消息的可靠性。CAP提供了基于Microsoft DI 的 Publisher Service 服务,它可以和你的业务服务进行无缝结合,并且支持强一致性的事务。
  14. 这是CAP集在ASP.NET Core 微服务架构中的一个示意图:
  15. ![](http://images2015.cnblogs.com/blog/250417/201707/250417-20170705175827128-1203291469.png)
  16. > 图中实线部分代表用户代码,虚线部分代表CAP内部实现。
  17. ## Getting Started
  18. ### NuGet
  19. 你可以运行以下下命令在你的项目中安装 CAP。
  20. ```
  21. PM> Install-Package DotNetCore.CAP
  22. ```
  23. 如果你的消息队列使用的是 Kafka 的话,你可以:
  24. ```
  25. PM> Install-Package DotNetCore.CAP.Kafka
  26. ```
  27. 如果你的消息队列使用的是 RabbitMQ 的话,你可以:
  28. ```
  29. PM> Install-Package DotNetCore.CAP.RabbitMQ
  30. ```
  31. CAP 提供了 Sql Server, MySql, PostgreSQL 的扩展作为数据库存储:
  32. ```
  33. // 按需选择安装你正在使用的数据库
  34. PM> Install-Package DotNetCore.CAP.SqlServer
  35. PM> Install-Package DotNetCore.CAP.MySql
  36. PM> Install-Package DotNetCore.CAP.PostgreSql
  37. ```
  38. ### Configuration
  39. 首先配置CAP到 Startup.cs 文件中,如下:
  40. ```c#
  41. public void ConfigureServices(IServiceCollection services)
  42. {
  43. ......
  44. services.AddDbContext<AppDbContext>();
  45. services.AddCap(x =>
  46. {
  47. // 如果你的 SqlServer 使用的 EF 进行数据操作,你需要添加如下配置:
  48. // 注意: 你不需要再次配置 x.UseSqlServer(""")
  49. x.UseEntityFramework<AppDbContext>();
  50. // 如果你使用的Dapper,你需要添加如下配置:
  51. x.UseSqlServer("数据库连接字符串");
  52. // 如果你使用的 RabbitMQ 作为MQ,你需要添加如下配置:
  53. x.UseRabbitMQ("localhost");
  54. //如果你使用的 Kafka 作为MQ,你需要添加如下配置:
  55. x.UseKafka("localhost");
  56. });
  57. }
  58. public void Configure(IApplicationBuilder app)
  59. {
  60. .....
  61. app.UseCap();
  62. }
  63. ```
  64. ### 发布
  65. 在 Controller 中注入 `ICapPublisher` 然后使用 `ICapPublisher` 进行消息发送
  66. ```c#
  67. public class PublishController : Controller
  68. {
  69. private readonly ICapPublisher _publisher;
  70. public PublishController(ICapPublisher publisher)
  71. {
  72. _publisher = publisher;
  73. }
  74. [Route("~/checkAccount")]
  75. public async Task<IActionResult> PublishMessage()
  76. {
  77. //指定发送的消息头和内容
  78. await _publisher.PublishAsync("xxx.services.account.check", new Person { Name = "Foo", Age = 11 });
  79. return Ok();
  80. }
  81. [Route("~/checkAccountWithTrans")]
  82. public async Task<IActionResult> PublishMessageWithTransaction([FromServices]AppDbContext dbContext)
  83. {
  84. using (var trans = dbContext.Database.BeginTransaction())
  85. {
  86. await _publisher.PublishAsync("xxx.services.account.check", new Person { Name = "Foo", Age = 11 });
  87. trans.Commit();
  88. }
  89. return Ok();
  90. }
  91. }
  92. ```
  93. ### 订阅
  94. **Action Method**
  95. 在 Action 上添加 CapSubscribeAttribute 来订阅相关消息。
  96. ```c#
  97. public class PublishController : Controller
  98. {
  99. private readonly ICapPublisher _publisher;
  100. public PublishController(ICapPublisher publisher)
  101. {
  102. _publisher = publisher;
  103. }
  104. [NoAction]
  105. [CapSubscribe("xxx.services.account.check")]
  106. public async Task CheckReceivedMessage(Person person)
  107. {
  108. Console.WriteLine(person.Name);
  109. Console.WriteLine(person.Age);
  110. return Task.CompletedTask;
  111. }
  112. }
  113. ```
  114. **Service Method**
  115. 如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 `ICapSubscribe`:
  116. ```c#
  117. namespace xxx.Service
  118. {
  119. public interface ISubscriberService
  120. {
  121. public void CheckReceivedMessage(Person person);
  122. }
  123. public class SubscriberService: ISubscriberService, ICapSubscribe
  124. {
  125. [CapSubscribe("xxx.services.account.check")]
  126. public void CheckReceivedMessage(Person person)
  127. {
  128. }
  129. }
  130. }
  131. ```
  132. 然后在 Startup.cs 中的 `ConfigureServices()` 中注入你的 `ISubscriberService` 类
  133. ```c#
  134. public void ConfigureServices(IServiceCollection services)
  135. {
  136. services.AddTransient<ISubscriberService,SubscriberService>();
  137. }
  138. ```
  139. ### Dashboard
  140. CAP 2.1+ 以上版本中提供了仪表盘(Dashboard)功能,你可以很方便的查看发出和接收到的消息。除此之外,你还可以在仪表盘中实时查看发送或者接收到的消息。
  141. 在分布式环境中,仪表盘内置集成了 [Consul](http://consul.io) 作为节点的注册发现,同时实现了网关代理功能,你同样可以方便的查看本节点或者其他节点的数据,它就像你访问本地资源一样。
  142. ```c#
  143. services.AddCap(x =>
  144. {
  145. //...
  146. // 注册 Dashboard
  147. x.UseDashboard();
  148. // 注册节点到 Consul
  149. x.UseDiscovery(d =>
  150. {
  151. d.DiscoveryServerHostName = "localhost";
  152. d.DiscoveryServerPort = 8500;
  153. d.CurrentNodeHostName = "localhost";
  154. d.CurrentNodePort = 5800;
  155. d.NodeId = 1;
  156. d.NodeName = "CAP No.1 Node";
  157. });
  158. });
  159. ```
  160. ![dashboard](http://images2017.cnblogs.com/blog/250417/201710/250417-20171004220827302-189215107.png)
  161. ![received](http://images2017.cnblogs.com/blog/250417/201710/250417-20171004220934115-1107747665.png)
  162. ![subscibers](http://images2017.cnblogs.com/blog/250417/201710/250417-20171004220949193-884674167.png)
  163. ![nodes](http://images2017.cnblogs.com/blog/250417/201710/250417-20171004221001880-1162918362.png)
  164. ## 贡献
  165. 贡献的最简单的方法之一就是是参与讨论和讨论问题(issue)。你也可以通过提交的 Pull Request 代码变更作出贡献。
  166. ### License
  167. MIT