NCC CAP 6.2 版本正式发布

原文:https://www.cnblogs.com/savorboard/p/cap-6-2.html

作者:杨晓东

前言

今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了。

那么,接下来我们具体看一下吧。

d166980c4e2161fbcf65d8a6fa483b34.png

总览

可能有些人还不知道 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 只对英文提供了支持。

在该版本中我们重新提供了对中文的支持,目前可自动根据你的浏览器检测使用的语言并展示。

你也可以在右上方进行手动切换。

b5465e53af8d2433d7240023542ea81e.png
img

感谢 @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 的 集成

  • Chloe Orm 和 CAP 的集成

示例:与 FreeSql 集成

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 集成

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变得越来越好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sysctl.conf工作原理

2019独角兽企业重金招聘Python工程师标准>>> sysctl.conf工作原理 sysctl命令被用于在内核运行时动态地修改内核的运行参数&#xff0c;可用的内核参数在目录/proc/sys中。它包含一些TCP/IP堆栈和虚拟内存系统的高级选项&#xff0c; 这可以让有经验的管理员提高引人…

CDN加速

一、CDN的概念 全称是Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是: 尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输的更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智…

修复删除/var/lib/dpkg目录后,无法使用apt-get命令问题

2019独角兽企业重金招聘Python工程师标准>>> Unfortunately Ive deleted dpkg directory while removing the lock. By mistake I typed rootsam:~$ rm -r /var/lib/dpkgNow when I am trying to install/uninstall packages it shows me following error. E: Could…

动态语言静态化

一、什么是动态语言静态化 将现有PHP等动态语言的逻辑代码生成为静态html文件,用户访问动态脚本重定向到静态html的过程 注 : 对实时性要求不高的页面才适合去做动态语言静态化 二、为什么要静态化 1. 动态脚本通常会做逻辑计算和数据查询,访问量越大,服务器压力越大 2. 访…

WPF-06 样式(Style)

在我们前面介绍资源的时候&#xff0c;我们提到了样式表&#xff0c;如果你之前是做Web开发的&#xff0c;你会发现Style有点类似于Web中的CSS。控件级别样式我们可以在控件级别定义自己的样式&#xff0c;控件级别的样式是优先级最高的<Window x:Class"Example_06.Sel…

构建Squid代理服务器-传统代理、透明代理、反向代理

Squid是Linux系统中最常用的一款开源代理服务软件&#xff0c;主要提供缓存加速和应用层过滤控制的功能&#xff0c;可以很好的实现HTTP、FTP、DNS查询以及SSL等应用的缓存代理。 正向代理&#xff1a;根据实现的方式不同&#xff0c;代理服务可分为传统代理和透明代理。 传统代…

数据库缓存层

一 常见的缓存形式 : 1.文件缓存 (为了避免I/O开销,尽量使用内存缓存) 2.内存缓存 二 为什么要使用缓存 缓存数据是为了让客户端很少甚至不访问数据库服务器进行的数据查询,高并发下,能最大程度降低对数据库服务器的访问压力 一般的数据请求: 用户请求->数据查询->…

仅有50Mb大小的cli即可搞定大厂才能玩的CloudIDE丨SmartIDE

作者&#xff1a;徐磊&#xff0c;开源云原生SmartIDE创始人、LEANOSFT创始人/首席架构师/CEO&#xff0c;微软最有价值专家MVP/微软区域技术总监Regional Director&#xff0c;华为云最有价值专家。从事软件工程咨询服务超过15年时间&#xff0c;为超过200家不同类型的企业提供…

操作Checkbox标签

在前端开发中&#xff0c;少不了对Checkbox的操作。 常用的的方法有2个&#xff1a;.is()和.prop()方法。前者是判断 checkbox的状态&#xff0c;选不是未选。而后者为checkbox设置一个值&#xff0c;可以设置checkbox是true还是false。写个小例子&#xff0c;练习一下&#xf…

memcache在项目中的应用

一 安装memcache 具体流程这篇文章有写到: 点击 链接 二 在项目中应用memcache 为了减轻数据库的查询压力,所以我们把一些不经常变动的数据进行缓存,用户查询时,如果查询的要求是一样的,我们就memcache缓存中读取数据并返回去,如果查询要求变了,我们再到数据库中查询,并将查…

Dapr 证书过期了怎么办? 别慌,有救!

一、背景Dapr 默认证书有效时间是1年&#xff0c;证书过期后就不能执行相关控制面和数据面的交互了&#xff0c;如下图&#xff1a;二、查看证书有效时间通过dapr mtls expiry 看到期时间&#xff0c;具体参见命令https://v1-7.docs.dapr.io/reference/cli/dapr-mtls/dapr-mtls…

js高级程序设计的笔记(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.js中的 null : 如果只意在保存对象的变量还没有真正的保存对象之前&#xff0c;就需要先把该变量保存 null值&#xff0c; null代表空对象的指针 2.函数的参数对象 arguments的理解。 argument对象的length属性 实例 f…

Redis在PHP项目中的应用

一 运行redis服务端 出现上图的图形,就说明redis服务端开启成功,并且开启了密码功能(如果不加载配置文件,连接redis是不需要密码的,这样,会给我们的程序带来很大隐患) 密码的设置: 在redis配置文件中,搜索requirepass ,后面设置密码 比如 : requirepass G506myredis 则表示此…

上汽拒绝HW符合商业逻辑

不久前&#xff0c;上汽董事长陈虹表示“与HW合作自动驾驶是不可接受的。这就好比一家公司为我们提供整体的解决方案&#xff0c;如此一来&#xff0c;它就成了灵魂&#xff0c;而上汽就成了躯体。对于这样的结果&#xff0c;上汽是不能接受的&#xff0c;要把灵魂掌握在自己手…

javac compiling error ( mising package)

javac 编译java源文件时&#xff0c;提示 package does not exist 的错误 Test.java import java.security.MessageDigest; import org.apache.commons.codec.binary.Hex;public class Test{public static void main(String args[]){boolean isAlarmed true;boolean aa isAla…

使用ffmpeg录音

官方教程&#xff1a;http://ffmpeg.org/ffmpeg.html 录音方法&#xff1a; 开始找到了这个方法&#xff0c;但是不行呀&#xff0c;好像是没有这个oss吧。 oss 是linux 下的声音相关的东西&#xff0c;与alsa 一样&#xff0c;不过oss 是商业的&#xff0c; 而/dev/dsp 是oss …

Mysql慢查询日志的使用 和 Mysql的优化

一、生成实验数据 原理&#xff1a;sql 蠕虫复制&#xff08;这种生成数据方式同样适用于数据表中有主键的情况&#xff09;。 insert into comic (name,pen_name,cover) select name,pen_name,cover from comic 二、慢查询日志设置 当语句执行时间较长时&#xff0c;通过日…

thinkphp出现Call to undefined function Think\C() in ... online 313

造成这个问题的原因很多,在这里我只说明我自己遇到之后解决的办法 我将functions.php改成了function.php之后,修改了一些其他无关紧要的东西出现了这个问题,来回排查,各种尝试,最后,将function.php改回functions.php,可以正常运行

WPF效果第一百九十九篇之Gamma曲线

前面效果中分享了模块对比;今天大周末那就再来分享一下最近实现的效果;基于YX^n公式根据不同的系数绘制Gamma曲线效果如下图:1、曲线的话,咱就用最简单的方式绘制一堆点:PathFigure pathFigure new PathFigure(){StartPoint new Point(0, count),};for(double x 0; x < 1…