CAP 5.1 版本发布通告 - 你期待的 Redis 来了
前言
今天,我们很高兴宣布 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 的支持,这使得问题大大简化以及获得了配置体验上的提升,下面简单看一下如何使用。
- 新建一个自定义过滤器类,继承
ISubscribeFilter接口
public class MyCapFilter: ISubscribeFilter
{
public void OnSubscribeExecuting(ExecutingContext context)
{
// 订阅方法执行前
}
public void OnSubscribeExecuted(ExecutedContext context)
{
// 订阅方法执行后
}
public void OnSubscribeException(ExceptionContext context)
{
// 订阅方法执行异常
}
}
- 在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 来了的更多相关文章
- 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.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 6.2 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了. 那么,接下来我们具体看一下吧. 总览 可能有些人 ...
- CAP 2.4版本发布,支持版本隔离特性
前言 自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一 ...
随机推荐
- 2021软工-CSDN APP分析
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 提升软件开发能力,提高团队协作能力 这个作业在哪个具体方面 ...
- Ubuntu20.04安装Redis
本文介绍了如何在Ubuntu20.04上安装Redis. 安装Redis sudo apt install redis-server 检查服务的状态 安装完成后可以通过以下命令检查服务的状态 sudo ...
- win10 添加全局快捷键
前言 好久没写博客了,今天水一下 如何在win10 下添加一个全局唤醒的快捷键(打开截图软件) 步骤 win + Q 输入 管理工具 添加快捷方式 这里没有管理员权限,可以直接把创建好的 快捷方式 粘 ...
- HTML5 表单新增元素与属性
1 form 属性和 formaction 属性 本课时讲解在 HTML4 中,表单内的从属元素必须书写在表单内部,而在 HTML5 中,可以把他们书写在页面上任何地方,然后为该元素指定一个 form ...
- 针对中国政府机构的准APT攻击样本Power Shell的ShellCode分析
本文链接网址:http://blog.csdn.net/qq1084283172/article/details/45690529 一.事件回放 网络管理员在服务器上通过网络监控软件检测到,有程序在不 ...
- hdu1978 简单记忆化搜索
题意: How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu4920 矩阵乘法%3
题意: 给你两个矩阵,让你求两矩阵的乘积,然后3取余.矩阵是n*n的,n<=800 思路: 如果什么都不考虑的话,矩阵的乘法是o(n^3)的,800*800*800 = ...
- android apk壳
壳对于有过pc端加解密经验的同学来说并不陌生,android世界中的壳也是相同的存在.看下图(exe = dex): 概念清楚罗,我们就说下:壳最本质的功能就是实现加载器.你看加壳后,系统是先执 ...
- UVA10827球面上的最大和
题意: 最大子矩阵的加强版,就是给你一个n*n的矩阵,每个格子里面都有数字,然后我们在里面选择一个矩阵,使得矩阵中所有数字的和最大,而且这个题目说这个n*n的矩阵的最右边和最左边是相邻的,最 ...
- Win64 驱动内核编程-20.UnHook SSDT
UNHOOK SSDT 要恢复 SSDT,首先要获得 SSDT 各个函数的原始地址,而 SSDT 各个函数的原始地址,自然是存储在内核文件里的.于是,有了以下思路: 1.获得内核里 KiService ...