CAP 6.2 版本发布通告
前言
今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了。
那么,接下来我们具体看一下吧。
总览
可能有些人还不知道 CAP 是什么,老规矩来一个简介。
CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为 EventBus 使用,该项目诞生于2016年,目前在 Github 已经有超过 5500+ Star 和 70+ 贡献者,以及在 NuGet超 250 万的下载量,并在越来越多公司的和项目中得到应用。
如果你想对 CAP 更多了解,请查看我们的 官方文档。
本次在 CAP 6.2 版本中我们主要带来了以下新特性:
- Dashboard 添加中文支持
- 事务对象更友好的对接第三方ORM
- 消费执行消息头记录 InstanceId
- 启动时对位于相同组的订阅者进行警告
- BUG 修复
- Snowflake Id 算法生成时排除虚拟,回环和禁用的网卡
- 修复 RabbitMQ 丢失连接并快速恢复时的健康检测Bug。
- 修复 Dashboard 代理查询缺失 QueryString 的问题。
- 修复 MongoDB 查询元素未注册不返回结果的Bug。
- 修复 Scoped 生命周期工厂模式注册的订阅者报错的Bug。
Dashboard 添加中文支持
我们在 5.1.1 版本中使用 Vue 重构了我们的 Dashboard,由于时间原因,我们的新版本的 Dashboard 只对英文提供了支持。
在该版本中我们重新提供了对中文的支持,目前可自动根据你的浏览器检测使用的语言并展示。
你也可以在右上方进行手动切换。

感谢 @tetris1128 对此提交的PR!
事务对接第三方 ORM 更加友好
在 CAP 中,事务对象需要交给 CAP 进行提交从而在事务实现提交后对缓存消息到 Broker 的 Flush 动作,而目前的Orm大部分都有自己的事务管理对象进行事务的提交。CAP官方直接原生支持使用 ADO.NET 和 EntityFrameworkCore 进行事务集成,而对于第三方ORM则需要自行扩展。
在本版本中,我们做了一个小调整(将 CapTransactionBase 中的 DbTransaction 设置为了 Virtual),没想到这个小调整让我们对第三方ORM的兼容性得到了大大增强,现在第三方ORM可以更加友好的对接CAP。
以下是2个第三方ORM的集成示例:
FreeSql Repository+UnitOfWork 事务模式 和 CAP 的 集成示例如下:
public class FreeSqlRepositoryPatternTransaction : CapTransactionBase
{
public FreeSqlRepositoryPatternTransaction(IDispatcher dispatcher, IUnitOfWork uow) : base(dispatcher)
{
Uow = uow;
}
public IUnitOfWork Uow { get; }
public override object? DbTransaction => Uow.GetOrBeginTransaction();
public override void Commit()
{
Uow.Commit();
Flush();
}
public override Task CommitAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public override void Rollback()
{
Uow.Rollback();
}
public override Task RollbackAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public override void Dispose()
{
Uow.Dispose();
}
}
public static class Extensions
{
// 注意:你可以酌情修改此扩展以支持你的使用习惯
public static ICapTransaction BeginTransaction(this IFreeSql freeSql,
ICapPublisher publisher, out IRepositoryUnitOfWork uow, bool autoCommit = false)
{
var dispatcher = publisher.ServiceProvider.GetRequiredService<IDispatcher>();
uow = freeSql.CreateUnitOfWork();
var transaction = new FreeSqlRepositoryPatternTransaction(dispatcher, uow)
{
AutoCommit = autoCommit
};
return publisher.Transaction.Value = transaction;
}
}
使用发送带有事务的消息。
[Route("~/with/test")]
public IActionResult WithTransaction()
{
using (var transaction = _freeSql.BeginTransaction(_capBus, out var uow, false))
{
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
var person = _freeSql.GetRepository<Person2>();
person.UnitOfWork = uow;
person.Insert(new Person2() { Name = "HelloWorld2" });
transaction.Commit();
}
return Ok();
}
你可以在这里查看到 FreeSql DbContext 事务模式的对接方式。
Chloe Orm 和 CAP 进行集成如下:
public class ChloeTransaction : CapTransactionBase
{
public ChloeTransaction(IDispatcher dispatcher, IDbSession session) : base(dispatcher)
{
DbSession = session;
}
public IDbSession DbSession { get; set; }
public override object? DbTransaction => DbSession.CurrentTransaction;
public override void Commit()
{
DbSession.CommitTransaction();
Flush();
}
public override Task CommitAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public override void Rollback()
{
DbSession.RollbackTransaction();
}
public override Task RollbackAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
public override void Dispose()
{
(DbTransaction as IDisposable)?.Dispose();
}
}
public static class Extensions
{
public static ICapTransaction BeginTransaction(this IDbContext dbContext,
ICapPublisher publisher, bool autoCommit = false)
{
var dispatcher = publisher.ServiceProvider.GetRequiredService<IDispatcher>();
dbContext.Session.BeginTransaction();
var transaction = new ChloeTransaction(dispatcher,dbContext.Session)
{
AutoCommit = autoCommit
};
return publisher.Transaction.Value = transaction;
}
}
发送带有事务的消息:
[Route("~/with/test")]
public IActionResult WithTransaction()
{
using (_dbContext.BeginTransaction(_capBus, true))
{
_dbContext.Insert(new Person2() { Name = "HelloWorld" });
_capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);
}
return Ok();
}
相关链接:
https://github.com/shuxinqin/Chloe/issues/328
消费执行消息头记录 InstanceId
某天的一个下午,我的同事告诉我他在使用CAP进行本地的消息调试的时候,消息已经被消费执行了,而且状态也变成成功了,但是没进他的VS断点,他又说有时候又会进断点,他不知道怎么回事,于是就把我叫过去了。
我过去看了一下,发现开发服务器上也部署的有应用,并且使用的同一个RabbitMQ,他的消息被线上部署的其他实例给消费掉了,所以没进断点。之所以有时候又进断点则是因为消息是负载消费的,恰好又轮到了他本地。
基于以上原因,在这个版本中,我们在消费的消息头中记录了执行所在的 InstanceId,也就是机器的 Hostname,这样在查看消息就很方便的知道消息是被哪个实例给消费掉了,便于排查问题。
启动时对位于相同组的订阅者进行警告
某天的一个下午,我的同事又找到了我,说他在使用CAP进行消费的时候,调试的VS断点一直不进和上次不一样的是这次始终进不了,但是消息又消费成功了,他找了半天也不知道怎么回事,于是就把我又叫过去了。
我过去看了一下,他没有犯和上次一样的错误。于是我检查了一下,发现他在一个服务中弄了2个名称一样的订阅者,并且使用的默认组。 由于2个订阅者位于不同的类中,所以他没有发现。 熟悉CAP的都知道,CAP 在启动的时候由于进行了去重处理,所以只会使用其中的一个订阅者,对于另外一个会忽略掉。
基于以上原因,在这个版本中,我们在启动的时候进行了检测,如果发现在一个组中有2个以上的同名订阅者,我们会进行警告日志的打印进行提醒,但不会抛出异常来阻止你的启动。
BUG 修复
在这个版本中,我们进行了一些已发现的BUG修复,下面是修复的内容项。
- Snowflake Id 算法生成时排除虚拟,回环和禁用的网卡
- 修复 RabbitMQ 丢失连接并快速恢复时的健康检测Bug。
- 修复 Dashboard 代理查询缺失 QueryString 的问题。
- 修复 MongoDB 查询元素未注册不返回结果的Bug。
- 修复 Scoped 生命周期工厂模式注册的订阅者报错的Bug。
总结
以上,就是本版本我们做出的一些支持和改动,感谢大家的支持,我们很开心能够帮助到大家 。大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。
如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
本文地址:http://www.cnblogs.com/savorboard/p/cap-6-2.html
作者博客:Savorboard
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
CAP 6.2 版本发布通告的更多相关文章
- CAP 2.6 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 2.6 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star. 自从上次 CAP 2.5 版本发布 以来,已经过去了几 ...
- CAP 3.0 版本发布通告
前言 大家好,我们很高兴宣布 CAP 发布了 3.0 版本正式版. 自从上次 CAP 2.6 版本发布 以来,已经过去了几个月的时间,关注的朋友可能知道,在这几个月的时间里,也发布了几个预览版的 3. ...
- CAP 3.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...
- CAP 5.0 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 5.0 版本正式版.同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行. 在 5.0 版本中,我们主要致力于更好的支持 .NET 5 以 ...
- CAP 5.1 版本发布通告 - 你期待的 Redis 来了
前言 今天,我们很高兴宣布 CAP 发布 5.1 版本正式版,在这个版本里我们同样引入了更多令人激动的新特性和改进,同时也得到越来越多人的喜爱. 得益于社区的反馈和贡献者的支持,在过去的两个月里,我们 ...
- CAP 5.2 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 5.2 版本正式版,在这个版本中,我们主要致力于更好的优化使用体验以及支持新的 Transport,同时在该版本也进行了一些 bug 修复的工作. 自从 5. ...
- CAP 6.0 版本发布通告 - 支持 OpenTelemetry
前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...
- CAP 6.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性. 那么,接下来我们具体看一下吧. 总览 可能有些人还不知 ...
- CAP 2.4版本发布,支持版本隔离特性
前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...
随机推荐
- Identity Server 4客户端认证控制访问API
项目源码: 链接:https://pan.baidu.com/s/1H3Y0ct8xgfVkgq4XsniqFA 提取码:nzl3 一.说明 我们将定义一个api和要访问它的客户端,客户端将在iden ...
- Selenium指定浏览器路径
ChromeOptions options = new ChromeOptions(); options.setBinary("C:\\Program Files (x86)\\Google ...
- day03 对象流与序列化
对象流 java.io.ObjectOutputStream和ObjectInputSteam 对象流是一对高级流,在流连接中的作用是进行对象的序列化与反序列化. 对象序列化:将一个java对象按照其 ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- 一张图进阶 RocketMQ - 消息存储
前言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢迎围观 ...
- 向docker镜像中传递变量的两种方式
测试用到的python文件: #!/usr/bin/env python3 #conding: utf-8 from http.server import HTTPServer, BaseHTTPRe ...
- CSS 导航栏底线向两边延伸动画
利用元素向左移动的同时,宽度变长,实现两边延伸效果. react代码: <ul className="tab"> { moduleList.map((item: any ...
- 如何让照片中的人物笑起来?HMS Core视频编辑服务一键微笑功能,让人物笑容更自然
最近一键"露齿笑"席卷全网,无论是短视频用户还是社交App用户都在使用这项黑科技.当三两好友聚会拍集体照留念时,为了处理个别人的表情"瑕疵",让大家都尽量保持微 ...
- Dubbo源码(五) - 服务目录
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 今天,来聊聊Dubbo的服务目录(Directory).下面是官方文档对服务目录的定义: 服务目 ...
- Vue3 computed && watch(watchEffect)
1 # Vue3 计算属性与监视 2 # 1.computed函数:与Vue2.x中的computed配置功能一致 3 inport {ref,computed,watch} from 'vue'; ...