首页 > 其他分享 >CAP 6.2 版本发布通告

CAP 6.2 版本发布通告

时间:2022-09-19 16:33:41浏览次数:81  
标签:修复 通告 CAP 6.2 版本 override new public

前言

今天,我们很高兴宣布 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 的 集成
  • Chloe Orm 和 CAP 的集成

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

标签:修复,通告,CAP,6.2,版本,override,new,public
From: https://www.cnblogs.com/savorboard/p/cap-6-2.html

相关文章

  • CAPL编程语言快速入门
    前言  提到CAPL,相信各位一定不陌生,它是由Vector公司开发的类似于C语言的面向过程编程语言,是CANoe和CANalyzer中可用的编程语言。CAPL中程序块的执行由事件控制,在专用......
  • 16.1json模块 16.2文件上传 16.3session的高级用法
    16.1json模块#json主要是干嘛的?json非常严格的数据类型,只能用“”,不然会报错,只支持""#把一个东西变成序列#[1,2,3,4,5]#有序的叫序列#{"a",'b'}#散列#importjson......
  • Oracle中ESCAPE关键字用法
    select*fromhdrg.qcs_dict_item_ruleswhererule_codelike'rule/_m%'escape'/';注释:此处like后面的_下划线并不是占位符的意思,而是他原本下划线的意思。补......
  • 【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    转载https://www.bilibili.com/video/BV1dS4y1u7vN?p=30&vd_source=64f1a4c05d797eb3cca1ef771fd46c22环境环境版本windows10QT6.2.4QtCreator8.0......
  • TCP Previous segment not captured TCP Out-Of-Order TCP Dup ACK
    317276 1540.1003445.6.7.81.2.3.4TCP1095  [TCPPrevioussegmentnotcaptured]12345→65423[PSH,ACK]Seq=127798Ack=8060Win=38912Len=1041[TCPs......
  • 共识算法 CAP BASE
    共识算法(ConsensusAlgorithm)共识算法是用来保证分布式系统一致性的方法。它能保证所有节点的数据相同并且一个节点发起的提案可以被其他节点同意。根据解决的场景是否......
  • centos7 安装python-libpcap
    1.安装依赖yuminstalllibpcaplibpcap-devel2.安装python依赖(python3.6以上版本)$pip3installCython$pip3installpython-libpca3.验证在python命令行......
  • PostgreSQL 9.6.0更新补丁到9.6.24
    背景  生产环境安扫,PostgreSQL数据库扫出来一堆漏洞。目前我们线上PostgreSQL数据库版本大部分是9.6.0,PostgreSQL官方9.6最新补丁是9.6.24。升级步骤下载PostgreSQL9......
  • 【Qt6.2.4】qml 实现登录注册及显示详情demo
    参考https://www.bilibili.com/video/BV1dS4y1u7vN?spm_id_from=333.999.0.0(很棒的教程)环境环境版本windows10QT6.2.4QtCreator8.0.1(Community......
  • D_06 DotnetCore.CAP在项目中的应用
    描述在项目中,DotnetCore.CAP可以作为分布式事务、消息队列的解决方案,详见官方文档:https://cap.dotnetcore.xyz/,此处不过多的讲解。本文主要讲解官方文档没有说明,但是在实......