DotNetCore.CAP 基础应用
目录
1.准备工作
2.创建第一个项目
3.创建第二个项目
4.运行
1.准备工作
1.1 rabbitmq
username:admin
password:admin
port:5672
1.2 mssql
2.创建第一个项目
2.1 创建webapi项目,起名为Cap.Step1.Service如图:
2.2 选择项目位置
2.3 选择框架,由于是windows上,所以不要docker
2.4 添加引用,如图
DotNetCore.CAP 6.1.0
DotNetCore.CAP.Dashboard 3.1.2
DotNetCore.CAP.RabbitMQ 6.1.0
DotNetCore.CAP.SqlServer 5.2.0
2.5 添加Cap的配置文件,MsSqlConnection用于存储业务数据的MsSql数据库,配置如下:
{
"RabbitMQOptions": {
"HostName": "192.168.2.8",
"UserName": "admin",
"Password": "admin",
"Port": 5672
},
"MsSqlConnection": "Server=192.168.2.8;userid=sa;password=china_2020;Database=PtE"
}
2.6 添加服务端口号配置文件,配置如下:
{
"urls": "http://*:5001"
}
2.7 最后配置文件位置如图:
2.8 在Startup中添加 cap的相关配置
services.Configure<RabbitMQOptions>(Configuration.GetSection("RabbitMQOptions"));
string connection = this.Configuration.GetConnectionString("MsSqlConnection");
services.AddCap(x =>
{ //存储消息数据x.UseSqlServer(configure => {configure.ConnectionString = connection;configure.UseSqlServer2008();});//连接RabbitMQRabbitMQOptions rabbitMQ = this.Configuration.GetSection("RabbitMQOptions").Get<RabbitMQOptions>();x.UseRabbitMQ((options) =>{options = rabbitMQ;});x.FailedRetryCount = 10; //失败后重试次数x.FailedRetryInterval = 60; //重试间隔x.FailedThresholdCallback = failed =>{var logger = failed.ServiceProvider.GetService<ILogger<Startup>>();logger.LogError($"MessageType{failed.MessageType} 失败,重试{x.FailedRetryCount}" +$"消息名称:{failed.Message.GetName()}");};});
2.9 添加webapi 名为:Step1Controller
[Route("[controller]")]
[ApiController]
public class Step1Controller : ControllerBase
{private readonly ICapPublisher capPublisher;private readonly IConfiguration configuration;private readonly ILogger<Step1Controller> logger;private string PublishName = "SHKF.Cap.Demo"; //下一步的消息队列Keypublic Step1Controller(ICapPublisher capPublisher, IConfiguration configuration,ILogger<Step1Controller> logger){this.capPublisher = capPublisher;this.configuration = configuration;this.logger = logger;} [HttpGet()]public IActionResult Get(){//业务数据Dictionary<string, string> dicHeader = new Dictionary<string, string>();dicHeader.Add("Teacher", "WangPeng");dicHeader.Add("Student", "Seven");dicHeader.Add("Version", "1.2");using (var connection = new SqlConnection(this.configuration.GetConnectionString("MsSqlConnection"))){ using (var tran = connection.BeginTransaction(this.capPublisher, false)){try{this.capPublisher.Publish(this.PublishName, dicHeader);}catch (Exception ex){this.logger.LogWarning(ex.Message);tran.Rollback();}tran.Commit(); }} this.logger.LogWarning($"This is AdoTransaction Invoke"); return Ok();}}
2.10 加载配置文件
public static void Main(string[] args)
{CreateHostBuilder(args).ConfigureHostConfiguration((configBuilder) => {configBuilder.AddJsonFile("json/host.json", true);configBuilder.AddJsonFile("json/cap.json", true);}).Build().Run();
}
3.11 修改launchSettings文件,删除iis相关内容,同时启动不访问默认页
{ "profiles": { "Cap.Step1.Service": {"commandName": "Project","launchBrowser": false,"launchUrl": "weatherforecast","applicationUrl": "http://localhost:5001","environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Development"}}}
3.创建第二个项目
3.1 创建webapi项目
项目引用, 配置文件, launchSettings文件和第一个项目相同,项目结构如下:
3.2 由于不需要端口,所以把容器改成普通容器:如下图:
public class Program{public static void Main(string[] args){ CreateHostBuilder(args).ConfigureServices(ConfigureServices).ConfigureHostConfiguration((configBuilder) => {configBuilder.AddJsonFile("json/host.json", true);configBuilder.AddJsonFile("json/cap.json", true);}).Build().Run();.Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args);private static void ConfigureServices(HostBuilderContext hostBuilder, IServiceCollection services){IConfiguration Configuration = hostBuilder.Configuration;services.Configure<RabbitMQOptions>(Configuration.GetSection("RabbitMQOptions"));services.AddControllers(); string connection = Configuration.GetConnectionString("MsSqlConnection"); services.AddCap(x =>{// If you are using ADO.NET, choose to add configuration you needed:x.UseSqlServer(configure => {configure.ConnectionString = connection;configure.UseSqlServer2008();});// CAP support RabbitMQ,Kafka,AzureService as the MQ, choose to add configuration you needed:RabbitMQOptions rabbitMQ = Configuration.GetSection("RabbitMQOptions").Get<RabbitMQOptions>();x.UseRabbitMQ((options) =>{options = rabbitMQ;});x.FailedRetryCount = 10;x.FailedRetryInterval = 60;x.FailedThresholdCallback = failed =>{var logger = failed.ServiceProvider.GetService<ILogger<Startup>>();logger.LogError($"MessageType{failed.MessageType} 失败,重试{x.FailedRetryCount}" +$"消息名称:{failed.Message.GetName()}");};});}}
3.4 添加Step2Controller
4.运行
4.1 运行Step1项目,Step2项目
4.2 用postman发送请求
http://localhost:5001/step1
4.3 此时rabbmitmq中会多出交换机,cap.default.router
4.5 同时数据库中会增加两个表:Published,Received,表里会存储每一步的发送数据,和第二步的接收数据,这两个表是自动创建的
DotNetCore.CAP 基础应用相关推荐
- 让DotnetCore.CAP和SignalR接力数据推送
DotnetCore.CAP是一款用于实现数据最终一致性的开源方案,SignalR是微软ASP.NET/ASP.NET Core体系下的实时数据传输解决方案,两种技术看起来没什么交集,但具体的业务让两 ...
- DotNetCore CAP(分布式事务最终一致性)框架
前言 CAP用来处理分布式事务以及提供EventBus的功能,具有轻量级,高性能,易使用等特点. 安装包 Install-package DotNetCore.CAP Install-package ...
- NetCore使用DotNetCore.CAP框架
CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架.它有助于创建可扩展,可靠并且易于更改的微服务系统. 这个项目中使用到SqlServer(数据库方面大同 ...
- DotNetCore.Cap分布式事务实现最终一致性
项目演化过程中,微服务已经遍地开花.一个大项目下几十上百个微服务已经是常态.但衍生出另外一个问题就是跨微服务事务,跨库事务的分布式事务.市面了解过的有2CP.3CP.TCC等等分布式事务解决方案,各有 ...
- 一篇文章读懂什么是CAP(基础入门)
[辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...
- CAP带你轻松玩转ASP.NETCore消息队列
CAP是什么? CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案,是.Net Core Community中的第一个千星项目(目前已经1656 Start),具有轻量级.易使用.高性 ...
- cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
问题还原 引用了 DotNetCore.CAP.MySql MySql.Data.EntityFrameworkCore 在使用MySql相关对象的时候会出现如下冲突,在命名空间加入伪空间名称是不能解 ...
- NCC CAP 6.0 发布 —— 新增支持 OpenTelemetry
前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...
- 分布式事务最终一致性-CAP框架轻松搞定
前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...
最新文章
- java8编译_为什么在Java7中编译而在Java8中编译?
- IBM服务器系统盘更换后检查,IBM服务器更换rootvg故障磁盘操作指南
- linux 普通用户登陆系统su - root的时候报错su: Authentication failure
- oracle 数据库的数据事务的相关概念
- 树上倍增求LCA详解
- 虚拟专题:知识图谱 | 事件图谱的构建、推理与应用
- python + selenium 练习篇 - 定位元素的方法
- [转载] Linux进程状态解析之R、S、D、T、Z、X
- html5qq空间代码作业,免费QQ空间背景代码大全(高手整理)
- 原生JS实现简单打砖块弹球小游戏
- 您选择的分区不支持无损调整容量操作
- 国内外优秀计算机视觉团队汇总(2020)
- mysql主从配置干什么_mysql主从配置之slave_exec_mode=IDEMPOTENT详解
- 《OKR源于英特尔和谷歌的管理利器》阅读总结
- CSS——网易云音乐首页之热门推荐歌单的制作
- 做软件测试工程师真的很容易吗
- EDI会给中小型企业带来哪些帮助?
- tensorflow中的正确率是怎么来的??
- SQL注入之利用DNS获取数据
- 代理服务器、虚拟专用网络、网关