CAP 2.4版本发布,支持版本隔离特性
前言
自从上次 CAP 2.3 版本发布 以来,已经过去了几个月的时间,这几个月比较忙,所以也没有怎么写博客,趁着2019年到来之际(现在应该是2019年开始的时候),CAP也发布了2018年的最后一个大版本 2.4,在这个版本中,我们引入了一个新的特性,叫做“版本隔离”。
简介
可能有些人还不知道 CAP 是什么,老规矩来一个简介。
CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为EventBus使用,目前已经2岁了,目前已经应用到了很多的公司和项目中,
想对 CAP 更多了解的同学可以看下我的这篇文章。
在 这里 你可以查看到入门文档,在 这里 你可以查看CAP背后的设计原理。
下面我们就来看一下这个新的特性。
版本隔离
不知道你们在实际开发的过程中有没有遇到这种场景。
业务快速迭代,需要向前兼容
由于业务的快速迭代,在各个服务集成的过程中,消息的数据结构并不是固定不变的,有些时候我们为了适应新引入的需求,会添加或者修改一些数据结构。如果你是一套全新的系统这没有什么问题,但是如果你的系统已经部署到生产环境了并且正在服务客户,这就会导致新的功能在上线的时候和旧的数据结构发生不兼容,那么这些改变可能会导致出现严重的问题,要想解决这个问题,只能把消息队列和持久化的消息全部清空,然后才能启动应用程序,这对于生产环境来说显然是致命的。
多个版本的服务端
有些时候,App的服务端需要提供多套接口,来支持不同版本的App,这些不同版本的App相同的接口和服务端交互的数据结构可能是不一样的,所以通常情况下服务端提供不用的路由地址来适配不同版本的App调用。随着容器技术的流行,目前有一种流行的版本隔离方案就是利用容器来提供多套不同环境的服务端,然后网关根据不同的地址来进行路由,我们目前就是这种方案,这种方案的优点是程序不用写多套路由Action来提供多个地址,方便维护。
不同实例,使用相同的持久化表/集合
之前有同学表示,希望多个不同实例的程序可以公用相同的数据库,在 2.4 之前的版本,我们可以通过指定不同的表名来隔离不同实例的数据库表,即在CAP配置的时候通过配置不同的表名前缀来实现。
public void ConfigureServices(IServiceCollection services)
{
services.AddCap(x =>
{
x.UseKafka("");
x.UseMySql(opt =>
{
opt.ConnectionString = "connection string";
opt.TableNamePrefix = "appone"; // 在这里配置不同的实例使用的表名前缀
});
});
}
但是,如果想不同的实例使用相同的数据库表怎么办呢?也许我们可以借助这个新特性来实现。
下面我们就来给版本隔离下个定义吧。
什么是版本隔离呢? 版本隔离就是利用版本特性将消息对象按照版本划分,从而来隔离不同版本的业务或实例。
为了增加这个特性,我们做出了以下改变:
- 数据表新增版本号字段
为了实现版本隔离特性,我们在各个需要持久化的数据库中添加了一个版本号字段,你可以使用下面的脚本来更新你的数据库表。
**MySQL**
ALTER TABLE `cap.published` ADD Version VARCHAR(20) NULL;
ALTER TABLE `cap.received` ADD Version VARCHAR(20) NULL;
**SQL Server**
ALTER TABLE Cap.[Published] ADD Version VARCHAR(20) NULL;
ALTER TABLE Cap.[Received] ADD Version VARCHAR(20) NULL;
**PostgreSQL**
ALTER TABLE cap.published ADD "Version" VARCHAR(20) NULL;
ALTER TABLE cap.received ADD "Version" VARCHAR(20) NULL;
**MongoDb**
db.CapPublishedMessage.update({},{"$set" : {"Version" : "1"}});
db.CapReceivedMessage.update({},{"$set" : {"Version" : "1"}});
- 新的版本配置项
我们在CAP的配置项中新增了一个版本号属性用来配置实例的版本,默认情况如果不进行配置那么会使用 v1 来作为默认值
services.AddCap(x =>
{
...
x.Version="" // 设置版本号,默认值 v1
});
- 新的 Dashboard 显示项
我们在新的Dashboard面消息列表中添加了版本号显示列,以提供对版本隔离特型的支持,你可以在已发送或者已接收的消息列表中查看到版本号这一列。
利用版本隔离特性
那么我们如何利用版本隔离特性来处理前面提到不同场景的问题呢?
针对不同版本的服务端,有了版本隔离特性,你现在只需要在配置的时候配置版本号字段,CAP 将自动在不同的实例中将消息划分为不同的版本,从而可以确保不同版本的消息不会被错误的消费或者发送。
举例来说,App 的服务端具有不同的 Api 版本,这么不同版本的程序部署在不同的 Docker 容器中提供服务,但是 这些 Api 版本可能具有很多,通常情况下,我们会保留2-3个不同的服务端版本已适配不同的客户端版本。那么这个时候有同学可能会问,程序做了不同版本的时候,依赖的那些具有状态的中间件怎么办呢?所以,这就是 CAP 提供版本隔离特性的价值所在了,众所周知 CAP 也算是有状态的了,因为会依赖 MQ 的一些持久化以及数据库表的持久化,利用 CAP 提供的版本隔离特性你就不必去部署多套的消息队列了,是不是非常棒?
CAP 2.4版本发布,支持版本隔离特性的更多相关文章
- CAP 2.3版本发布,支持 MongoDB
前言 经过2个月的调整及测试,CAP 2.3 版本终于发布了,这个版本最大的特性就是对于 MongoDB 的支持,感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR,相信随着博客园的 ...
- OpenStack Juno 版本发布——支持Spark和NFV[转]
作者:郑晨,OpenStack中国社区,转载请注明出处 美国时间2014年10月16日,OpenStack Juno版本正式发布,这是OpenStack开源云计算项目自2010年创立以来的第10个版本 ...
- Java快速开发平台强大的代码生成器,JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布
JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布 此版本为Vue+ElementUI SPA单页面应用版本,提供新一代风格代码生成器模板,采用Vue技术,提供两套精美模板E ...
- CAP 6.0 版本发布通告 - 支持 OpenTelemetry
前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...
- CAP 5.2 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 5.2 版本正式版,在这个版本中,我们主要致力于更好的优化使用体验以及支持新的 Transport,同时在该版本也进行了一些 bug 修复的工作. 自从 5. ...
- 重磅发布:阿里 OpenJDK终于开源啦! 将长期支持版本 Dragonwell
前几天的北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell.作为 Java 全球管理组织 Java Community Process (JC ...
- 重磅发布:阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
原文地址:https://yq.aliyun.com/articles/694603 本文作者:阿里开源 本文来自云栖社区合作伙伴"阿里系统软件技术",了解相关信息可以关注&qu ...
- CAP 2.6 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 2.6 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star. 自从上次 CAP 2.5 版本发布 以来,已经过去了几 ...
- 重磅发布:阿里开源 Open JDK 长期支持版本 Alibaba Dragonwell
3 月 21 日北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell.作为 Java 全球管理组织 Java Community Process ...
随机推荐
- PHP生成腾讯云COS请求签名
目标 使用 PHP 创建 COS 接口所需要的请求签名 步骤 按照官方示例(也许是我笨,我怎么读都觉得官方文档结构费劲,示例细节互相不挨着,容易引起歧义),请求签名应用在需要身份校验的场景,即非公有读 ...
- Linux时间子系统之(三):用户空间接口函数
专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...
- SQL*Loader FAQ
SQL*Loader FAQ: Contents [hide] 1 What is SQL*Loader and what is it used for? 2 How does one use th ...
- fiddler抓包软件的使用--请求头--ajax
User-Agent: FiddlerHost: localhost:49828Content-Length: 0Accept: application/xmlContent-Type: applic ...
- protocol_v2.go
{ return protocol.NewFatalClientErr(nil, "E_INVALID", fmt.Sprintf(&quo ...
- CFile类的open方法中的参数说明
CFile::Open是在MFC里面,打开一个文件的方法. Open函数的原型如下: virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, ...
- CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲
CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲 都是图.. 不足之处,欢迎补充
- (1)STM32使用HAL库操作GPIO
一 初始化GPIO 使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成. 自动生成的HAL库GPIO初始化代码: static void MX_GPIO_Init( ...
- Sublime Text3插件安装(经典)
今天我去听数学建模的培训,感觉很有意思,可是我没有报名(QAQ),没有参加培训的报名,不过幸好没有开始选拔比赛 所以我决定学习数学建模方面的知识,要好好学习了! 希望我未来的学弟学妹们!(不要像我这样 ...
- Twitter分布式自增ID算法snowflake原理解析
以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...