前言

自从上次 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配置的时候通过配置不同的表名前缀来实现。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddCap(x =>
  4. {
  5. x.UseKafka("");
  6. x.UseMySql(opt =>
  7. {
  8. opt.ConnectionString = "connection string";
  9. opt.TableNamePrefix = "appone"; // 在这里配置不同的实例使用的表名前缀
  10. });
  11. });
  12. }

但是,如果想不同的实例使用相同的数据库表怎么办呢?也许我们可以借助这个新特性来实现。

下面我们就来给版本隔离下个定义吧。

什么是版本隔离呢? 版本隔离就是利用版本特性将消息对象按照版本划分,从而来隔离不同版本的业务或实例。

为了增加这个特性,我们做出了以下改变:

  1. 数据表新增版本号字段

为了实现版本隔离特性,我们在各个需要持久化的数据库中添加了一个版本号字段,你可以使用下面的脚本来更新你的数据库表。


  1. **MySQL**
  2. ALTER TABLE `cap.published` ADD Version VARCHAR(20) NULL;
  3. ALTER TABLE `cap.received` ADD Version VARCHAR(20) NULL;
  4. **SQL Server**
  5. ALTER TABLE Cap.[Published] ADD Version VARCHAR(20) NULL;
  6. ALTER TABLE Cap.[Received] ADD Version VARCHAR(20) NULL;
  7. **PostgreSQL**
  8. ALTER TABLE cap.published ADD "Version" VARCHAR(20) NULL;
  9. ALTER TABLE cap.received ADD "Version" VARCHAR(20) NULL;
  10. **MongoDb**
  11. db.CapPublishedMessage.update({},{"$set" : {"Version" : "1"}});
  12. db.CapReceivedMessage.update({},{"$set" : {"Version" : "1"}});
  1. 新的版本配置项

我们在CAP的配置项中新增了一个版本号属性用来配置实例的版本,默认情况如果不进行配置那么会使用 v1 来作为默认值

  1. services.AddCap(x =>
  2. {
  3. ...
  4. x.Version="" // 设置版本号,默认值 v1
  5. });
  1. 新的 Dashboard 显示项

我们在新的Dashboard面消息列表中添加了版本号显示列,以提供对版本隔离特型的支持,你可以在已发送或者已接收的消息列表中查看到版本号这一列。

利用版本隔离特性

那么我们如何利用版本隔离特性来处理前面提到不同场景的问题呢?

针对不同版本的服务端,有了版本隔离特性,你现在只需要在配置的时候配置版本号字段,CAP 将自动在不同的实例中将消息划分为不同的版本,从而可以确保不同版本的消息不会被错误的消费或者发送。

举例来说,App 的服务端具有不同的 Api 版本,这么不同版本的程序部署在不同的 Docker 容器中提供服务,但是 这些 Api 版本可能具有很多,通常情况下,我们会保留2-3个不同的服务端版本已适配不同的客户端版本。那么这个时候有同学可能会问,程序做了不同版本的时候,依赖的那些具有状态的中间件怎么办呢?所以,这就是 CAP 提供版本隔离特性的价值所在了,众所周知 CAP 也算是有状态的了,因为会依赖 MQ 的一些持久化以及数据库表的持久化,利用 CAP 提供的版本隔离特性你就不必去部署多套的消息队列了,是不是非常棒?

CAP 2.4版本发布,支持版本隔离特性的更多相关文章

  1. CAP 2.3版本发布,支持 MongoDB

    前言 经过2个月的调整及测试,CAP 2.3 版本终于发布了,这个版本最大的特性就是对于 MongoDB 的支持,感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR,相信随着博客园的 ...

  2. OpenStack Juno 版本发布——支持Spark和NFV[转]

    作者:郑晨,OpenStack中国社区,转载请注明出处 美国时间2014年10月16日,OpenStack Juno版本正式发布,这是OpenStack开源云计算项目自2010年创立以来的第10个版本 ...

  3. Java快速开发平台强大的代码生成器,JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布

    JEECG 3.7.5 VUE+ElementUI SPA单页面应用版本发布 此版本为Vue+ElementUI SPA单页面应用版本,提供新一代风格代码生成器模板,采用Vue技术,提供两套精美模板E ...

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

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

  5. CAP 5.2 版本发布通告

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

  6. 重磅发布:阿里 OpenJDK终于开源啦! 将长期支持版本 Dragonwell

    前几天的北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell.作为 Java 全球管理组织 Java Community Process (JC ...

  7. 重磅发布:阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell

    原文地址:https://yq.aliyun.com/articles/694603 本文作者:阿里开源  本文来自云栖社区合作伙伴"阿里系统软件技术",了解相关信息可以关注&qu ...

  8. CAP 2.6 版本发布通告

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

  9. 重磅发布:阿里开源 Open JDK 长期支持版本 Alibaba Dragonwell

    3 月 21 日北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell.作为 Java 全球管理组织 Java Community Process ...

随机推荐

  1. SQL Server 2008更改数据库保存路径

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=641 操作环境: WindowsXP 数据库: Microsoft SQL Server 2008 操作步骤: 选中 ...

  2. redis与python交互

    import redis #连接 r=redis.StrictRedis(host="localhost",port=6379,password="sunck" ...

  3. ImageMagick简介、GraphicsMagick、命令行使用示例

    http://elf8848.iteye.com/blog/382528 ImageMagick资料 ------------------------------------------------- ...

  4. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  5. TestNG失败自动截图

    转自:https://www.cnblogs.com/tobecrazy/p/4814813.html

  6. bzoj5342 CTSC2018 Day1T3 青蕈领主

    首先显然的是,题中所给出的n个区间要么互相包含,要么相离,否则一定不合法. 然后我们可以对于直接包含的关系建出一棵树,于是现在的问题就是给n个节点分配权值,使其去掉最后一个点后不存在非平凡(长度大于1 ...

  7. Nginx隐藏index.php和配置vhost

    nginx启动命令 启动:nginx停止:nginx -s stop退出:nginx -s quit重启:nginx -s reopen重新加载:nginx -s reload平滑启动:kill -H ...

  8. Ubuntu配置tomcat9

    buntu 安装jdk:[链接] Ubuntu安装eclipse:[链接] Ubuntu下安装MySQL与mysql workbench:[链接] Ubuntu配置tomcat9:[链接] Ubunt ...

  9. ReentrantLock之公平锁源码分析

    本文分析的ReentrantLock所对应的Java版本为JDK8. 在阅读本文前,读者应该知道什么是CAS.自旋. 本文大纲 1.ReentrantLock公平锁简介 2.AQS 3.lock方法 ...

  10. 响应式编程知多少 | Rx.NET 了解下

    1. 引言 An API for asynchronous programming with observable streams. ReactiveX is a combination of the ...