前言

今天,我们很高兴宣布 CAP 发布 5.1 版本正式版,在这个版本里我们同样引入了更多令人激动的新特性和改进,同时也得到越来越多人的喜爱。

得益于社区的反馈和贡献者的支持,在过去的两个月里,我们NuGet的下载量增加了20万,贡献者团队达到了57人,同时我们也发现了非常多的国外贡献者的参与,这说明 CAP 在海外的用户也正在迅速增长,在此我表示非常的感谢。

在 5.1 版本中,我们带来了大家期待已久的 Filter 功能,以及对 Redis Streams 的支持,同时我们重写了 Dashboard,下面我们就具体来看一下吧。

总览

可能有些人还不知道 CAP 是什么,老规矩来一个简介。

CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为 EventBus 使用,该项目诞生于2016年,目前在 Github 已经有超过 4800 Star 以及超过 95万 的下载量,已经在越来越多公司的和项目中得到应用。

如果你想对 CAP 更多了解,请查看我们的 官方文档

本次在 CAP 5.1 版本中我们主要带来了以下新特性:

  • 增加了对订阅者 Filter 的支持
  • 增加了对 Redis Streams Transport 的支持
  • 改进 新版基于 Vue 的 Dashboard
  • 改进 Kafka Transport 对通配符的订阅的支持
  • 改进 RabbitMQ 对异构系统的支持
  • 其他功能改进和若干 Bug 修复

增加了对订阅者 Filter 的支持

根据社区得到的反馈,在一些场景下需要对订阅者方法应用一些 AOP 拦截功能以达到某种目的,例如记录日志或自动开启事务等功能。

在过去,我们通过对第三方 AOP 组件提供支持来做到这一点,例如我们写了一篇 博客 来描述如何在 CAP 5.0版本中使用 Castle 来对订阅方法进行拦截,这使我们得到了一些赞扬。但同时我们也发现了这种方式存在一些缺点,例如无法方便的在代理类中进行构造函数注入以及方法需要设定为 virtual 另外还有拦截器生命周期控制等问题。

基于以上原因,现在 CAP 直接提供了对订阅者 Filter 的支持,这使得问题大大简化以及获得了配置体验上的提升,下面简单看一下如何使用。

  1. 新建一个自定义过滤器类,继承 ISubscribeFilter 接口
public class MyCapFilter: ISubscribeFilter
{
public void OnSubscribeExecuting(ExecutingContext context)
{
// 订阅方法执行前
} public void OnSubscribeExecuted(ExecutedContext context)
{
// 订阅方法执行后
} public void OnSubscribeException(ExceptionContext context)
{
// 订阅方法执行异常
}
}
  1. 在CAP配置中添加上面的自定义过滤器类
services.AddCap(opt =>
{
// ***
}.AddSubscribeFilter<MyCapFilter>();

以上就是全部的集成工作,是不是变得非常容易。

增加了对 Redis Streams Transport 的支持

首先感谢来自埃及的 Mahmoud Samir 对此功能提供的 PR 支持。

我们知道,根据可用性原则,你的系统依赖的组件数量越少,那么整体出现问题的概率就越低,你越能够对其进行控制。 那么这也是我们此次考虑对引入 Redis 的考虑之一,对于小型系统来说引入额外的中间件会增加复杂性,很多用户并不愿意。

那么,为什么我们在过去没有对Redis支持呢? 这主要是一段时间以来,Redis 发布/订阅模式的功能有限,也就是 pub/sub 无法满足需求,该功能的典型缺点是没有一种确认(Acknowledge)机制来保证消息是被送达的。

Stream 是 Redis 5.0 引入的一种新的数据类型,它以一种更抽象的方式建模日志数据结构。 除了提供确认功能外,还提供了我们所需的 Consumer Groups 功能,所以我们将其放到了我们的支持列表中。

集成方式:

PM> Install-Package DotNetCore.CAP.RedisStreams

services.AddCap(x =>
{
// ...
x.UseRedis(...);
});

新版基于 Vue 的 Dashboard

在这个版本中,我们对我们的Dashboard进行了更换,熟悉 hangfire的同学可能知道CAP的dashboard最初来自于改写的hangfire ui,这主要是由于在 .NET Core的早期阶段没有一种合适的方式来将 Razor 页面嵌入到 (DLL) NuGet 包中,Hangfire采用了一种将 Razor页面生成为 C# 代码并且编译到程序集中的方式来解决这一问题,这主要利用到了一款第三方 Visual Studio 扩展工具,但该工具自2019年以来已经没有继续更新。

另外的原因是由于 Dashbaord 目前的生成方式不利于对代码进行维护,有时会出现莫名其妙的编译问题,而且需要安装VS扩展工具,这让我们的贡献者参与其中变得沮丧。

在新版本重写开始之前,我们调研了 Blazor 的方案,但最终没有采纳。 这是由于 Blazor 集成需要额外配置的东西太多而且较为分散,很难提供一种非常简便的配置方式,这对于CAP作为一个库来说不是非常合适。在此感谢 BootstrapBlazor 的作者张同学对此提供的支持和建议。

所以,我们最终选择了使用 Vue 来重写我们的 Dashboard ,但这对于我来说这是一项较为挑战的工作,因为我从没写过前端代码,最终花了一周左右的时间完成了整个工作,ps: 代码可能较为粗糙,前端好的同学欢迎提交 PR 重构。

样例图:

Transport 中的改动

改进 Kafka 对通配符的订阅的支持

过去只有 RabbitMQ 支持此功能,那么现在在 Kafka 订阅方法中,你也可以使用 *# 通配符来进行批量订阅。

* 可以代替一个或多个词

# 可以代替零或多个词

看图理解(图片来源RabbitMQ 官网):

在这个例子中,我们将发送所有描述动物的消息。消息将使用由三个词(两个点)组成的路由名称发送。名称中的第一个词将描述 敏捷(celerity),第二个词描述颜色(colour),第三个词描述物种(species):“ .. ”。

我们创建了三个绑定:Q1 与绑定键“ .orange. ”绑定,Q2 与“ ..rabbit ”和“ lazy.# ”绑定。

这些绑定可以总结为:

Q1 对所有橙色动物都感兴趣。

Q2 想收听关于兔子的一切,以及关于懒惰动物的一切。

改进 RabbitMQ 对异构系统的支持

由于CAP处理消息需要有一些固定的信息,如果发送过来的消息没有携带这些信息,那么就会报错。然而如果你的上游不使用CAP,或者需要其他系统进行对接,那么怎么办呢?

在这个版本中,我们对 RabbitMQ 增加了 CustomHeaders 配置项,你可以使用这个配置对必须的头信息进行填充,用法如下:

cap.UseRabbitMQ(x =>
{
x.HostName = "xxxx";
x.UserName = "xxxx";
x.Password = "xxxx";
x.CustomHeaders = e => new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>(Headers.MessageId, SnowflakeId.Default().NextId().ToString()),
new KeyValuePair<string, string>(Headers.MessageName, e.RoutingKey),
};
});

其他

其他的一些改进项目包括:

1、我们将所有的 nuget 的依赖包都升级到了最新版本。

2、修复了一些已知的Bug,你可以在这里看到。

总结

以上,就是本版本中支持的一些新特性,感谢大家的支持,我们很开心能够帮助到大家

。大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。

如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

如果你对 .NET Core 有兴趣的话可以关注我,我会定期的在博客分享我的学习心得。


本文地址:http://www.cnblogs.com/savorboard/p/cap-5-1.html

作者博客:Savorboard

本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本

CAP 5.1 版本发布通告 - 你期待的 Redis 来了的更多相关文章

  1. CAP 2.6 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 2.6 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star. 自从上次 CAP 2.5 版本发布 以来,已经过去了几 ...

  2. CAP 3.0 版本发布通告

    前言 大家好,我们很高兴宣布 CAP 发布了 3.0 版本正式版. 自从上次 CAP 2.6 版本发布 以来,已经过去了几个月的时间,关注的朋友可能知道,在这几个月的时间里,也发布了几个预览版的 3. ...

  3. CAP 3.1 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...

  4. CAP 5.0 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 5.0 版本正式版.同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行. 在 5.0 版本中,我们主要致力于更好的支持 .NET 5 以 ...

  5. CAP 5.2 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 5.2 版本正式版,在这个版本中,我们主要致力于更好的优化使用体验以及支持新的 Transport,同时在该版本也进行了一些 bug 修复的工作. 自从 5. ...

  6. CAP 6.0 版本发布通告 - 支持 OpenTelemetry

    前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...

  7. CAP 6.1 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性. 那么,接下来我们具体看一下吧. 总览 可能有些人还不知 ...

  8. CAP 6.2 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了. 那么,接下来我们具体看一下吧. 总览 可能有些人 ...

  9. CAP 2.4版本发布,支持版本隔离特性

    前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...

随机推荐

  1. 二. 简单初步认识SpringCloud

    (一)微服务的实现方式很多,但是最火的莫过于Spring Cloud了.为什么? 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大. 技术强:Spring作为Java领域 ...

  2. Selenium3自动化测试【15】元素定位之Class、Name

    @ 目录 1.name定位 2.class定位 1.name定位 通过name定位是另外一种常用的定位元素的方式. 当一个元素存在name属性时,可以使用name定位,依旧以Bing搜索框为例(nam ...

  3. [源码分析] 并行分布式任务队列 Celery 之 Timer & Heartbeat

    [源码分析] 并行分布式任务队列 Celery 之 Timer & Heartbeat 目录 [源码分析] 并行分布式任务队列 Celery 之 Timer & Heartbeat 0 ...

  4. hdu4772 水模拟

    题意:       给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次. 思路:       水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就 ...

  5. hdu4717 三分(散点的移动)

    题意:      给你一些点,这些点有各自的初始位置,移动速度和方向,问你什么时候任意两点中最长的距离最小,求时刻和此时的距离.. 思路:      感觉题目很赞,一开始想不到三分,因为么有办法证明他 ...

  6. Linux中环境变量的设置

    目录 环境变量 Shell定义的环境变量 查看环境变量 Linux下环境变量的设置 环境变量 在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软 ...

  7. Bettercap2.X版本的使用

    目录 Bettercap 安装 ARP欺骗 DNS 欺骗 注入脚本 结合Beef-XSS 替换下载文件 Bettercap 很多人应该都听过或者用过Ettercap,这是Kali下一款优秀的ARP欺骗 ...

  8. windows-DLL注入

    DLL注入     刚刚整理的代码注入(远程线程注入)现在整理这个DLL注入,DLL注入比较常用,相比远程代码注入DLL注入没有什么太多的限制,而且实现起来比较简单,当然远程线程需要注意的问题DLL很 ...

  9. Root mapping definition has unsupported parameters

    使用ElasticSearch创建映射报错 Root mapping definition has unsupported parameters 原因 使用的ES版本为7.2.0,不再支持创建指定类型 ...

  10. PHP中ftp的连接与操作

    1.操作类 <?phpclass FtpService{ protected $connect = 0; public function __construct() { $this->co ...