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 3.7 KiB

7 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # CAP
  2. [![Travis branch](https://img.shields.io/travis/dotnetcore/CAP/master.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. [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/dotnetcore/CAP/master/LICENSE.txt)
  5. CAP 是一个在分布式系统(SOA、MicroService)中实现最终一致性的库,它具有轻量级、易使用、高性能等特点。
  6. ## 预览(OverView)
  7. CAP 是在一个 ASP.NET Core 项目中使用的库,当然他可以用于 ASP.NET Core On .NET Framework 中。
  8. 你可以把 CAP 看成是一个 EventBus,因为它具有 EventBus 的所有功能,并且CAP提供了更加简化的方式来处理 EventBus 中的发布和订阅。
  9. CAP 具有消息持久化的功能,当你的服务进行重启或者宕机时它可以保证消息的可靠性。CAP提供了基于Microsoft DI 的 Producer Service 服务,它可以和你的业务服务进行无缝结合,并且支持强一致性的事务。
  10. 这是CAP集在ASP.NET Core 微服务架构中的一个示意图:
  11. ![](http://images2015.cnblogs.com/blog/250417/201706/250417-20170630143600289-1065294295.png)
  12. > 图中实线部分代表用户代码,虚线部分代表CAP内部实现。
  13. ## Getting Started
  14. ### NuGet 暂未发布
  15. 你可以运行以下下命令在你的项目中安装 CAP。
  16. 如果你的消息队列使用的是 Kafka 的话,你可以:
  17. ```
  18. PM> Install-Package DotNetCore.CAP.Kafka
  19. ```
  20. 如果你的消息队列使用的是 RabbitMQ 的话,你可以:
  21. ```
  22. PM> Install-Package DotNetCore.CAP.RabbitMQ
  23. ```
  24. CAP 默认提供了 Entity Framwork 作为数据库存储:
  25. ```
  26. PM> Install-Package DotNetCore.CAP.EntityFrameworkCore
  27. ```
  28. ### Configuration
  29. 首先配置CAP到 Startup.cs 文件中,如下:
  30. ```cs
  31. public void ConfigureServices(IServiceCollection services)
  32. {
  33. ......
  34. services.AddDbContext<AppDbContext>();
  35. services.AddCap()
  36. .AddEntityFrameworkStores<AppDbContext>()
  37. .AddKafka(x => x.Servers = "localhost:9453");
  38. }
  39. public void Configure(IApplicationBuilder app)
  40. {
  41. .....
  42. app.UseCap();
  43. }
  44. ```
  45. ### 发布
  46. 在 Controller 中注入 `ICapProducerService` 然后使用 `ICapProducerService` 进行消息发送
  47. ```cs
  48. public class PublishController : Controller
  49. {
  50. private readonly ICapProducerService _producer;
  51. public PublishController(ICapProducerService producer)
  52. {
  53. _producer = producer;
  54. }
  55. [Route("~/checkAccount")]
  56. public async Task<IActionResult> PublishMessage()
  57. {
  58. //指定发送的消息头和内容
  59. await _producer.SendAsync("xxx.services.account.check", new Person { Name = "Foo", Age = 11 });
  60. return Ok();
  61. }
  62. }
  63. ```
  64. ### 订阅
  65. **Action Method**
  66. 在Action上添加 Attribute 来订阅相关消息。
  67. 如果你使用的是 Kafak 则使用 `[KafkaTopic()]`, 如果是 RabbitMQ 则使用 `[RabbitMQTopic()]`
  68. ```cs
  69. public class PublishController : Controller
  70. {
  71. private readonly ICapProducerService _producer;
  72. public PublishController(ICapProducerService producer)
  73. {
  74. _producer = producer;
  75. }
  76. [NoAction]
  77. [KafkaTopic("xxx.services.account.check")]
  78. public async Task CheckReceivedMessage(Person person)
  79. {
  80. Console.WriteLine(person.Name);
  81. Console.WriteLine(person.Age);
  82. return Task.CompletedTask;
  83. }
  84. }
  85. ```
  86. **Service Method**
  87. 如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 `IConsumerService`:
  88. ```cs
  89. namespace xxx.Service
  90. {
  91. public interface ISubscriberService
  92. {
  93. public void CheckReceivedMessage(Person person);
  94. }
  95. public class SubscriberService: ISubscriberService, IConsumerService
  96. {
  97. [KafkaTopic("xxx.services.account.check")]
  98. public void CheckReceivedMessage(Person person)
  99. {
  100. }
  101. }
  102. }
  103. ```
  104. 然后在 Startup.cs 中的 `ConfigureServices()` 中注入你的 `ISubscriberService` 类
  105. ```cs
  106. public void ConfigureServices(IServiceCollection services)
  107. {
  108. services.AddTransient<ISubscriberService,SubscriberService>();
  109. }
  110. ```
  111. ## 贡献
  112. 贡献的最简单的方法之一就是是参与讨论和讨论问题(issue)。你也可以通过提交的 Pull Request 代码变更作出贡献。
  113. ### License
  114. MIT